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

Use nrf_fstorage_sd with nrf_sdh_ble_enable

Hi, I'm using SDK15.2.0 and A nRF52832 for my project.

I followed the "flash_fstorage" example give by Nordic, to write in the flash memory in my project. 

When I run my program the function nrf_fstorage_erase(&fstorage, address, 1, NULL); and nrf_fstorage_write(&fstorage, address, &data, sizeof(data), NULL); work perfectly but after I had called nrf_sdh_ble_enable(), the functions nrf_fstorage_erase() and nrf_fstorage_write() don't work anymore even if I don't use BLE.

The SVCALL is never called to write or erase the flash, I still stuck in nrf_fstorage_is_busy().

Do I need to change some priorities in sdk_config.h ?

Thanks, Automne

Parents
  • Hi, 

    Just to make sure, are you initializing Fstorage with the Softdevice backend (p_fs_api = &nrf_fstorage_sd;), and not nrf_fstorage_nvmc?

    Thanks,

    Vidar 

  • Hi Vidar,

    I tried to implant fstorage in my code as you did in your example, I got the same problem. The functions nrf_fstorage_write() and nrf_fstorage_erase() work perfectly when the softdevice stack is disable.
    When the softdevice is enable nrf_fstorage_write() and nrf_fstorage_erase() work only once and I never get out of the SVCALL. I didn't get the events NRF_FSTORAGE_EVT_WRITE_RESULT or NRF_FSTORAGE_EVT_ERASE_RESULT.

    I don't call this functions from an interrupt.

    Which resource use SVCALL(nrf_fstorage_write) and SVCALL(nrf_fstorage_erase) ?

    Thanks, Automne

  • Hi Vidar,

    Thanks for your help, yes I used GCC 4.8.3 with your code.

    Finally I found a work around, I don't use the SVCALL, I call the function directly :

    - sd_flash_page_erase(uint32_t page_number) 

    - sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)

    Now it's working for me Slight smile

    Automne

  • Glad to hear that you were able to make it work:) It sounds like you are satisfied with this solution but are you receiving any SoC events from the Softdevice when you use sd_flash* API directly?  

  • I wired the problem, the function sd_evt_get(uint32_t * p_evt_id) wasn't called after we get the event NRF_EVT_FLASH_OPERATION_SUCCESS to clear the flag is_busy.

  • Hello,

    I am having the same problem.  In the end did you stay with this solution of using the sd functions directly?  Did you manage to get a callback confirming the operation was successful?  I don't fully understand your comment below "I wired the problem"  -did you manage to get fstorage working?  how?  

    Seems to be a problem with the fstorage library right?  i know fds is the preferred route but seems like overkill for simple storage of a few settings.

    many thanks

    Barney

  • Hi Barley,

    The fds was also too much for my use case. I continue to call the function directly.

    In the example fstorage work properly, but in my code it isn't working, the flag is_busy isn't clear after the success of the operation, I don't know what's append inside Nordic code.

    I call sd_evt_get(uint32_t * p_evt_id) when the operation flash/write return a success :

    void flash_page_clear(uint32_t address)
    {
        uint32_t i = 0, j = 0, evt_id = 0xff, err = 0xff;

        err = sd_flash_page_erase((uint32_t)(address/FLASH_PAGE_SIZE));
        log_dbg("sd_flash_page_erase, ret code : %d", __func__, err);
        for(j = FLASH_OP_MAX_RETRIES; j!=0 && evt_id != NRF_EVT_FLASH_OPERATION_SUCCESS; j--)
        {
            for(i = 1000;i != 0
            && evt_id != NRF_EVT_FLASH_OPERATION_SUCCESS
            && evt_id != NRF_EVT_FLASH_OPERATION_ERROR; i--)
            {
                delay_ms(1);
                err = sd_evt_get(&evt_id);
            }
       }
        delay_ms(1);
        log_dbg("i = %d, evt_id = %d", __func__, i, evt_id);
    }

Reply
  • Hi Barley,

    The fds was also too much for my use case. I continue to call the function directly.

    In the example fstorage work properly, but in my code it isn't working, the flag is_busy isn't clear after the success of the operation, I don't know what's append inside Nordic code.

    I call sd_evt_get(uint32_t * p_evt_id) when the operation flash/write return a success :

    void flash_page_clear(uint32_t address)
    {
        uint32_t i = 0, j = 0, evt_id = 0xff, err = 0xff;

        err = sd_flash_page_erase((uint32_t)(address/FLASH_PAGE_SIZE));
        log_dbg("sd_flash_page_erase, ret code : %d", __func__, err);
        for(j = FLASH_OP_MAX_RETRIES; j!=0 && evt_id != NRF_EVT_FLASH_OPERATION_SUCCESS; j--)
        {
            for(i = 1000;i != 0
            && evt_id != NRF_EVT_FLASH_OPERATION_SUCCESS
            && evt_id != NRF_EVT_FLASH_OPERATION_ERROR; i--)
            {
                delay_ms(1);
                err = sd_evt_get(&evt_id);
            }
       }
        delay_ms(1);
        log_dbg("i = %d, evt_id = %d", __func__, i, evt_id);
    }

Children
No Data
Related