This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

flash writing and reading issue

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));

}

Parents Reply Children
No Data
Related