使用STM32读取Winbond_W25Q16_Flash芯片的ID和序列号
Cube配置
配置为全双工主设备


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

DMA也可以开,不影响
配置CS引脚,原理图接线为

图中的F_CS是片选引脚,注意低电平有效
程序编写
封装一个片选函数
void EnCS(uint8_t flag) |
读取chipID的函数根据手册编写

可见是先把CS置为低电平,然后SPI发送0x90,然后发送3byte的0x00地址,然后接收即可
void ReadChipID(void) |
注意此处因为函数的接收参数是接受数据存放位置的指针,所以必须使用recBuff + X的形式(recBuff是一个uint8_t数组)而不能用recBuff[X]的形式。
结果如图

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

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

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

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