/** * @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(); }
/** * @brief Enables the write access to the FLASH. * @param None * @retval None */ void sFLASH_SoftReset(void) { /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_CMD_RST0); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); //delay //sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_CMD_RST1); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); sFLASH_WaitForWriteEnd(0); }
/** * @brief Initializes the peripherals used by the SPI FLASH driver. * @param None * @retval None */ void sFLASH_Init(void) { SPI_InitTypeDef SPI_InitStructure; sFLASH_LowLevel_Init(); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /*!< SPI configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(sFLASH_SPI, &SPI_InitStructure); /*!< Enable the sFLASH_SPI */ SPI_Cmd(sFLASH_SPI, ENABLE); }
unsigned int sFLASH_ReadStatus(void) { unsigned int Temp0 = 0; /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "RDID " instruction */ sFLASH_SendByte(sFLASH_CMD_RDSR); /*!< Read a byte from the FLASH */ Temp0 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Read a byte from the FLASH */ //Temp1 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Read a byte from the FLASH */ //Temp2 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); //Temp = Temp0; return Temp0; }
/** * @brief Reads a block of data from the FLASH. * @param pBuffer: pointer to the buffer that receives the data read from the FLASH. * @param ReadAddr: FLASH's internal address to read from. * @param NumByteToRead: number of bytes to read from the FLASH. * @retval None */ void sFLASH_ReadBuffer(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Read from Memory " instruction */ sFLASH_SendByte(sFLASH_CMD_READ); /*!< Send ReadAddr high nibble address byte to read from */ sFLASH_SendByte((ReadAddr & 0xFF0000) >> 16); /*!< Send ReadAddr medium nibble address byte to read from */ sFLASH_SendByte((ReadAddr& 0xFF00) >> 8); /*!< Send ReadAddr low nibble address byte to read from */ sFLASH_SendByte(ReadAddr & 0xFF); while (NumByteToRead--) /*!< while there is data to be read */ { /*!< Read a byte from the FLASH */ *pBuffer = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Point to the next location where the byte read will be saved */ pBuffer++; } /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
/** * @brief Reads FLASH identification. * @param None * @retval FLASH identification */ uint32_t sFLASH_ReadID(void) { uint32_t Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0; /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "RDID " instruction */ sFLASH_SendByte(0x9F); /*!< Read a byte from the FLASH */ Temp0 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Read a byte from the FLASH */ Temp1 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Read a byte from the FLASH */ Temp2 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2; return Temp; }
/** * @brief Reads a block of data from the FLASH. * @param pBuffer: pointer to the buffer that receives the data read from the FLASH. * @param ReadAddr: FLASH's internal address to read from. * @param NumByteToRead: number of bytes to read from the FLASH. * @retval None */ void sFLASH_ReadBuffer(uint8_t* pBuffer, uint32_t ReadAddr, uint32_t NumByteToRead) { /* Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /* Send "Read from Memory " instruction */ sFLASH_SendByte(sFLASH_CMD_READ); /* Send ReadAddr high nibble address byte to read from */ sFLASH_SendByte((ReadAddr & 0xFF0000) >> 16); /* Send ReadAddr medium nibble address byte to read from */ sFLASH_SendByte((ReadAddr& 0xFF00) >> 8); /* Send ReadAddr low nibble address byte to read from */ sFLASH_SendByte(ReadAddr & 0xFF); while (NumByteToRead) /* while there is data to be read */ { /* Read a byte from the FLASH and point to the next location */ *pBuffer++ = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /* Decrement NumByteToRead */ NumByteToRead--; } /* Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
/** * @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 Polls the status of the Write In Progress (WIP) flag in the FLASH's * status register and loop until write opertaion has completed. * @param None * @retval None */ void sFLASH_WaitForWriteEnd(uint32_t Addr) { uint8_t flashstatus = 0; if(Addr >= sFLASH_MEMORYSIZE) { /*!< Select the FLASH: Chip Select low */ sFLASH_CS2_LOW(); } else { /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); } /*!< Send "Read Status Register" instruction */ sFLASH_SendByte(sFLASH_CMD_RDSR); /*!< Loop as long as the memory is busy with a write cycle */ do { /*!< Send a dummy byte to generate the clock needed by the FLASH and put the value of the status register in FLASH_Status variable */ flashstatus = sFLASH_SendByte(sFLASH_DUMMY_BYTE); } while ((flashstatus & sFLASH_WIP_FLAG) == SET); /* Write in progress */ /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
/** * @brief Enables the write access to the FLASH. * @param None * @retval None */ void sFLASH_WriteEnable(void) { /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_CMD_WREN); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
/** * @brief Disables the write access to the FLASH. * @param None * @retval None */ static void sFLASH_WriteDisable(void) { /* Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /* Send "Write Disable" instruction */ sFLASH_SendByte(sFLASH_CMD_WRDI); /* Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
/** * @brief Initializes SPI Flash * @param void * @return void */ void sFLASH_Init(void) { /* Initializes the peripherals used by the SPI FLASH driver */ sFLASH_SPI_Init(); /* Disable the write access to the FLASH */ sFLASH_WriteDisable(); /* Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /* Send "Write Enable Status" instruction */ sFLASH_SendByte(sFLASH_CMD_EWSR); /* Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); /* Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /* Send "Write Status Register" instruction */ sFLASH_SendByte(sFLASH_CMD_WRSR); sFLASH_SendByte(0); /* Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); }
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 Enables the write access to the FLASH. * @param None * @retval None */ void sFLASH_WriteEnable(uint32_t WriteAddr) { if(WriteAddr >= sFLASH_MEMORYSIZE) /*!< Select the FLASH: Chip Select low */ sFLASH_CS2_LOW(); else /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Write Enable" instruction */ sFLASH_SendByte(sFLASH_CMD_WREN); /*!< 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(); }
/** * @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(); }
/** * @brief Reads FLASH identification. * @param None * @retval FLASH identification */ uint32_t sFLASH_ReadID(void) { uint8_t byte[3]; /* Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /* Send "JEDEC ID Read" instruction */ sFLASH_SendByte(sFLASH_CMD_RDID); /* Read a byte from the FLASH */ byte[0] = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /* Read a byte from the FLASH */ byte[1] = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /* Read a byte from the FLASH */ byte[2] = sFLASH_SendByte(sFLASH_DUMMY_BYTE); /* Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH(); return (byte[0] << 16) | (byte[1] << 8) | byte[2]; }