Hi,
I am working on writing data on flash and reading it back.
i am not able to read data which i am writing to it . i am posting my flash file please suggest where i am making mistake
typedef struct wallet_detail {
uint8_t firstWallet_name1[WALLET_NAME_SIZE];
uint8_t firstWallet_name[WALLET_NAME_SIZE];
uint8_t secondWallet_name[WALLET_NAME_SIZE];
uint8_t thirdWallet_name[WALLET_NAME_SIZE];
uint8_t No_of_wallet_available;
} wallet_detail_t;
wallet_detail_t nvsparams;
static void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt);
NRF_FSTORAGE_DEF(nrf_fstorage_t fstorage) =
{
/* Set a handler for fstorage events. */
.evt_handler = fstorage_evt_handler,
/* These below are the boundaries of the flash space assigned to this instance of fstorage.
* You must set these manually, even at runtime, before nrf_fstorage_init() is called.
* The function nrf5_flash_end_addr_get() can be used to retrieve the last address on the
* last page of flash available to write data. */
.start_addr = 0xff000,
.end_addr = 0xfffff,
};
nrf_fstorage_api_t * p_fs_api;
static void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt)
{
char data[60];
if (p_evt->result != NRF_SUCCESS)
{
sprintf(data,"vent received: ERROR");
// NRF_LOG_INFO("--> Event received: ERROR while executing an fstorage operation.");
return;
}
switch (p_evt->id)
{
case NRF_FSTORAGE_EVT_WRITE_RESULT:
{
sprintf(data,"wrote %d bytes 0x%x ",p_evt->len, p_evt->addr);
// NRF_LOG_INFO("--> Event received: wrote %d bytes at address 0x%x.",
// p_evt->len, p_evt->addr);
} break;
case NRF_FSTORAGE_EVT_ERASE_RESULT:
{
sprintf(data,"erased %d page 0x%x ",p_evt->len, p_evt->addr);
//NRF_LOG_INFO("--> Event received: erased %d page from address 0x%x.",
// p_evt->len, p_evt->addr);
} break;
default:
break;
}
vSerialPutString(data, strlen(data));
}
/**
* @brief Unlocks Flash for write access
* @param None
* @retval None
*/
void FLASH_If_Init(void)
{
p_fs_api = &nrf_fstorage_nvmc;
nrf_fstorage_init(&fstorage, p_fs_api, NULL);
}
/**
* @brief This function does an erase of all user flash area
* @param start: start of user flash area
* @retval FLASHIF_OK : user flash area successfully erased
* FLASHIF_ERASEKO : error occurred
*/
uint32_t FLASH_If_Erase(uint32_t start ,uint32_t pages_cnt)
{
ret_code_t result = NRF_ERROR_NO_MEM;
uint8_t timeout = 0;
while (timeout < 20 && result == NRF_SUCCESS) {
result = nrf_fstorage_erase(&fstorage, start, pages_cnt, NULL);;
timeout++;
}
//ret_code_t result = nrf_fstorage_erase(&fstorage, start, pages_cnt, NULL);;
return result;
}
ret_code_t BSP_NonVolatileWrite(const uint32_t* srcAddr, uint32_t noOfWords)
{
FLASH_If_Erase(0xff000, 1);
ret_code_t result = NRF_ERROR_NO_MEM, index = 0;
uint8_t timeout = 0;
for (index = 0; index < noOfWords; index++) {
while (timeout < 20 && result != NRF_SUCCESS) {
result = nrf_fstorage_write(&fstorage, 0xff000 + (index*4) , &srcAddr, 4, NULL);
timeout++;
}
}
return result;
}
void BSP_NonVolatileRead(uint32_t* dstAddr, uint32_t length)
{
ret_code_t result = NRF_ERROR_NO_MEM;
uint16_t timeout = 0;
while (timeout < 2000 && result != NRF_SUCCESS) {
result = nrf_fstorage_read(&fstorage, 0xff000, &dstAddr, length);
timeout++;
}
#if 0
uint32_t* sourceAddr = (uint32_t*)NV_WALLET_DETAIL_START_ADDR;
for (int i=0; i < length; i++){
*dstAddr = ((uint32_t)(*sourceAddr));
dstAddr++;
sourceAddr++;
}
#endif
}
uint8_t loadSettings(void)
{
return 0;
}
void saveSettings(uint8_t cmd, char *value, uint32_t length)
{
wallet_detail_t nvsparams;
/* Read all the parameters, new parameters will be written only if there is a change */
BSP_NonVolatileRead((uint32_t*)&nvsparams, 17);
wallet_detail_t *configParam = &nvsparams;
char data[100];
switch (cmd) {
case WALLET_NAME_ONE:
strcpy((char *)configParam->firstWallet_name, (char *)value);
nvsparams.No_of_wallet_available = 1;
BSP_NonVolatileWrite((const uint32_t*)&nvsparams,17);
BSP_NonVolatileRead((uint32_t*)&nvsparams, 17);
sprintf(data,"va %d %s %s %s",nvsparams.No_of_wallet_available, nvsparams.firstWallet_name,nvsparams.secondWallet_name,nvsparams.thirdWallet_name);
vSerialPutString(data, strlen(data));
break;
case WALLET_NAME_TWO:
strcpy((char *)configParam->secondWallet_name, (char *)value);
nvsparams.No_of_wallet_available = 2;
BSP_NonVolatileWrite((const uint32_t*)&nvsparams,17);
BSP_NonVolatileRead((uint32_t*)&nvsparams, 17);
sprintf(data,"va %d %s %s %s",nvsparams.No_of_wallet_available, nvsparams.firstWallet_name,nvsparams.secondWallet_name,nvsparams.thirdWallet_name);
vSerialPutString(data, strlen(data));
break;
case WALLET_NAME_THREE:
strcpy((char *)configParam->thirdWallet_name, (char *)value);
nvsparams.No_of_wallet_available = 3;
BSP_NonVolatileWrite((const uint32_t*)&nvsparams,17);
BSP_NonVolatileRead((uint32_t*)&nvsparams, 17);
sprintf(data,"va %d %s %s %s",nvsparams.No_of_wallet_available, nvsparams.firstWallet_name,nvsparams.secondWallet_name,nvsparams.thirdWallet_name);
vSerialPutString(data, strlen(data));
break;
}
}
void printData()
{
wallet_detail_t nvsparams;
BSP_NonVolatileRead((uint32_t*)&nvsparams, 17);
char data[100];
sprintf(data,"va %d %s %s %s",nvsparams.No_of_wallet_available, nvsparams.firstWallet_name,nvsparams.secondWallet_name,nvsparams.thirdWallet_name);
vSerialPutString(data, strlen(data));
}