1.1.13.1.2 Using the Library
The AT25DF driver provides non-blocking APIs to read, write and erase AT25DF Flash memory.
The AT25DF driver can be used in following ways:
-
To perform reads, writes and erase from/to any Flash memory address, with number of bytes spanning multiple pages.
-
To perform page write to AT25DF Flash. Here, the memory start address must be aligned to the page boundary.
-
To perform Sector/Bulk/Chip Erase operations.
-
To interface with the Memory driver to perform block operations on the AT25DF Flash.
-
Application can either register a callback to get notified once the data transfer is complete or can poll the status of the data transfer.
Example Application to Erase, Write and Read AT25DF Flash Memory
/* Erase-Write-Read 2 Sector of Data (4096 *2)*/ #define BUFFER_SIZE 8192 #define MEM_ADDRESS 0x0 APP_DATA CACHE_ALIGN appData; static uint32_t erase_index = 0; static uint32_t write_index = 0; void APP_FLASH_EventHandler(DRV_AT25DF_TRANSFER_STATUS event, uintptr_t context) { switch(event) { case DRV_AT25DF_TRANSFER_STATUS_COMPLETED: { appData.isTransferDone = true; break; } case DRV_AT25DF_TRANSFER_STATUS_ERROR: default: { appData.isTransferDone = false; break; } } } void APP_Initialize ( void ) { uint32_t i = 0; /* Place the App state machine in its initial state. */ appData.state = APP_STATE_INIT; for (i = 0; i < BUFFER_SIZE; i++) { appData.writeBuffer[i] = i; } } void APP_Tasks ( void ) { /* Check the application's current state. */ switch ( appData.state ) { /* Application's initial state. */ case APP_STATE_INIT: { if (DRV_AT25DF_Status(DRV_AT25DF_INDEX) == SYS_STATUS_READY) { appData.state = APP_STATE_OPEN_DRIVER; } break; } case APP_STATE_OPEN_DRIVER: { appData.handle = DRV_AT25DF_Open(DRV_AT25DF_INDEX, DRV_IO_INTENT_READWRITE); if (appData.handle != DRV_HANDLE_INVALID) { DRV_AT25DF_EventHandlerSet(appData.handle, APP_FLASH_EventHandler, 0); appData.state = APP_STATE_GEOMETRY_GET; } break; } case APP_STATE_GEOMETRY_GET: { if (DRV_AT25DF_GeometryGet(appData.handle, &appData.geometry) != true) { appData.state = APP_STATE_ERROR; break; } appData.state = APP_STATE_GEOMETRY_WAIT; break; } case APP_STATE_GEOMETRY_WAIT: { if (appData.isTransferDone == true) { appData.state = APP_STATE_ERASE_FLASH; erase_index = 0; write_index = 0; appData.isTransferDone = false; } else if (DRV_AT25DF_TransferStatusGet(appData.handle) == DRV_AT25DF_TRANSFER_STATUS_ERROR) { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_ERASE_FLASH: { if (DRV_AT25DF_SectorErase(appData.handle, (MEM_ADDRESS + erase_index)) != true) { appData.state = APP_STATE_ERROR; } appData.state = APP_STATE_ERASE_WAIT; break; } case APP_STATE_ERASE_WAIT: { if (appData.isTransferDone == true) { erase_index += appData.geometry.erase_blockSize; if (erase_index < BUFFER_SIZE) { appData.state = APP_STATE_ERASE_FLASH; } else { appData.state = APP_STATE_WRITE_MEMORY; } appData.isTransferDone = false; } else if (DRV_AT25DF_TransferStatusGet(appData.handle) == DRV_AT25DF_TRANSFER_ERROR_UNKNOWN) { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_WRITE_MEMORY: { if (DRV_AT25DF_PageWrite(appData.handle, (uint32_t *)&appData.writeBuffer[write_index], (MEM_ADDRESS + write_index)) != true) { appData.state = APP_STATE_ERROR; break; } appData.state = APP_STATE_WRITE_WAIT; break; } case APP_STATE_WRITE_WAIT: { if (appData.isTransferDone == true) { write_index += appData.geometry.write_blockSize; if (write_index < BUFFER_SIZE) { appData.state = APP_STATE_WRITE_MEMORY; } else { appData.state = APP_STATE_READ_MEMORY; } appData.isTransferDone = false; } else if (DRV_AT25DF_TransferStatusGet(appData.handle) == DRV_AT25DF_TRANSFER_ERROR_UNKNOWN) { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_READ_MEMORY: { if (DRV_AT25DF_Read(appData.handle, (uint32_t *)&appData.readBuffer, BUFFER_SIZE, MEM_ADDRESS) != true) { appData.state = APP_STATE_ERROR; } else { appData.state = APP_STATE_READ_WAIT; } break; } case APP_STATE_READ_WAIT: { if (appData.isTransferDone == true) { appData.isTransferDone = false; appData.state = APP_STATE_VERIFY_DATA; } else if (DRV_AT25DF_TransferStatusGet(appData.handle) == DRV_AT25DF_TRANSFER_ERROR_UNKNOWN) { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_VERIFY_DATA: { if (!memcmp(appData.writeBuffer, appData.readBuffer, BUFFER_SIZE)) { appData.state = APP_STATE_SUCCESS; } else { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_SUCCESS: { DRV_AT25DF_Close(appData.handle); break; } case APP_STATE_ERROR: default: { DRV_AT25DF_Close(appData.handle); break; } } }
