Hi,
I am working at a project that was abandoned by a guy that worked on my position. I have to fix some issues and add some features. I'm using SDK 17.0.2, my IDE is VSCodium (VSCode) under Linux. In sdk_config.h I have the NRF_FSTORAGE_ENABLED set to 1.
My current problem is that I have to save data received via Bluetooth into flash memory using fstorage. Right now I am able to init and erase the memory I want, but I have a problem writing it. The function nrf_fstorage_write returns NRF_SUCCESS but value read by nrf_fstorage_read is always at the stage of erase (0xFFFF FFFF). I know that I have to wait for the flash memory erase/write function to wait and I am using while loop to achieve that (see the code). Second AND subsequent runs of this function return as a result of read a value of decimal 536 871 096.
My target in this function is to just to write received data to flash, but currently I have to check if it was saved properly as it is at the development stage. Function nrf_fstorage_write is used in another place in the code but in a local function and I don't want to touch this working part (as I said I'm fixing someone else's code and it partially looks like spaghetti style), refactoring will come later.
Below I present you a dummy function that I use.
NRF_FSTORAGE_DEF(nrf_fstorage_t fstorage) = { .start_addr = 0x70000, .end_addr = 0x71000, }; static void function() { //init nrf_fstorage_init(&fstorage, &nrf_fstorage_sd, NULL); //erase uint32_t result_erase = nrf_fstorage_erase(&fstorage, fstorage.start_addr, 1, NULL); // erase 1 page while (result_erase != NRF_SUCCESS) { (void) sd_app_evt_wait(); } //write uint32_t blabla[] = {(uint32_t)123}; uint32_t result_write = nrf_fstorage_write(&fstorage, fstorage.start_addr, blabla, sizeof(blabla), NULL); while (result_write != NRF_SUCCESS) { (void) sd_app_evt_wait(); } NRF_LOG_INFO("\twrite result: %d\n", result_write); //read uint32_t temporary_buffer[1]; uint32_t result_read = nrf_fstorage_read(&fstorage, fstorage.start_addr, temporary_buffer, sizeof(blabla)); NRF_LOG_INFO("\tsaved %d read %d", blabla[0], temporary_buffer[0]); NRF_LOG_INFO("\tread result: %d", result_read); }
Why it does not work as it should? What am I doing wrong?