第一步:读写相关函数
在向 FLASH 芯片存储矩阵写入数据前,首先要使能写操作,通过“Write Enable”命令即可写使能。
1.写使能命令
/**
* @brief 向Flash发送写使能命令
* @param 无
* @retval 无
*/
void SPI_FLASH_WriteEnable(void)
{
/* 通讯开始:CS低 */
FLASH_SPI_CS_LOW();
/* 发送写使能命令 */
SPI_FLASH_SendByte(W25X_WriteEnable);
/* 通讯结束:CS高 */
FLASH_SPI_CS_HIGH();
}
与 EEPROM 一样,由于 FLASH 芯片向内部存储矩阵写入数据需要消耗一定的时间,并不是在总线通讯结束的一瞬间完成的,所以在写操作后需要确认 FLASH 芯片“空闲”时才能进行再次写入。
2.等待空闲函数
#define WIP_Flag 0x01
/**
* @brief 等待空闲函数
* @param 无
* @retval 等待WIP(BUSY)标志被置0,即等待到FLASH内部数据写入完毕
*/
void SPI_FLASH_WaitForWriteEnd(void)
{
u8 FLASH_Status = 0;
/* 选择FLASH:CS低 */
FLASH_SPI_CS_LOW();
/* 发送读状态寄存器命令 */
SPI_FLASH_SendByte(W25X_ReadStatusReg);
/* 若FLASH忙碌,则等待 */
do
{
/* 读取FLASH芯片的寄存器状态 */
FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);
}
while((FLASH_Status &WIP_Flag) == SET); /* 正在写入状态 */
/* 停止信号 FLASH:CS高 */
FLASH_SPI_CS_HIGH();
}
3.扇区擦除函数
/**
* @brief 擦除FLASH扇区
* @param SectorAddr:要擦除的扇区地址
* @retval 无
*/
void SPI_FLASH_SectorErase(u32 SectorAddr)
{
/* 发送写使能 */
SPI_FLASH_WriteEnable();
/* 等待空闲 */
SPI_FLASH_WaitForWriteEnd();
/* 擦除扇区 */
/* 选择FLASH:CS低电平 */
FLASH_SPI_CS_LOW();
/* 发送扇区擦除指令 */
SPI_FLASH_SendByte(W25X_SectorErase);
/* 发送擦除扇区地址的高位 */
SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
/* 发送擦除扇区地址的中位 */
SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
/* 发送擦除扇区地址的低位 */
SPI_FLASH_SendByte((SectorAddr & 0xFF));
/* 停止信号FLSAH:CS高电平 */
FLASH_SPI_CS_HIGH();
/* 等待擦除完毕 */
SPI_FLASH_WaitForWriteEnd();
}
4.FLASH的页写入函数
目标扇区被擦除完毕后,就可以向它写入数据了。使用页写入命令最多可以一次向 FLASH 传输 256 个字节的数据&