/** * @brief Writes more than one byte to the FLASH with a single WRITE cycle * (Page WRITE sequence). * @note The number of byte can't exceed the FLASH page size. * @param pBuffer: pointer to the buffer containing the data to be written * to the FLASH. * @param WriteAddr: FLASH's internal address to write to. * @param NumByteToWrite: number of bytes to write to the FLASH, must be equal * or less than "sFLASH_PAGESIZE" value. * @retval None */ void sFLASH_WritePage(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { /*!< Enable the write access to the FLASH */ sFLASH_WriteEnable(); /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write to Memory " instruction */ sFLASH_SendByte(sFLASH_CMD_WRITE); /*!< Send WriteAddr high nibble address byte to write to */ sFLASH_SendByte((WriteAddr & 0xFF0000) >> 16); /*!< Send WriteAddr medium nibble address byte to write to */ sFLASH_SendByte((WriteAddr & 0xFF00) >> 8); /*!< Send WriteAddr low nibble address byte to write to */ sFLASH_SendByte(WriteAddr & 0xFF); /*!< while there is data to be written on the FLASH */ while (NumByteToWrite--) { /*!< Send the current byte */ sFLASH_SendByte(*pBuffer); /*!< Point on the next byte to be written */ pBuffer++; } /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /*!< Wait the end of Flash writing */ sFLASH_WaitForWriteEnd(); }
/** * @brief Enables the write access to the FLASH. * @param None * @retval None */ void sFLASH_WriteStatusForWrite(void) { #if 1 /*!< Enable the write access to the FLASH */ sFLASH_WriteEnable(0); /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_CMD_WRSR); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(0x00); sFLASH_SendByte(0x02); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); sFLASH_WaitForWriteEnd(0); #endif /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_CMD_RDCR); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Deselect the FLASH: Chip Select hig */ sFLASH_CS_HIGH(); }
/*********************************************** 函数名称:sFLASH_EraseSector 功 能:擦除W25Q64 FLASH整个芯片, 需要大概20s左右的时间。 入口参数:无 返 回 值:unsigned char:读出的数据。 备 注:无 ************************************************/ void sFLASH_EraseFlash(void) { //芯片写使能 sFLASH_WriteEnable(); //芯片使能 W25Q64_WCS_Clr(); //发送扇区擦除指令 sFLASH_SendByte(sFLASH_CMD_CE); //芯片禁止 W25Q64_WCS_Set(); //等待写完成 sFLASH_WaitForWriteEnd(); }
void sFLASH_GlobalUnprotect(void) { sFLASH_WriteEnable(); sFLASH_CS_LOW(); sFLASH_SendByte(sFLASH_CMD_WRSR); sFLASH_SendByte(0); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
/** * @brief Erases the entire FLASH. * @param None * @retval None */ void sFLASH_EraseBulk(void) { /*!< Send write enable instruction */ sFLASH_WriteEnable(); /*!< Bulk Erase */ /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send Bulk Erase instruction */ sFLASH_SendByte(sFLASH_CMD_BE); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /*!< Wait the end of Flash writing */ sFLASH_WaitForWriteEnd(); }
/** * @brief Erases the entire FLASH. * @param None * @retval None */ void sFLASH_EraseBulk(void) { /* Enable the write access to the FLASH */ sFLASH_WriteEnable(); /* Bulk Erase */ /* Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /* Send Bulk Erase instruction */ sFLASH_SendByte(sFLASH_CMD_BE); /* Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /* Wait till the end of Flash writing */ sFLASH_WaitForWriteEnd(); }
/*********************************************** 函数名称:sFLASH_64KBEraseSector 功 能:擦除W25Q64 FLASH的一个块。 入口参数:无 返 回 值:无 备 注:无 ************************************************/ void sFLASH_64KBEraseSector(FLADDR SectorAddr) { //芯片写使能 sFLASH_WriteEnable(); //芯片使能 W25Q64_WCS_Clr(); //发送扇区擦除指令 sFLASH_SendByte(sFLASH_CMD_BE); //发送24位地址 sFLASH_SendByte((SectorAddr & 0xFF0000) >> 16); sFLASH_SendByte((SectorAddr & 0xFF00) >> 8); sFLASH_SendByte(SectorAddr & 0xFF); //芯片禁止 W25Q64_WCS_Set(); //等待写完成 sFLASH_WaitForWriteEnd(); }
/*********************************************** 函数名称:sFLASH_WritePage 功 能:向W25Q64 FLASH写入一页数据。 入口参数:pBuffer:存放写入的数据的缓冲区, WriteAddr:开始写入的地址, NumByteToWrite:写入的字节数 返 回 值:无:读出的数据。 备 注:无 ************************************************/ void sFLASH_WritePage(unsigned char* pBuffer, FLADDR WriteAddr, unsigned int NumByteToWrite) {//芯片写使能,写之前需写使能,否则无法写入 sFLASH_WriteEnable(); //芯片使能 W25Q64_WCS_Clr(); //发送写指令 sFLASH_SendByte(sFLASH_CMD_PAGEPRO); //发送24位地址 sFLASH_SendByte((WriteAddr & 0xFF0000) >> 16); sFLASH_SendByte((WriteAddr & 0xFF00) >> 8); sFLASH_SendByte(WriteAddr & 0xFF); //循环按字节写入 while (NumByteToWrite--) {sFLASH_SendByte(*pBuffer); pBuffer++; } //芯片禁止 W25Q64_WCS_Set(); //等待写完成 sFLASH_WaitForWriteEnd(); }
/** * @brief Erases the specified FLASH sector. * @param SectorAddr: address of the sector to erase. * @retval None */ void sFLASH_EraseSector(uint32_t SectorAddr) { /*!< Send write enable instruction */ sFLASH_WriteEnable(); /*!< Sector Erase */ /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send Sector Erase instruction */ sFLASH_SendByte(sFLASH_CMD_SE); /*!< Send SectorAddr high nibble address byte */ sFLASH_SendByte((SectorAddr & 0xFF0000) >> 16); /*!< Send SectorAddr medium nibble address byte */ sFLASH_SendByte((SectorAddr & 0xFF00) >> 8); /*!< Send SectorAddr low nibble address byte */ sFLASH_SendByte(SectorAddr & 0xFF); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /*!< Wait the end of Flash writing */ sFLASH_WaitForWriteEnd(); }
void sFLASH_EraseBlock32k(unsigned int SectorAddr) { __IO unsigned int status; /*!< Send write enable instruction */ sFLASH_WriteEnable(); /*!< Sector Erase */ /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send Sector Erase instruction */ sFLASH_SendByte(sFLASH_CMD_32K_ERASE); /*!< Send SectorAddr high nibble address byte */ sFLASH_SendByte((SectorAddr & 0xFF0000) >> 16); /*!< Send SectorAddr medium nibble address byte */ sFLASH_SendByte((SectorAddr & 0xFF00) >> 8); /*!< Send SectorAddr low nibble address byte */ sFLASH_SendByte(SectorAddr & 0xFF); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /*!< Wait the end of Flash writing */ sFLASH_WaitForWriteEnd(); }