DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { switch (pdrv) { case SPI : sFLASH_Init(); DBG_MSG("sFLASH_ReadID()=0x%x", sFLASH_ReadID()); return 0; default: return STA_NODISK; } return STA_NOINIT; }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* Initialize LEDs mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); /* Initialize the SPI FLASH driver */ sFLASH_Init(); /* Get SPI Flash ID */ FlashID = sFLASH_ReadID(); /* Check the SPI Flash ID */ if (FlashID == sFLASH_M25P64_ID) { /* OK: Turn on LD1 */ STM_EVAL_LEDOn(LED1); /* Perform a write in the Flash followed by a read of the written data */ /* Erase SPI FLASH Sector to write on */ sFLASH_EraseSector(FLASH_SECTOR_TO_ERASE); /* Write Tx_Buffer data to SPI FLASH memory */ sFLASH_WriteBuffer(Tx_Buffer, FLASH_WRITE_ADDRESS, BufferSize); /* Read data from SPI FLASH memory */ sFLASH_ReadBuffer(Rx_Buffer, FLASH_READ_ADDRESS, BufferSize); /* Check the correctness of written dada */ TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize); /* TransferStatus1 = PASSED, if the transmitted and received data by SPI1 are the same */ /* TransferStatus1 = FAILED, if the transmitted and received data by SPI1 are different */ /* Perform an erase in the Flash followed by a read of the written data */ /* Erase SPI FLASH Sector to write on */ sFLASH_EraseSector(FLASH_SECTOR_TO_ERASE); /* Read data from SPI FLASH memory */ sFLASH_ReadBuffer(Rx_Buffer, FLASH_READ_ADDRESS, BufferSize); /* Check the correctness of erasing operation dada */ for (Index = 0; Index < BufferSize; Index++) { if (Rx_Buffer[Index] != 0xFF) { TransferStatus2 = FAILED; } } /* TransferStatus2 = PASSED, if the specified sector part is erased */ /* TransferStatus2 = FAILED, if the specified sector part is not well erased */ } else { /* Error: Turn on LD2 */ STM_EVAL_LEDOn(LED2); } while (1) {} }
int sFLASH_SelfTest(void) { uint32_t FLASH_TestAddress = 0x000000; //Note: Make sure BufferSize should be Even and not Zero uint8_t Tx_Buffer[] = "Test communication with SPI FLASH!";//BufferSize = 34 uint32_t BufferSize = (sizeof(Tx_Buffer) / sizeof(*(Tx_Buffer))) - 1; uint8_t Rx_Buffer[BufferSize]; uint8_t Index = 0; uint32_t FlashID = 0; int TestStatus = -1; /* Get SPI Flash ID */ FlashID = sFLASH_ReadID(); /* Check the SPI Flash ID */ if(FlashID == sFLASH_MX25L8006E_ID) { /* Perform a write in the Flash followed by a read of the written data */ /* Erase SPI FLASH Sector to write on */ sFLASH_EraseSector(FLASH_TestAddress); /* Write Tx_Buffer data to SPI FLASH memory */ sFLASH_WriteBuffer(Tx_Buffer, FLASH_TestAddress, BufferSize); /* Read data from SPI FLASH memory */ sFLASH_ReadBuffer(Rx_Buffer, FLASH_TestAddress, BufferSize); /* Check the correctness of written data */ for (Index = 0; Index < BufferSize; Index++) { if (Tx_Buffer[Index] != Rx_Buffer[Index]) { //FAILED : Transmitted and Received data by SPI are different TestStatus = -1; } else { //PASSED : Transmitted and Received data by SPI are same TestStatus = 0; } } /* Perform an erase in the Flash followed by a read of the written data */ /* Erase SPI FLASH Sector to write on */ sFLASH_EraseSector(FLASH_TestAddress); /* Read data from SPI FLASH memory */ sFLASH_ReadBuffer(Rx_Buffer, FLASH_TestAddress, BufferSize); /* Check the correctness of erasing operation data */ for (Index = 0; Index < BufferSize; Index++) { if (Rx_Buffer[Index] != 0xFF) { //FAILED : Specified sector part is not well erased TestStatus = -1; } else { //PASSED : Specified sector part is erased TestStatus = 0; } } } return TestStatus; }