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

SD-Card writing blocks ADC

Hello,

I'm trying to write my ADC samples over spi on a sd card (Using SAADC like in the sdk 12 example with PPI and using fatfs like in the example in the sdk).

I open the file I want to write in only once in the beginning and close it in the end, not every time when I write in the file.

Everything works, but because I use timestamps after every sample I can see that everytime I call the f_write function, my ADC is blocked for a few miliseconds. The time where it's blocked depends on the amount of data I send.

I know that the disk_write function waits for the write done event (busy flag):

ret_code_t err_code = nrf_blk_dev_write_req(m_drives[drv].config.p_block_device, &req);
if (err_code == NRF_SUCCESS)
{
   while (m_drives[drv].busy)
    {


        m_drives[drv].config.wait_func();
    }

    if (m_drives[drv].last_result == NRF_BLOCK_DEV_RESULT_SUCCESS)
    {
        return RES_OK;
    }
	 
}
return RES_ERROR;

So I think this while loop is where my code blocks. I tried to delete the waiting part, going on with my sampling and checking before writing again if the device is still busy.

No error occurs, but when I read out my card on Pc the file is empty.

Is it somehow possible to go on sampling the ADC while writing on the SD card?

Regards Lea

Parents
  • The problem is probably that the start task is manually triggered in the buffer_convert function, which I guess you are calling inside the saadc callback. To get continuous saadc measurements without any interruptions you should have a PPI channel between the end event and the start task of the saadc, like shown in the figure here.

    This should most likely work out of the box with the saadc driver, just set up the PPI channel. I have not tested this with the driver, but I know that it works from the peripheral point of view.

    Alternatively have a higher interrupt level on the saadc interrupt/callback. Configure this in nrf_drv_saadc_config_t->interrupt_priority.

Reply
  • The problem is probably that the start task is manually triggered in the buffer_convert function, which I guess you are calling inside the saadc callback. To get continuous saadc measurements without any interruptions you should have a PPI channel between the end event and the start task of the saadc, like shown in the figure here.

    This should most likely work out of the box with the saadc driver, just set up the PPI channel. I have not tested this with the driver, but I know that it works from the peripheral point of view.

    Alternatively have a higher interrupt level on the saadc interrupt/callback. Configure this in nrf_drv_saadc_config_t->interrupt_priority.

Children
No Data
Related