Hi,
I want to write data to the Flash memory of my Nordic thingy 52 board.
When I erase flash using API ret = fs_erase(&fs_config, fs_config.p_start_addr, 1, NULL); return code is zero.
After erasing the flash when I read the content of the flash it must be 0xFFFFFFFF but in my case it is some random value.
After eraing flash i write data = 0xAAAAAAAA to the start address of the page I erase using API given below,
ret = fs_store(&fs_config, (fs_config.p_start_addr), &data, 1, NULL);
where data is 0xAAAAAAAA
Return code of the the API is 0(NRF_SUCCESS).
After writing the data when I read from the particular address i got some random data 0x60000000.
For reference | attached a log below,
Erasing a flash page at address 0x70000
return code erase = 0x0
Data read from flash address 0x70000: 60000000
Data read from flash address 0x70004: 60000000
Data read from flash address 0x70008: ffffffff
Data read from flash address 0x7000C: ffffffff
Writing data 0xAAAAAAAA to address 0x70000
return code fs_store AAAAAAAA = 0x0
For reference attaching the code below.
volatile uint32_t data;
uint32_t flash_data[4];
FS_REGISTER_CFG(fs_config_t fs_config) =
{
.callback = fs_event_handler1, // Function for event callbacks.
// .num_pages = NUM_PAGES, // Number of physical flash pages required.
// .priority = 0xFF // Priority for flash usage.
.num_pages = 1,
.p_start_addr = 0x00070000, // Start Address of Reserved Free Space
.p_end_addr = 0x00071000,
.priority = 0xFE
//priority = 0x01
};
fs_ret_t ret = fs_init(); //initializing flash storage
NRF_LOG_RAW_INFO("return code of fs_init() = 0x%d\r\n", ret); //printing return code for fs_init() function
NRF_LOG_RAW_INFO("Erasing a flash page at address 0x%X\r\n", fs_config.p_start_addr);
ret = fs_erase(&fs_config, fs_config.p_start_addr, 1, NULL); //Erasing a single page from start address
NRF_LOG_RAW_INFO("return code erase = 0x%d\r\n", ret); //printing return code for fs_erase
//Read the first 4 words of the page
for (int i = 0; i < 4; i++) {
NRF_LOG_RAW_INFO("Data read from flash address 0x%X: ", fs_config.p_start_addr + i);
flash_data[i] = *(fs_config.p_start_addr + i);
NRF_LOG_RAW_INFO("%x ", flash_data[i]);
NRF_LOG_RAW_INFO("\r\n");
}
data = 0xBBBBBBBB;
NRF_LOG_RAW_INFO("Writing data 0x%X to address 0x%X\r\n", data, fs_config.p_start_addr);
fs_callback_flag = 1;
ret = fs_store(&fs_config, fs_config.p_start_addr, &data, 1, NULL);
NRF_LOG_RAW_INFO("return code fs_store BBBBBBBB= 0x%d\r\n", ret); //printing return code for fs_erase
data = 0xAAAAAAAA;
NRF_LOG_RAW_INFO("Writing data 0x%X to address 0x%X\r\n", data, fs_config.p_start_addr + 1);
fs_callback_flag = 1;
ret = fs_store(&fs_config, (fs_config.p_start_addr + 1), &data, 1, NULL);
NRF_LOG_RAW_INFO("return code fs_store AAAAAAAA = 0x%d\r\n", ret); //printing return code for fs_erase
flash_data[0] = *(fs_config.p_start_addr);
flash_data[1] = *(fs_config.p_start_addr + 1);
NRF_LOG_RAW_INFO("read data at flash_data[0] = %x\r\n", flash_data[0]); //printing data at fs_config.p_start_addr
NRF_LOG_RAW_INFO("read data at flash_data[1] = %x\r\n", flash_data[1]); //printing data at fs_config.p_start_addr + 1
}
Output of the program is given below,
Erasing a flash page at address 0x70000
return code erase = 0x0
Data read from flash address 0x70000: 60000000
Data read from flash address 0x70004: 60000000
Data read from flash address 0x70008: ffffffff
Data read from flash address 0x7000C: ffffffff
Writing data 0xBBBBBBBB to address 0x70000
return code fs_store BBBBBBBB= 0x0
Writing data 0xAAAAAAAA to address 0x70004
return code fs_store AAAAAAAA = 0x0
read data at flash_data[0] = 60000000
read data at flash_data[1] = 60000000
Thanks,
Raj