91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux驅動開發-編寫W25Q64(Flash)驅動

DS小龍哥-嵌入式技術 ? 2022-09-17 15:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【摘要】 本篇文章就介紹如何在Linux系統下編寫W25Q64芯片的驅動,完成數據存儲,W25Q64支持標準SPI總線,當前驅動程序底層的代碼寫了兩種方式,一種是采用內核提供的SPI子系統框架,一種直接采用軟件模擬SPI時序的方式驅動,具體代碼在第3章貼出來了。

1. W25QXX介紹

W25Q64是一顆SPI接口的Flash存儲芯片,是華邦W25QXX系列里的一個具體型號,這個系列里包含了W25Q16,W25Q32,W25Q64,W5Q128等等。編程代碼邏輯都差不多,主要是容量的區別。

本篇文章就介紹如何在Linux系統下編寫W25Q64芯片的驅動,完成數據存儲,W25Q64支持標準SPI總線,當前驅動程序底層的代碼寫了兩種方式,一種是采用內核提供的SPI子系統框架,一種直接采用軟件模擬SPI時序的方式驅動,具體代碼在第3章貼出來了。

下面是來至W25Qxx中文手冊的介紹

W25Q64 (64M-bit), W25Q16(16M-bit)和 W25Q32(32M-bit)是為系統提供一個最小的空間、引腳和功耗的存儲器解決方案的串行 Flash 存儲器。 25Q 系列比普通的串行 Flash 存儲器更靈活,性能更優越。基于雙倍/四倍的 SPI,它們能夠可以立即完成提供數據給 RAM, 包括存儲聲音、文本和數據。芯片支持的工作電壓 2.7V 到 3.6V,正常工作時電流小于 5mA,掉電時低于 1uA。所有芯片提供標準的封裝。

W25Q64/16/32 由每頁 256 字節組成。 每頁的 256 字節用一次頁編程指令即可完成。 每次可以擦除 16 頁(1 個扇區)、 128 頁(32KB 塊)、 256 頁(64KB 塊)和全片擦除。W25Q64 的內存空間結構: 一頁 256 字節, 4K(4096 字節)為一個扇區, 16 個扇區為 1 塊, 容量為 8M 字節,共有 128 個塊,2048 個扇區。W25Q64/16/32 支持標準串行外圍接口(SPI),和高速的雙倍/四倍輸出,雙倍/四倍用的引腳:串行時鐘、片選端、串行數據 I/O0(DI)、 I/O1(DO)、 I/O2(WP)和 I/O3(HOLD)。 SPI 最高支持 80MHz,當用快讀雙倍/四倍指令時,相當于雙倍輸出時最高速率 160MHz,四倍輸出時最高速率 320MHz。這個傳輸速率比得上 8 位和 16 位的并行 Flash 存儲器。HOLD 引腳和寫保護引腳可編程寫保護。此外,芯片支持 JEDEC 標準,具有唯一的 64 位識別序列號。

●SPI 串行存儲器系列
-W25Q64:64M 位/8M 字節
-W25Q16:16M 位/2M 字節
-W25Q32:32M 位/4M 字節
-每256字節可編程頁

2. 硬件環境

當前測試使用的開發板采用友善之臂的Tiny4412開發板,芯片是三星的EXYNOS-4412,最高主頻1.5GHZ。

開發板引出了SPI的IO口,這里使用的W25Q64是外置的模塊,使用杜邦線與開發板的IO口連接。

開發板上引出的IO口都是5V和1.8V,為了方便供電,采用了一個USB轉TTL模塊提供電源,測試驅動。

W25Q64模塊接在開發板的SPI0接口上面的。

image-20220106103405322

Linux內核自帶有SPI子系統的設備端示例代碼:

Linux 內核自帶的 SPI 驅動注冊示例代碼: \drivers\spi\spidev.c
Linux 內核自帶的 SPI APP 注冊示例代碼: \Documentation\spi

如果要使用內核自帶SPI驅動,可以在內核編譯時配置一下。

root# make menuconfig
Device Drivers  --->  
[*] SPI support  --->  
<*>   Samsung S3C64XX series type SPI                                          
	  [*]     Samsung S3C64XX Channel 0 Support.

Tiny4412自帶內核里的SPI設備端結構:

