原因是没有在扇区擦除的最后加上等待函数和最前面要加上使能函数【注意等待函数的位置,一定要在最后,不然也是报错】
使能函数
/**
* @brief 向FLASH发送 写使能 命令
* @param none
* @retval none
*/
void SPI_FLASH_WriteEnable(void)
{
/* 通讯开始:CS低 */
FLASH_SPI_CS_LOW;
/* 发送写使能命令*/
SPI_FLASH_Send_Byte(W25X_WriteEnable);
/*通讯结束:CS高 */
FLASH_SPI_CS_HIGH;
}
等待函数
void SPI_WaitForWriteEnd(void)
{
uint8_t status = 0;
//片选使能
FLASH_SPI_CS_LOW;
SPI_FLASH_Send_Byte(READ_STATUS);
do
{
status = SPI_FLASH_Send_Byte(DUMMY);
} while ((status & 0x01) == 1); //当S0为1时,就说明总线在忙,所以说明还有程序还在运行,
FLASH_SPI_CS_HIGH;
}
最后的擦除结果
void SPI_Sector_Erase(uint32_t addr)
{
FLASH_SPI_CS_LOW;
SPI_FLASH_Send_Byte(Sector_Erase);
SPI_FLASH_Send_Byte((uint8_t)((addr >> 16) & 0xff));
SPI_FLASH_Send_Byte((uint8_t)((addr >> 8) & 0xff));
SPI_FLASH_Send_Byte((uint8_t)((addr >> 0) & 0xff));
FLASH_SPI_CS_HIGH;
SPI_WaitForWriteEnd();
}