0%

使用STM32读取Winbond_W25Q16_Flash芯片的ID和序列号

使用STM32读取Winbond_W25Q16_Flash芯片的ID和序列号

Cube配置

配置为全双工主设备

image-20220108111641258

image-20220108111113092

使用的是SPI1(根据开发板的接线),Prescaler配置多少都可以,不关键,2和256都行

image-20220108111433160

DMA也可以开,不影响

配置CS引脚,原理图接线为

image-20220108111515938

图中的F_CS是片选引脚,注意低电平有效

程序编写

封装一个片选函数

void EnCS(uint8_t flag)
{
if(flag==1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}

读取chipID的函数根据手册编写

image-20220108111759707

可见是先把CS置为低电平,然后SPI发送0x90,然后发送3byte的0x00地址,然后接收即可

void ReadChipID(void)
{

uint8_t D00 = 0x00;
uint8_t DFF = 0xFF;
uint8_t D90 = 0x90;
uint8_t D06 = 0x06;
uint8_t count = 0;
uint8_t D60 = 0x60;

EnCS(0);
HAL_SPI_Transmit(&hspi1, &D90, 1, 1000);
HAL_SPI_Transmit(&hspi1, &D00, 1, 1000);
HAL_SPI_Transmit(&hspi1, &D00, 1, 1000);
HAL_SPI_Transmit(&hspi1, &D00, 1, 1000);
HAL_SPI_TransmitReceive(&hspi1,&DFF, recBuff, 1, 1000);
HAL_SPI_TransmitReceive(&hspi1, &DFF, recBuff+1, 1, 1000);
EnCS(1);
}

//然后将接收到的字符串格式化
sprintf(stringToSend, "0x%2x%2x%2x%2x%2x%2x%2x%2x",recBuff[7],recBuff[6],recBuff[5],recBuff[4],recBuff[3],recBuff[2],recBuff[1],recBuff[0]);

注意此处因为函数的接收参数是接受数据存放位置的指针,所以必须使用recBuff + X的形式(recBuff是一个uint8_t数组)而不能用recBuff[X]的形式。

结果如图

image-20220108112619532

同样根据手册编写读取芯片唯一序列号的程序

image-20220108112138116

也是先把CS置为低电平,然后发送指令,然后等待三个数据传输周期(可以向芯片发送0xFF模拟等待延时),然后接收,注意此时必须手动等待,而不能直接使用HAL库的SPI接收函数的接收超时等待功能,因为会接收到错误的结果(比如全是0xFF)。

void ReadUniqueID(void)
{
uint8_t D4B = 0x4B;
int8_t count = 7;
uint8_t DFF = 0xFF;
EnCS(0);
HAL_SPI_Transmit(&hspi1, &D4B, 1, 1000);
HAL_SPI_Transmit(&hspi1, &DFF, 1, 1000);
HAL_SPI_Transmit(&hspi1, &DFF, 1, 1000);
HAL_SPI_Transmit(&hspi1, &DFF, 1, 1000);
HAL_SPI_Transmit(&hspi1, &DFF, 1, 1000);
for(count=7;count>=0;count--)
{
HAL_SPI_Receive(&hspi1, recBuff+count, 1, 1000);
}
EnCS(1);
}

//然后将接收到的字符串格式化
sprintf(stringToSend, "0x%2x%2x%2x%2x%2x%2x%2x%2x",recBuff[7],recBuff[6],recBuff[5],recBuff[4],recBuff[3],recBuff[2],recBuff[1],recBuff[0]);

image-20220108112807141

假如去掉四行HAL_SPI_Transmit(&hspi1, &DFF, 1, 1000);,接收到的序列号将会变成

image-20220108112925406

注意到开头出现了很多ff,因为芯片在此时的4个数据周期中是没有响应的,对应接收到4byte的ff,也就是图上的8个ff