image-20220106103638018

?

SPI0的具體GPIO口位置:

image-20220106103712723

3. 案例代碼

3.1 模擬SPI時序-編寫驅動

下面是W25Q64的驅動測試代碼,沒有注冊字符設備框架,只是在驅動的入口里測試時序是否OK,打印了ID,讀寫了數據進行測試。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*--------------------------------W25Q64相關操作代碼---------------------------------------------*/
/*定義指針,用于接收虛擬地址*/
volatile unsigned int *W25Q64_GPBCON;
volatile unsigned int *W25Q64_GPBDAT;
/*
函數功能:W25Q64初始化
Tiny4412硬件連接:
	DO--MISO :GPB_2 //輸入模式
	DI--MOSI :GPB_3 //輸出模式
	CLK-SCLK :GPB_0 //時鐘
	CS--CS   :GPB_1 //片選
*/
void W25Q64_Init(void)
{
	/*1. 初始化GPIO*/
	/*映射物理地址*/
	W25Q64_GPBCON=ioremap(0x11400040,4);
	W25Q64_GPBDAT=ioremap(0x11400044,4);
	
	*W25Q64_GPBCON &= ~(0xf  << 0 * 4);*W25Q64_GPBCON |=  (0x1   << 0 * 4);
	*W25Q64_GPBCON &= ~(0xf  << 1 * 4);*W25Q64_GPBCON |=  (0x1   << 1 * 4);
	*W25Q64_GPBCON &= ~(0xf  << 2 * 4);
	*W25Q64_GPBCON &= ~(0xf  << 3 * 4);*W25Q64_GPBCON |=  (0x1   << 3 * 4);
	
	/*2. 上拉GPIO口*/
	//*W25Q64_GPBDAT &= ~(1 << 4);//輸出0
	*W25Q64_GPBDAT |= (1 << 0);   //輸出1
	*W25Q64_GPBDAT |= (1 << 1);   //輸出1
	*W25Q64_GPBDAT |= (1 << 3);   //輸出1
}
/*
函數功能:SPI時序讀寫一個字節
說    明:SPI底層時序,程序的移植接口
*/
u8 W25Q64_SPI_ReadWriteOneByte(u8 data_tx)
{
	 u8 data_rx=0;
	 u8 i;
	 for(i=0;i<8;i++)
	 {
		*W25Q64_GPBDAT &= ~(1 << 0);//輸出0
		if(data_tx&0x80)*W25Q64_GPBDAT |= (1 << 3);   //輸出1
		else *W25Q64_GPBDAT &= ~(1 << 3);//輸出0
		data_tx<<=1; //繼續發送下一個數據

		*W25Q64_GPBDAT |= (1 << 0);   //輸出1
		data_rx<<=1;
		if((*W25Q64_GPBDAT & (1 << 2)))data_rx|=0x01;
	 }
	 return data_rx;
}

