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

SPIM EasyDMA

Dear Sir/Madam,

I am trying following,

1. Avoiding SPIM transfer interrupt handler.

I am performing following steps,

1. nrf_drv_spi_init() for Handler parmater 'NULL' is passed .
2. If SPIM is free next transfer is intiated. SPIM busy is indentifed using nrf_drv_spi_end_event_get
3. No SPIM Handler used which is mentioned by flag NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER in nrf_drv_spi_xfer.

My SPIM transfer function looks like this,

void spi_transferx(uint8_t * p_tx_buffer,uint8_t tx_buffer_length,uint8_t * p_rx_buffer, uint8_t rx_buffer_length)
{
while( nrf_drv_spi_end_event_get() == BUSY);

nrf_drv_spi_xfer(&spi,p_xfer_desc,NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER);

nrf_drv_spi_transfer(&spi, p_tx_buffer, tx_buffer_length, p_rx_buffer, rx_buffer_length));
}

These steps are on correct path?

I have another question,

1. Through SPIM EasyDMA I want to collect my sensor data in buffer without manually incrementing the buffer ptr & without using SPIM INTR handler.


I am trying to performing following steps,


1. After initializing my sensor , EasyDMA buffers are initialized.

typedef struct accel_sample_list
{
uint8_t accel_sample[TOTAL_READ_BYTES];
} accel_sample_t;
accel_sample_t accel_buff[10];

void spi_dma_buffer_initi(void)
{
NRF_SPIM0->RXD.MAXCNT = TOTAL_READ_BYTES;
NRF_SPIM0->RXD.PTR = &accel_buff;
NRF_SPIM0->RXD.LIST = 1;

nrf_drv_spi_xfer(&spi,p_xfer_desc,( NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER |
NRF_DRV_SPI_FLAG_RX_POSTINC |
NRF_DRV_SPI_FLAG_HOLD_XFER);
}

My Sensor gives data ready on physical INTR line.

In my INTR handler I do the following,

void sensor_interrupt_handler(void)
{
uint8_t tx_buffer[1];

tx_buffer[0] = KX_13X_1211_BUF_READ_ADDR | KX13X_SPI_RD_MASK;
while( nrf_drv_spi_end_event_get() == BUSY);
nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START);
}

These steps are on correct path?

Top Replies

Related