借STM32读取W25Q16器件号学点英语

  • 学习10918次

STM32-W25Q16

硬件连接

硬件连接如上图所示,STM32通过SPI口与W25Q16通信。

W25Q16是一个16M bit(2M byte)的Flash存储器,用来存储各种掉电后需要保存的数据。市场上有众多品牌的Flash型存储器,同一品牌的Flash存储器也有不同的系列。比如W25Q16 W25Q64 W25Q128等等。

我们今天要学习的内容就是,如何读取W25Q16的器件号。W25Q16的生产商信息是0xEF,Q16的器件号是0x14。这些信息是如何知道的,请看W25Q16的datasheet,如下图所示:

w25q16ID

Manufacturer ID:生产商信息,新邦(Winbond)串行FLASH的ID号是EFh,h就是hex,十六进制的意思,就是我们写程序常用的0xEF。

DeviceID:器件号,对应W25Q16就是14h,h就是hex,十六进制的意思,就是我们写程序常用的0x14。

软件读ID号

我们打开W25Q16的datasheet,看目录,找到如下指令目录部分:

ReadMDID

我们使用指令0x90读取ManufacturerDevice号。我们打开11.2.27节,如下图所示:

w25q16readid

11.2.27节的内容,分别是介绍和使用指令的时序。我们看时序的介绍的这一段:

The Read Manufacturer/Device ID instruction is very similar to the Release from Power-down / Device ID instruction. The instruction is initiated by driving the /CS pin low and shifting the instruction code “90h” followed by a 24-bit address (A23-A0) of 000000h. After which, the Manufacturer ID for Winbond (EFh) and the Device ID are shifted out on the falling edge of CLK with most significant bit (MSB) first as shown in figure 26. The Device ID values for the W25Q16BV is listed in Manufacturer and Device Identification table. If the 24-bit address is initially set to 000001h the Device ID will be read first and then followed by the Manufacturer ID. The Manufacturer and Device IDs can be read continuously, alternating from one to the other. The instruction is completed by driving /CS high.

翻译过来:

读取生产商器件号的指令和解除低功耗器件号的指令很相似(这句话可以不看)。首先把CS引脚拉低,然后发送0x90,然后发送24位的地址0x000000,然后就可以读取ID号了,首先读到的是0xEF,然后读到的是W25Q16的器件号,这个ID号可以从“图26”中看到(就是0x14)。读的时候,要在CLK引脚的下降沿读,从高位到低位(用硬件SPI,这些不用考虑)。如果你把刚才说的24位地址写成0x000001,那么读出来的器件号,会和刚才的相反,先读到0x14,后读到0xEF。

上面的翻译,你结合时序图,就会很容易看懂。

STM32读取ID号的程序如下所示:

uint16_t W25Q16_ReadDeviceID(void)
{
 uint16_t Temp,temp1,temp2;
 /* CS拉低,开始通信 */
 GPIO_ResetBits(GPIOA, GPIO_Pin_4);
 /* Send "RDID " instruction */
 SPI1_Communication(0x90);
 SPI1_Communication(0x00);
 SPI1_Communication(0x00);
 SPI1_Communication(0x00);
 
 /* Read a byte from the FLASH */
 temp1 = SPI1_Communication(0x00);
 temp2 = SPI1_Communication(0x00);
 /* Deselect the FLASH: Chip Select high */
 GPIO_SetBits(GPIOA, GPIO_Pin_4);
 
 Temp = (temp1<<8) + temp2;
 return Temp;
}

我们可以在主函数中,用串口把读到的数据发送出去,就可以看到结果了。

int main(void)
{
 uint16_t ManufacturerDeviceID;
 
 USART1_Init();//初始化串口1 波特率9600
 W25Q16_Init();//初始化W25Q16
 ManufacturerDeviceID = W25Q16_ReadDeviceID();//读器件号
 USART1_Send_byte(ManufacturerDeviceID>>8);//发送高8位
 USART1_Send_byte(ManufacturerDeviceID);//发送低8位
 
 while (1)
 {
 
 }
}

完整的KEIL工程,请点击下载:STM32读W25Q16器件号(MDK5工程)

W25Q16的datasheet,点击下载:W25Q16DVSSIG

串口接收到的W25Q16器件号

发表评论

关闭菜单