/*
函數功能:寫使能
*/
void  W25Q64_WriteEnabled(void)
{
	*W25Q64_GPBDAT &= ~(1 << 1); //選中W25Q64
	W25Q64_SPI_ReadWriteOneByte(0x06);
	*W25Q64_GPBDAT |= (1 << 1); //取消選中W25Q64
}
/*
函數功能:讀狀態
*/
void W25Q64_GetBusyStat(void)
{
	unsigned char stat=1;
	while(stat&0x01)  //判斷狀態最低位
	{
		*W25Q64_GPBDAT &= ~(1 << 1);
		W25Q64_SPI_ReadWriteOneByte(0x05);
		stat=W25Q64_SPI_ReadWriteOneByte(0xFF);  //讀取狀態寄存器的值
		*W25Q64_GPBDAT |= (1 << 1);
	}
}
/*
函數功能:讀取設備ID和制造商ID
W25Q64: EF16
W25QQ128:EF17
*/
unsigned short W25Q64_ReadDeviceID(void)
{
	unsigned short ID;
	*W25Q64_GPBDAT &= ~(1 << 1);
	W25Q64_SPI_ReadWriteOneByte(0x90);
	W25Q64_SPI_ReadWriteOneByte(0x0); 
	W25Q64_SPI_ReadWriteOneByte(0x0); 
	W25Q64_SPI_ReadWriteOneByte(0x0);

	ID=W25Q64_SPI_ReadWriteOneByte(0xFF)<<8; //制造商ID
	ID|=W25Q64_SPI_ReadWriteOneByte(0xFF);   //設備ID
	*W25Q64_GPBDAT |= (1 << 1);
	return ID;
}
/*
函數功能:全片擦除
*/
void W25Q64_ClearAll(void)
{
	W25Q64_WriteEnabled(); //寫使能
	W25Q64_GetBusyStat();  //檢測狀態寄存器
	*W25Q64_GPBDAT &= ~(1 << 1);
	W25Q64_SPI_ReadWriteOneByte(0xC7);
	*W25Q64_GPBDAT |= (1 << 1);
	W25Q64_GetBusyStat();  //檢測狀態寄存器
}
/*
函數功能:頁編程
參    數:
		unsigned int addr:寫入的地址
        void  *p:將要寫入的數據
		unsigned int  len:寫入的長度
說    明:每次最多只能寫入256字節
*/
void W25Q64_PageWrite(unsigned int addr,void*p,unsigned int len)
{
	 unsigned short i;
	 unsigned char *buff=p;
	 W25Q64_WriteEnabled(); //寫使能
	 *W25Q64_GPBDAT &= ~(1 << 1);
	 W25Q64_SPI_ReadWriteOneByte(0x02);
	 W25Q64_SPI_ReadWriteOneByte(addr>>16); 
	 W25Q64_SPI_ReadWriteOneByte(addr>>8); 
	 W25Q64_SPI_ReadWriteOneByte((unsigned char)addr);
	 for(i=0;i>16); 
	W25Q64_SPI_ReadWriteOneByte(addr>>8); 
	W25Q64_SPI_ReadWriteOneByte((unsigned char)addr);
	*W25Q64_GPBDAT |= (1 << 1);
	W25Q64_GetBusyStat();  //檢測狀態寄存器
}
/*
函數功能:數據讀取
參    數:
*/
void  W25Q64_ReadData(unsigned int addr,void *p,unsigned int len)
{
	unsigned int i=0;
	unsigned char *buff=p;
	*W25Q64_GPBDAT &= ~(1 << 1);
	W25Q64_SPI_ReadWriteOneByte(0x03);
	W25Q64_SPI_ReadWriteOneByte(addr>>16); 
	W25Q64_SPI_ReadWriteOneByte(addr>>8); 
	W25Q64_SPI_ReadWriteOneByte((unsigned char)addr);
	for(i=0;i256)page_remain=256;
		else page_remain=len;
	} 
}
/*
函數功能:在任意地址寫入任意數據,對扇區進行校驗
參    數:
	unsigned int addr:寫入數據的地址
	void *p :寫入的數據
	unsigned int len :寫入數據的長度
說明:一個扇區的空間4096字節
*/
unsigned char W25Q64_BUFF[1024*4]; //用來檢驗一個扇區的數據是否需要擦除

void W25Q64_WriteData(unsigned int addr,void *p,unsigned int len)
{
	unsigned int sector_len=4096-addr%4096;  //剩余空間大小 
	unsigned char *buff=p;
	unsigned int i=0;
	if(len4096)
		{
			sector_len=4096;
		}
		else
		{
			sector_len=len;
		}
	}
}
static int __init w25q64_init(void)
{
	/*1. 初始化GPIO口*/
	W25Q64_Init();
	
	/*2. 打印廠商芯片ID*/
	unsigned short id=W25Q64_ReadDeviceID();
	printk("id=0x%X\n",id);
	
	/*3. 寫入數據*/
	char buff[]="W25Q64-test-123456789ABCDEFG";
	W25Q64_WriteData(100,buff,strlen(buff));
	printk("write-data:%s\n",buff);
	
	/*4. 讀出數據*/
	char buff_rx[100];
	W25Q64_ReadData(100,buff_rx,strlen(buff));
	printk("read-data:%s\n",buff_rx);
	return 0;
}
static void __exit w25q64_exit(void)
{
	/*釋放虛擬地址*/
	iounmap(W25Q64_GPBCON);
	iounmap(W25Q64_GPBDAT);
	printk("w25q64 driver exit ok!\n");
}

