在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美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

    文章

    1637

    瀏覽量

    148106
  • 驅動
    +關注

    關注

    12

    文章

    1840

    瀏覽量

    85321
  • w25Q64
    +關注

    關注

    1

    文章

    15

    瀏覽量

    3023
收藏 人收藏

    評論

    相關推薦

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

    一直有人向我咨詢開發板的SPI接口,對W25Q64進行讀寫操作很難,今天我便做一個詳細解析,讓你下回覺得這都不是事兒。
    的頭像 發表于 11-02 11:56 ?405次閱讀
    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 ?551次閱讀
    物聯網行業中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 ?4次下載

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

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

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

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux
    的頭像 發表于 08-30 12:16 ?821次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅動</b><b class='flag-5'>開發</b>與應用<b class='flag-5'>開發</b>,你知道多少?

    FLASH芯片從W25Q80BL換為W25Q80DV后,系統運行經常崩潰怎么解決?

    之前我們用的W25Q80BL,工作在40Mhz QIO ,系統運行正常 本次生產時,供應商反饋W25Q80BL要停產了,后續供貨是W25Q80DV,測試時我們發現,在頻繁地FLASH
    發表于 07-10 06:11

    使用W25Q64JVSIQ芯片時提示報錯如何解決?

    系統使用W25Q64JVSIQ芯片時提示 Read SFDP parameter header information failed. The W25Q64 is not support JEDEC SFDP。 請問有沒有辦法解決,謝謝
    發表于 07-09 06:32

    W25M02G NAND FLASH做U盤,請問有沒有nand flash的U盤驅動

    最近在用W25M02G這款NAND FLASH做U盤,之前用的W25Q64,不需要壞塊管理,讀寫也是以頁的,NAND FLASH多了壞塊,多了扇區重入的交換區管理,請問有沒有比較好的
    發表于 04-25 06:44

    如何使用SPI的DMA模式讀寫FLASH

    環境:HAL庫 + USB + W25Q64 + Fatfs 硬件:stm32f103c8t6 + MX25L64 我使用普通模式,完成在W25Q64中寫入文件,通過USB可以再PC中讀取
    發表于 04-16 07:59

    使用STM32H750 QSPI W25Q64作為外部FLASH,映射后讀0X90010000地址的數據讀到的是0XFF的原因?

    我使用STM32H750QSPIW25Q64 作為外部FLASH,使用非映射方式讀寫FLASH 正常,映射后,讀0X90000000地址的數據也正常,但是讀0X90010000 地址的數據讀到
    發表于 04-01 06:24

    無法使用STWB5MMG的QSPI IO2怎么解決?

    無法使用STWB5MMG的QSPI IO2 CS:PA2 CLK: PA3 IO0: PB9 IO1: PB8 IO2: PA7----->驅動W25Q64(芯片正常),我用QSPI 4線傳輸的時候, 唯獨這個線上的數據,一直是0。 IO3: PA6
    發表于 03-26 07:09

    關于STM32F103從外設到存儲器DMA通道數據格式的問題

    在基于STM32F103開發過程中遇到了一個瓶頸,就是圖片取模后的數據放在W25Q64當中,通過硬件SPI+DMA的方式直接將數據發送給FSMC,FSMC被用來驅動16bit的LCD屏,問題是硬件
    發表于 03-07 07:11

    E203外接外部flash時,OPENOCD已經正確識別flash ID,但還是燒寫失敗的原因?

    在黑金7A200FPGA上移植E203軟核,外接WIN W25Q64 FLASH時,燒寫報錯 FLASH原理圖如下圖 球球各位大佬救救孩子
    發表于 01-10 06:20
    主站蜘蛛池模板: 美女性视频网站| 伊在线视频| 美女黄18| 精品日韩一区二区三区| 久久这里精品青草免费| 久久精品2020| 丁香花在线影院观看在线播放| videosgratis欧美另类老太| 夜夜操天天操| 美女喷白浆| 国产免费好大好硬视频| 亚洲免费毛片| 国产精品第9页| 五月婷婷久| 国产在线视频欧美亚综合| 欧美女同在线| 夜色321看片资源站| 亚洲天堂二区| 一区二区三区四区精品| 日美一级毛片| 在线天堂中文有限公司| 他也色在线| 麻豆三级视频| 夜夜穞狠狠穞| xxxx黄| 免费播放一区二区三区| 午夜噜噜噜| 九九九精品| 无毒不卡在线播放| tom影院亚洲国产| 男人的午夜影院| 色婷五月| 国产成都一二三四区| 欧美午夜精品久久久久久黑人 | 欧美mv日韩mv国产mv网站| 国产三级观看| 人人艹人人插| 3344成年在线视频免费播放男男| 最新久久免费视频| 欧美色天使| 午夜神马影院|