STM32CubeMX之FATFS+SPI驱动W25QXX
最编程
2024-01-11 17:25:55
...
文章目录
- 1 W25Q128简介
- 2 STM32CubeMX配置SPI
- 2.1 配置SPI
- 2.2 配置CS片选引脚
- 3 添加W25Q128驱动
- 4 将W25Q128挂载到FATFS
- 4.1 STM32CubeMX配置FATFS
- 4.2 在工程中为FATFS适配W25Q128
- 4.2.1 DSTATUS USER_initialize ( BYTE pdrv )
- 4.2.2 DSTATUS USER_status ( BYTE pdrv )
- 4.2.3 USER_read
- 4.2.3 USER_write
- 5 工程链接
参考资料
- SPI通信协议
1 W25Q128简介
W25Q128 总容量为16M字节,并将 16M 字节的容量分为 256 个块(Block),每个块大小为 64K 字节,每个块又分为16 个扇区(Sector),每个扇区 4K 个字节。W25Q128 的最小擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25Q128 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高,要求芯片必须有 4K 以上 SRAM 才能很好的操作。
2 STM32CubeMX配置SPI
根据W25Q128原理图可知,其使用SPI2,片选引脚为CS为PB12。
2.1 配置SPI
- Baud Rate 可根据实际需求而定;
- CPOL = High,CPHA = 2 Edge 和 CPOL = Low,CPHA = 1 Edge ,两种模式都可以
2.2 配置CS片选引脚
因为SPI的NSS Signal Type 选择为 Software,所以需要自行配置CS片选引脚
3 添加W25Q128驱动
配置W25Q128片选引脚
#define W25QXX_CS_NON HAL_GPIO_WritePin(W25QXX_CS_GPIO_Port,W25QXX_CS_Pin,GPIO_PIN_SET)
#define W25QXX_CS_OK HAL_GPIO_WritePin(W25QXX_CS_GPIO_Port,W25QXX_CS_Pin,GPIO_PIN_RESET)
使用STM32CubeMX配置SPI和片选引脚之后,需要自行根据W25Q128手册编写驱动程序,如:
- W25QXX_Read
- W25QXX_Write
这里省略,可参考正点原子例程
4 将W25Q128挂载到FATFS
4.1 STM32CubeMX配置FATFS
4.2 在工程中为FATFS适配W25Q128
4.2.1 DSTATUS USER_initialize ( BYTE pdrv )
DSTATUS USER_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
/* USER CODE BEGIN INIT */
Stat = STA_NOINIT;
if(W25QXX_Init() == W25Q_OK)
{
Stat &= ~STA_NOINIT;
}
return Stat;
/* USER CODE END INIT */
}
4.2.2 DSTATUS USER_status ( BYTE pdrv )
DSTATUS USER_status (
BYTE pdrv /* Physical drive number to identify the drive */
)
{
/* USER CODE BEGIN STATUS */
Stat = STA_NOINIT;
if(W25QXX_Get_State() == W25Q_OK)
{
Stat &= ~STA_NOINIT;
}
return Stat;
/* USER CODE END STATUS */
}
4.2.3 USER_read
DRESULT USER_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to read */
)
{
/* USER CODE BEGIN READ */
W25QXX_Read((uint8_t*)buff,(uint32_t)sector,(uint16_t)count);
return RES_OK;
/* USER CODE END READ */
}
4.2.3 USER_write
DRESULT USER_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to write */
)
{
/* USER CODE BEGIN WRITE */
/* USER CODE HERE */
W25QXX_Write((uint8_t*)buff,(uint32_t)sector,(uint16_t)count);
return RES_OK;
/* USER CODE END WRITE */
}
5 工程链接
gitee平台: STM32F10xxx Learn
上一篇: RT-Thread SPI 设备使用
下一篇: kconfig语法整理