module_exit(w25q64_exit);
module_init(w25q64_init);
MODULE_LICENSE("GPL");
)>;i++)>;i++)>

3.2 采用SPI子系統框架-編寫驅動

下面代碼使用SPI子系統框架編寫的驅動測試代碼,注冊了字符設備框架,但是只是做了簡單的測試,目的只是測試W25Q64是否可以正常驅動,能讀寫存儲。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include    /*雜項字符設備頭文件*/
#include            /*文件操作集合*/
#include 

/*--------------------------------W25Q64相關操作代碼---------------------------------------------*/
struct spi_device *w25q64_spi_Device;
/*
函數功能:W25Q64初始化
Tiny4412硬件連接:
	DO--MISO :GPB_2 //輸入模式
	DI--MOSI :GPB_3 //輸出模式
	CLK-SCLK :GPB_0 //時鐘
	CS--CS   :GPB_1 //片選
*/
/*
函數功能:讀取設備ID和制造商ID
W25Q64: EF16
W25QQ128:EF17

參數:0x90表示讀取ID號的指令
*/
unsigned short W25Q64_ReadDeviceID(void)
{
	/*使用硬件SPI同步讀寫時序*/
	char tx_buf[6]={0x90,0x0,0x0,0x0,0xFF,0xFF};
	char rx_buf[6];

	struct spi_message m;
	struct spi_transfer t=
	{
		.tx_buf=tx_buf,
		.rx_buf=rx_buf,
		.len=6,
		.delay_usecs=0,
		.speed_hz=1000000,
		.bits_per_word=8
	};
	spi_message_init(&m);
	spi_message_add_tail(&t,&m);
	spi_sync(w25q64_spi_Device,&m);
	return rx_buf[4]<<8|rx_buf[5]; /*得到ID值*/
}
/*
函數功能:指定位置讀取指定長度的數據
參    數:
0x03 表示讀取數據的指令。
*/
void  W25Q64_ReadData(unsigned int addr,void *p,unsigned int len)
{	
	/*使用硬件SPI同步讀寫時序*/
	char tx_buf[4];
	tx_buf[0]=0x03;       //讀指令
	tx_buf[1]=addr>>16;   //以下是地址指令
	tx_buf[2]=addr>>8;
	tx_buf[3]=addr;
	spi_write(w25q64_spi_Device,tx_buf,4);
	spi_read(w25q64_spi_Device,p,len);
}
/*
函數功能:寫使能
*/
void  W25Q64_WriteEnabled(void)
{
	/*使用硬件SPI同步讀寫時序*/
	char tx_buf[1]={0x06};
	struct spi_message m;
	struct spi_transfer t=
	{
		.tx_buf=tx_buf,
		.len=1,
		.delay_usecs=0,
		.speed_hz=1000000,
		.bits_per_word=8
	};
	spi_message_init(&m);
	spi_message_add_tail(&t,&m);
	spi_sync(w25q64_spi_Device,&m);
}
/*
函數功能:讀狀態
*/
void W25Q64_GetBusyStat(void)
{
	unsigned char stat=1;
	/*使用硬件SPI同步讀寫時序*/
	char tx_buf[2]={0x05,0xFF};
	char rx_buf[2];
	while(stat&0x01)  //判斷狀態最低位
	{	
		struct spi_message m;
		struct spi_transfer t=
		{
			.tx_buf=tx_buf,
			.rx_buf=rx_buf,
			.len=2,
			.delay_usecs=0,
			.speed_hz=1000000,
			.bits_per_word=8
		};
		spi_message_init(&m);
		spi_message_add_tail(&t,&m);
		spi_sync(w25q64_spi_Device,&m);
		stat=rx_buf[1]; //得到狀態寄存器
	}
}
/*
函數功能:扇區擦除
參    數:
		unsigned int addr:扇區的地址
說   明:一個扇區是4096字節,擦除一個扇區時間至少150ms
*/
void W25Q64_ClearSector(unsigned int addr)
{
	W25Q64_WriteEnabled(); //寫使能
	W25Q64_GetBusyStat();  //檢測狀態寄存器
	
	/*使用硬件SPI同步讀寫時序*/
	unsigned char tx_buf[4];
	tx_buf[0]=0x20;
	tx_buf[1]=addr>>16;
	tx_buf[2]=addr>>8;
	tx_buf[3]=addr;
	
	char rx_buf[4];
	struct spi_message m;
	struct spi_transfer t=
	{
		.tx_buf=tx_buf,
		.rx_buf=rx_buf,
		.len=4,
		.delay_usecs=0,
		.speed_hz=1000000,
		.bits_per_word=8
	};
	spi_message_init(&m);
	spi_message_add_tail(&t,&m);
	spi_sync(w25q64_spi_Device,&m);
	W25Q64_GetBusyStat();  //檢測狀態寄存器
}
/*
函數功能:頁編程
參    數:
		unsigned int addr:寫入的地址
        void  *p:將要寫入的數據
		unsigned int  len:寫入的長度
說    明:每次最多只能寫入256字節
*/
void W25Q64_PageWrite(unsigned int addr,void*p,unsigned int len)
{
	 unsigned short i;
	 unsigned char *buff=p;
	 W25Q64_WriteEnabled(); //寫使能
	 
	/*使用硬件SPI同步讀寫時序*/
	unsigned char tx_buf[4];
	tx_buf[0]=0x02;       //頁寫指令
	tx_buf[1]=(addr>>16)&0xFF;   //以下是地址指令
	tx_buf[2]=(addr>>8)&0xFF;
	tx_buf[3]=(addr&0xFF);
	
	//寫數據
	spi_write(w25q64_spi_Device,tx_buf,4);
	//寫數據
	spi_write(w25q64_spi_Device,p,len);
	W25Q64_GetBusyStat();  //檢測狀態寄存器
}
/*
函數功能:在任意地址寫入任意數據,不進行校驗
參    數:
	unsigned int addr:寫入數據的地址
	void *p :寫入的數據
	unsigned int len :寫入數據的長度
*/
void W25Q64_WriteDataONCheck(unsigned int addr,void *p,unsigned int len)
{
	unsigned char *buff=p;
	unsigned short page_remain=256-addr%256;  //當前地址開始一頁剩下的空間
	unsigned short remain_len;      //剩余未寫入的長度
	if(len256)page_remain=256;
		else page_remain=len;
	} 
}

