Hi,
I've got a two-processor board (i.e. another processor in addition to the two-core nrf5340) where the other processor is sending data to my nrf5340 via SPI. The Nordic is the SPI slave.
*Oh, I'm currently using SDK version 1.5.1. I tried upgrading to the current 1.7.0 but the peripheral_uart example (which I'm using as my starting point) doesn't compile in that version. I get an error about a missing psa_crypto_slot_manager file or something? For now I'm just going to proceed with my v1.5.1 project unless someone thinks my issue was fixed in a newer version.
I can see the data on my logic analyzer. The clock is pretty quick (6.5MHz) but it looks like it should work.
I'm getting NRFX_SPIS_XFER_DONE interrupts, but the rx_amount is always 0.
In chasing the problem I was concerned about making sure that the pin setup macros worked for GPIO on port 1 because my chip select pin is pin 1.02. I found that none of the PSEL registers for SPIS0_NS are getting set to what I want them to, and I assume this is the source of my problem.
Here's the current state of my code:
#define GPIO_PORT_1_OFFSET 32 #define PIN_SCK 12 #define PIN_MOSI 22 #define PIN_MISO 20 #define PIN_CSN GPIO_PORT_1_OFFSET + 2 #define SPIS_NR 0 // Using SPI0 #define SPI_BUFFER_SIZE 256 //== Global Variables ======================================================== nrfx_spis_t spi_slave_instance = NRFX_SPIS_INSTANCE(SPIS_NR); nrfx_spis_config_t spis_config = NRFX_SPIS_DEFAULT_CONFIG(PIN_SCK,PIN_MOSI,PIN_MISO,PIN_CSN); uint8_t rx_buffer[SPI_BUFFER_SIZE]; uint8_t tx_buffer[SPI_BUFFER_SIZE]; //== Function prototypes ===================================================== void spis_event_handler(nrfx_spis_evt_t const *p_event, void *p_context); //============================================================================ //---------------------------------------------------------------------------- // Name : // Desc : // Ins : none // Outs : none //---------------------------------------------------------------------------- void spi_comms_init(void) { int err; err = nrfx_spis_init(&spi_slave_instance, &spis_config, spis_event_handler, NULL); if(err != NRFX_SUCCESS){ LOG_WRN("Error with init.\n"); } else { LOG_WRN("SPIS started.\n"); } err = nrfx_spis_buffers_set(&spi_slave_instance, tx_buffer, sizeof(tx_buffer), rx_buffer, sizeof(rx_buffer)); if(err != NRFX_SUCCESS) { LOG_WRN("Error with setting.\n"); } IRQ_DIRECT_CONNECT(SPIM0_SPIS0_TWIM0_TWIS0_UARTE0_IRQn, 0, nrfx_spis_0_irq_handler, 0); irq_enable(SPIM0_SPIS0_TWIM0_TWIS0_UARTE0_IRQn); } //---------------------------------------------------------------------------- // Name : // Desc : // Ins : none // Outs : none //---------------------------------------------------------------------------- void spis_event_handler(nrfx_spis_evt_t const *p_event, void *p_context) { int err; switch(p_event->evt_type){ case NRFX_SPIS_XFER_DONE: if (p_event->rx_amount > 0) { LOG_INF("received 0x%02x 0x%02x 0x%02x 0x%02x\n", rx_buffer[0], rx_buffer[1], rx_buffer[2], rx_buffer[3]); } //LOG_INF("Rx bytes: %u\n", p_event->rx_amount); err = nrfx_spis_buffers_set(&spi_slave_instance, tx_buffer, sizeof(tx_buffer), rx_buffer, sizeof(rx_buffer)); if(err != NRFX_SUCCESS){ LOG_WRN("Error with setting.\n"); } break; case NRFX_SPIS_BUFFERS_SET_DONE: //LOG_WRN("buffers set\n"); break; case NRFX_SPIS_EVT_TYPE_MAX: break; default: ; } }
I wondered if it would make a difference if I tried to assign my pins using the project overlay file, so I added a prj.overlay file as follows - no difference in behavior
&spi0 { compatible = "nordic,nrf52-spis"; label = "SPI_0"; status = "okay"; mosi-pin = <22>; miso-pin = <20>; sck-pin = <12>; csn-pin = <34>; def-char = <0xFF>; };
I stopped the debugger as soon as I get to main and those SPIS0_NS PSEL values are there as soon as I hit my breakpoint, and none of my SPI setup code changes them. I also tried changing my prj.overlay to assign completely different pin numbers and that has no effect either.
Any ideas?
Thanks!
Glen