STM32CubeMX之FATFS+SPI驱动W25QXX

文章目录

  • 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

参考资料

  1. 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。
STM32CubeMX之FATFS+SPI驱动W25QXX_第1张图片

2.1 配置SPI

STM32CubeMX之FATFS+SPI驱动W25QXX_第2张图片

  1. Baud Rate 可根据实际需求而定;
  2. CPOL = High,CPHA = 2 Edge 和 CPOL = Low,CPHA = 1 Edge ,两种模式都可以

2.2 配置CS片选引脚

因为SPI的NSS Signal Type 选择为 Software,所以需要自行配置CS片选引脚
STM32CubeMX之FATFS+SPI驱动W25QXX_第3张图片

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手册编写驱动程序,如:

  1. W25QXX_Read
  2. W25QXX_Write

这里省略,可参考正点原子例程

4 将W25Q128挂载到FATFS

4.1 STM32CubeMX配置FATFS

STM32CubeMX之FATFS+SPI驱动W25QXX_第4张图片
STM32CubeMX之FATFS+SPI驱动W25QXX_第5张图片

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 */
}

你可能感兴趣的:(STM32CubeMX工程)