/*
函數功能:在任意地址寫入任意數據,對扇區進行校驗
參    數:
	unsigned int addr:寫入數據的地址
	void *p :寫入的數據
	unsigned int len :寫入數據的長度
說明:一個扇區的空間4096字節
*/
static unsigned char W25Q64_BUFF[1024*4]; //用來檢驗一個扇區的數據是否需要擦除
void W25Q64_WriteData(unsigned int addr,void *p,unsigned int len)
{
	unsigned int sector_len=4096-addr%4096;  //剩余空間大小 
	unsigned char *buff=p;
	unsigned int i=0;
	if(len4096)
		{
			sector_len=4096;
		}
		else
		{
			sector_len=len;
		}
	}
}
/*
雜項字符設備注冊示例----->LED
*/
static int tiny4412_open(struct inode *my_inode, struct file *my_file)
{
	return 0;
}

static int tiny4412_release(struct inode *my_inode, struct file *my_file)
{
	return 0;
}

static ssize_t tiny4412_read(struct file *my_file, char __user *buf, size_t len, loff_t *loff)
{
	/*2. 打印廠商芯片ID*/
	unsigned short id=W25Q64_ReadDeviceID();
	printk("-ID=0x%X\n",id);
	
	/*3. 寫入數據*/
	char buff[100]="打印廠商芯片ID打印廠商芯片ID";
	W25Q64_WriteData(0,buff,100);
	
	/*4. 讀出數據*/
	char buff_rx[100];
	W25Q64_ReadData(0,buff_rx,100);
	printk("Read=%s\n",buff_rx);
	return 0;
}
static ssize_t tiny4412_write(struct file *my_file, const char __user *buf, size_t len, loff_t *loff)
{
	return 0;
}

