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

Reduce time between SPI transfers

Dear all,

I am using a DK with the NRF52832 to drive a 32-bit DAC through SPI @ 8 MHz. I use a solution based on the peripheral/spi example using the SDK15.

My goal is to change the DAC value every (say) 5 us. This is theoretically possible since 32-bit/ 8 MHz = 4 us. The application also uses the SoftDevice, as well as Timer2 (for pulse diuration purposes)

Using the "nrf_drv_spi_transfer()" function in an infinite loop, it yields a delay between transfers of around 60 us. That is, I measure the 32 clock pulses of an SPI transfer in a row, but until the next call of "nrf_drv_spi_transfer()" there is a delay of 60 us.

1) I would firstly like to ask for reference of the origin of this delay. I know it has to do with the SoftDevice mainly, and of course the rest of the executing code, but I could not find a reference guide about it.

2) I would need to minimize the inter-transfer delay to ideally 0. Any strategies on how to do this, and which would be roughly the theoretical minimum of this delay? Is any continuous-transfer (zero inter-delay) implementation possible?

Thank you for your kindness,

Fran89

Parents
  • Hi,

    I think we will need some more details in order to answer your questions. How have you configured the SPI driver? (non-blocking/blocking mode, SS signal being used, etc).

    Do you need to update the data that is being transferred every time you call the nrf_drv_spi_transfer? If this is static, you can use the "advanced usage" features of the driver to setup a transfer and start it through PPI directly from a TIMER. This will minimize the time between transfers.

    If you need to change the content of the buffer, and are running BLE activity simultaneously, there is no way to guarantee the completion of the transfer in this short time, since the softdevice will always have the highest priority and will preempt the SPI transfer.

    Best regards,
    Jørgen

  • Hi again.

    This looks exactly like what I am looking for.  Also it is awesome to have the absolute minimum latency value, thanks.

    I do need to change the content of the buffer in every transfer of course. I will try to implement this solution throught the week and get back with a question or mark the problem as solved.

    Thank you very much in advance.

Reply Children
  • For the time being I decided to use the standard spi transfer api.

    I tried linking PPI channels to the timer and the spi, but I could not successfully manage to do so. However, I believe that is the way to go when I become more time-constrained.

    I will open a new topic when I have doubts about that, and I think my question has been answered here.

    Best regards

Related