First: nRF52840 dongle or nRF52840-Preview_DK (doesn't matter which I get the same issue), SDK17.0.2, Segger, Windows 10. I am trying to dump a FIFO buffer from a sensor as fast as possible. I thought I had it working, but then I realized that my rx_buffer in the nrf52840 was all 0s. Then I saw that I might need to use the EVENTS_READY flag in this post. I have been trying to figure out how to get this to work using the datasheet so that I don't need to use the interrupt system (too slow), but the code I have doesn't quite do it. I get 24 clocks, I see the correct data on the MOSI pin, and I'm pretty sure on the MISO pin as well, but I never see the CS go high. I guess this tells me that somehow the last while (!EVENTS_READY) is hanging, but if I remove it I don't get the correct result either.
// First time through, fill the double buffer NRF_SPI0->TXD = FIFO_DATA_OUT_L | 0x80; // TXD = FIFO, RXD-1 = 0xFF NRF_SPI0->TXD = 0xFF; // TXD = 0xFF, TXD+1 = FIFO, RXD = 0xFF, RXD-1 = Byte1 // Read garbage (0xFF) from address TX when Event is ready while (!NRF_SPI0->EVENTS_READY); NRF_SPI0->EVENTS_READY = 0; (void)NRF_SPI0->RXD; // After this line: TXD = 0xFF, TXD+1 = FIFO, RXD = Byte1, RXD-1 = ? // Now we can push the last TX into the double buffer NRF_SPI0->TXD = 0xFF; // Now read data when Event is ready while (!NRF_SPI0->EVENTS_READY); NRF_SPI0->EVENTS_READY = 0; ble_buff[ble_idx++] = (uint8_t)NRF_SPI0->RXD; // Now read data when Event is ready // while (!NRF_SPI0->EVENTS_READY); // NRF_SPI0->EVENTS_READY = 0; ble_buff[ble_idx++] = (uint8_t)NRF_SPI0->RXD; nrf_delay_us(3); NRF_GPIO->OUTSET = 1 << SPIM_CS;
How can I get three bytes from SPI as fast as possible without using the interrupts? (obviously(?) this will go into a loop to clear out the sensor FIFO)