/*文件操作集合*/
static struct file_operations tiny4412_fops=
{
	.open=tiny4412_open,
	.read=tiny4412_read,
	.write=tiny4412_write,
	.release=tiny4412_release
};
/*
核心結構體
*/
static struct miscdevice tiny4412_misc=
{
	.minor=MISC_DYNAMIC_MINOR,  /*自動分配次設備號*/
	.name="tiny4412_W25q64",       /*設備文件,指定/dev/生成的文件名稱*/
	.fops=&tiny4412_fops
};
static int __devinit w25q64_probe(struct spi_device *spi)
{
	/*配置SPI模式*/
	spi->bits_per_word = 8;
	spi->mode = SPI_MODE_0;
	spi->max_speed_hz=1*1000000; //1Mhz	
	if(spi_setup(spi)<0)//配置
	{
		printk("SPI配置失敗!\n");
	}
	
	/*保存指針指向*/
	w25q64_spi_Device=spi;
	
	printk("w25q64 probe ok!\n");
	printk("SpiNum=%d\n",spi->dev.id);
	
	/*雜項設備注冊*/
    misc_register(&tiny4412_misc);
	return 0;
}
static int __devexit w25q64_remove(struct spi_device *spi)
{
	/*雜項設備注銷*/
	misc_deregister(&tiny4412_misc);
	return 0;
}
static struct spi_driver w25q64_spi_driver = {
	.driver = {
		.name =	"spidev",
		.owner =THIS_MODULE,
	},
	.probe =w25q64_probe,
	.remove = __devexit_p(w25q64_remove),
};
/*-------------------------------------------------------------------------*/
static int __init w25q64_init(void)
{
	spi_register_driver(&w25q64_spi_driver);
	printk("w25q64 driver install ok!\n");
	return 0;
}
static void __exit w25q64_exit(void)
{
	spi_unregister_driver(&w25q64_spi_driver);
	printk("w25q64 driver exit ok!\n");
}

