这里先解释一下Flash类似闪存,和EEPROM一样,掉电不易失
第一步:看电路原理图得出:
第二步:配置CubeMX
注意:PH2引脚没有NSS片选功能,我们使用它的输出功能就好
第三补:看Flash的数据手册:
时序分析:
片选信号使能后,主机发送0x90代表主机要获取Flash的制造商ID和设备ID了
再发送24bit的地址0
读取的时候就可以调用HAL库读取设备ID了
制造商ID是固定的:0xef,设备ID和设备有关
下面上代码:
/*********读写一个字节*******/
extern SPI_HandleTypeDef hspi1;
uint8_t sFLASH_SendByte(uint8_t byte)
{
uint8_t SEND_DATA = byte;
uint8_t RECV_DATA = 0;
HAL_SPI_TransmitReceive(&hspi1,&SEND_DATA,&RECV_DATA,1,0);
return RECV_DATA;
}
/*读取设备制造商的ID*/
uint16_t sFLASH_ReadID(void)
{
/*选中外设芯片,这是SPI协议的片选信号使能的操作*/
sFLASH_CS_LOW();
/*发送制造商ID的指令*/
sFLASH_SendByte(W25X_ManufactDeviceID);//0x90
/*发送24bit地址,一次8bit,发送三次*/
sFLASH_SendByte(sFLASH_DUMMY_BYTE); // 0x00
sFLASH_SendByte(sFLASH_DUMMY_BYTE);
sFLASH_SendByte(sFLASH_DUMMY_BYTE);
uint16_t RECV_ID = 0;
/*读取第一个ID*/
RECV_ID = sFLASH_SendByte(sFLASH_DUMMY_BYTE);
//printf("ID 1 = %x\n",RECV_ID);//0xef
/*读取第二个ID*/
RECV_ID =RECV_ID << 8 | sFLASH_SendByte(sFLASH_DUMMY_BYTE) ;
/*放弃片选*/
sFLASH_CS_HIGH();
return RECV_ID;
}
main:
/* USER CODE BEGIN 2 */
printf("usart init ok\n");
/* USER CODE END 2 */
uint16_t DEVICE_ID = 0;
DEVICE_ID = sFLASH_ReadID();
printf("DEVICE ID = 0x%x\n",DEVICE_ID);
最后上才艺,展示结果嘻嘻
与数据手册所给结果完全一致!