module_exit(w25q64_exit);
module_init(w25q64_init);
MODULE_LICENSE("GPL");)>)>
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1679

    瀏覽量

    151878
  • 驅動
    +關注

    關注

    12

    文章

    1918

    瀏覽量

    86950
  • w25Q64
    +關注

    關注

    1

    文章

    15

    瀏覽量

    3154
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    W25X16W25X32\W25X64 數據手冊

    電子發燒友網站提供《W25X16W25X32\W25X64 數據手冊.pdf》資料免費下載
    發表于 07-10 16:10 ?2次下載

    itop-3568開發驅動開發指南-實驗程序的編寫

    本實驗對應的網盤路徑為:iTOP-RK3568 開發板【底板 V1.7 版本】\\\\03_【iTOP-RK3568開發板】指南教程\\\\02_Linux 驅動配套資料\\\\04_
    發表于 05-19 10:26

    DLPC3479上電初始化失敗的原因?

    我們做了兩塊電路板,使用DLPC3479驅動光機,3005作為電源,使用W25Q64作為FLASH。接上光機之后,上電發現3005的1.1V,1.8V,3.3V均輸出正常,-14V,10V,18V
    發表于 02-21 10:05

    DLPC3479上電初始化失敗的原因?

    使用DLPC3479驅動光機,3005作為電源,使用W25Q64作為FLASH。接上光機之后,上電發現3005的1.1V,1.8V,3.3V均輸出正常,-14V,10V,18V電壓輸出后掉下來
    發表于 02-21 06:44

    迅為RK3568開發驅動指南Linux中通用SPI設備驅動

    迅為RK3568開發驅動指南Linux中通用SPI設備驅動
    的頭像 發表于 01-23 11:02 ?2851次閱讀
    迅為RK3568<b class='flag-5'>開發</b>板<b class='flag-5'>驅動</b>指南<b class='flag-5'>Linux</b>中通用SPI設備<b class='flag-5'>驅動</b>

    迅為RK3568開發板SPI驅動指南-mcp2515驅動編寫:讀寄存器函數

    迅為RK3568開發板SPI驅動指南-mcp2515驅動編寫:讀寄存器函數
    的頭像 發表于 01-20 14:43 ?1054次閱讀
    迅為RK3568<b class='flag-5'>開發</b>板SPI<b class='flag-5'>驅動</b>指南-mcp2515<b class='flag-5'>驅動</b><b class='flag-5'>編寫</b>:讀寄存器函數

    Air780E開發板SPI接口:實現W25Q64讀寫不是事兒!

    一直有人向我咨詢開發板的SPI接口,對W25Q64進行讀寫操作很難,今天我便做一個詳細解析,讓你下回覺得這都不是事兒。
    的頭像 發表于 11-02 11:56 ?982次閱讀
    Air780E<b class='flag-5'>開發</b>板SPI接口:實現<b class='flag-5'>W25Q64</b>讀寫不是事兒!

    STM32CUBEMX(13)--SPI,W25Q128外部Flash移植

    W25Q80 0XEF14,表示芯片型號為W25Q16 0XEF15,表示芯片型號為W25Q32 0XEF16,表示芯片型號為W25Q64 0XEF17,表示芯片型號為
    發表于 09-30 14:41

    物聯網行業中Nor Flash的軟件設計分享_W25Q128的軟件設計方案

    一 概述 W25Q128是一種NOR Flash芯片,掉電后數據不丟失的特點。 W25Q128FV陣列被組織成65,536個可編程頁面,每個頁面256字節。每次最多可編程256字節。可以以16頁為
    的頭像 發表于 09-26 11:20 ?1322次閱讀
    物聯網行業中Nor <b class='flag-5'>Flash</b>的軟件設計分享_<b class='flag-5'>W25Q</b>128的軟件設計方案

    STM32H743配置了QSPI驅動W25Q256JV,初始化成功,但后續都失敗了,為什么?

    在實驗野火開發部STM32H743時,配置了QSPI驅動W25Q256JV,初始化成功,但后續都失敗了,如圖1 我的配置過程如下, 1、使用了CubMX,如下圖 2、CubMX生成了代碼
    發表于 09-26 07:00

    W25Q128FV中文手冊

    W25Q128FV(128Mbit)型串行 Flash 存儲器面向受限于空間、引腳和功耗的系統,提供了一種存儲解決方案。
    發表于 09-18 11:33 ?23次下載

    linux系統的設備驅動一般分幾類

    Linux系統的設備驅動是操作系統與硬件設備之間的橋梁,負責實現操作系統與硬件設備之間的通信和控制。Linux系統的設備驅動可以分為以下幾類: 字符設備
    的頭像 發表于 08-30 15:13 ?1027次閱讀

    Linux設備驅動程序分類有哪些

    Linux設備驅動程序是操作系統與硬件設備之間的橋梁,負責實現硬件設備與操作系統之間的通信和控制。Linux設備驅動程序的分類繁多,可以根據不同的標準進行分類。 按硬件類型分類
    的頭像 發表于 08-30 15:11 ?1247次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動
    的頭像 發表于 08-30 15:02 ?1108次閱讀

    Linux 驅動開發與應用開發,你知道多少?

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux
    的頭像 發表于 08-30 12:16 ?1602次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅動</b><b class='flag-5'>開發</b>與應用<b class='flag-5'>開發</b>,你知道多少?
    主站蜘蛛池模板: 亚洲狠狠97婷婷综合久久久久 | 天天操夜夜操视频 | 久久久噜噜噜久久久午夜 | 97色涩 | 成年人毛片网站 | 丁香九月婷婷 | 国产美女精品一区二区三区 | 康熙古代高h细节肉爽文全文 | 欧美三级在线观看黄 | 三级完整在线观看高清视频 | 97影院午夜午夜伦不卡 | 国产一区在线播放 | 午夜视频免费国产在线 | videsgratis欧美另类 | 三级黄色网址 | 国产产一区二区三区久久毛片国语 | 国模私拍一区二区三区 | 国产精品一区二区三区四区五区 | 男女性生动态免费视频 | 男人的天堂97 | 欧美视频图片 | 中文字幕在线观看日剧网 | 欧美全免费aaaaaa特黄在线 | 午夜免费福利在线观看 | 午夜香港三级在线观看网 | 爱情岛网站亚洲禁18进入 | 性毛片| 日本午夜三级 | 五月婷婷深爱五月 | 欧美一级三级在线观看 | 亚洲欧美视频一区二区 | 国产handjob手交在线播放 | 青草久草视频 | 国产精品李雅在线观看 | 国产精品久久久久影视不卡 | 色婷婷色综合缴情在线 | 亚洲欧美视频在线 | 色综合色| 午夜影院免费体验 | 日本不卡毛片一二三四 | 在线精品视频成人网 |