Hello,
I'm trying to setup interrupt routines in SPIS1 peripheral.
I have a void IRQ function
void SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler(void) { if (NRF_SPIS1->EVENTS_ACQUIRED) { NRF_SPIS1->EVENTS_ACQUIRED = 0x0UL; spis_set_tx_buffer(tx_buffer, strlen(tx_buffer)); spis_set_rx_buffer(rx_buffer, sizeof(rx_buffer)); NRF_SPIS1->TASKS_RELEASE = true; } if (NRF_SPIS1->EVENTS_END) { NRF_SPIS1->EVENTS_END = 0x0UL; NRF_SPIS1->TASKS_ACQUIRE = true; } if (NRF_SPIS1->EVENTS_ENDRX) { NRF_SPIS1->EVENTS_ENDRX = 0x0UL; NRF_SPIS1->TASKS_ACQUIRE = true; } }
But it seems like it never gets called
my init function
void spis_init(void) { spis_pins_init(); spis_set_tx_buffer(NULL, 0); spis_set_rx_buffer(NULL, 0); spis_configure(); spis_def_set(0xFF); spis_orc_set(0xFF); NRF_SPIS1->EVENTS_END = 0x0UL; NRF_SPIS1->EVENTS_ACQUIRED = 0x0UL; spis_shorts_enable(SPIS_SHORTS_END_ACQUIRE_Msk); spis_interrupt_enable(SPIS_INTENSET_ACQUIRED_Msk); spis_interrupt_enable(SPIS_INTENSET_END_Msk); NVIC_SetPriority(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn, 6); NVIC_ClearPendingIRQ(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn); NVIC_EnableIRQ(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn); NRF_SPIS1->TASKS_ACQUIRE = true; NRF_SPIS1->ENABLE = (SPIS_ENABLE_ENABLE_Enabled << SPIS_ENABLE_ENABLE_Pos); }
some static functions
static volatile uint8_t tx_buffer[32] = "Hello."; static volatile uint8_t rx_buffer[32]; static void spis_pins_init(void) { gpio_config_input(MOSI_PIN, GPIO_PIN_CNF_PULL_Disabled); gpio_config_input(MISO_PIN, GPIO_PIN_CNF_PULL_Disabled); gpio_config_input(CLK_PIN, GPIO_PIN_CNF_PULL_Disabled); gpio_config_input(CS_PIN, GPIO_PIN_CNF_PULL_Disabled); NRF_SPIS1->PSEL.MOSI = MOSI_PIN; NRF_SPIS1->PSEL.MISO = MISO_PIN; NRF_SPIS1->PSEL.SCK = CLK_PIN; NRF_SPIS1->PSEL.CSN = CS_PIN; } static void spis_set_rx_buffer(uint8_t * buff, size_t length) { NRF_SPIS1->RXD.PTR = (uint32_t)buff; NRF_SPIS1->RXD.MAXCNT = length; } static void spis_set_tx_buffer(uint8_t * buff, size_t length) { NRF_SPIS1->TXD.PTR = (uint32_t)buff; NRF_SPIS1->TXD.MAXCNT = length; } static void spis_configure(void) { uint32_t config = SPIS_CONFIG_ORDER_MsbFirst; config |= (SPIS_CONFIG_CPOL_ActiveHigh << SPIS_CONFIG_CPOL_Pos) | (SPIS_CONFIG_CPHA_Leading << SPIS_CONFIG_CPHA_Pos); NRF_SPIS1->CONFIG = config; } // default 0xFF static void spis_def_set(uint8_t ch) { NRF_SPIS1->DEF = ch; } // default 0xFF static void spis_orc_set(uint8_t orc) { NRF_SPIS1->ORC = orc; } static void spis_shorts_enable(uint32_t mask) { NRF_SPIS1->SHORTS |= mask; } static void spis_enable(void) { NRF_SPIS1->ENABLE = (SPIS_ENABLE_ENABLE_Disabled << SPIS_ENABLE_ENABLE_Pos); } static void spis_interrupt_enable(uint32_t mask) { NRF_SPIS1->INTENSET = mask; }
This piece of code works fine without interrupt. But now I'm trying to enable interrupts to setup pointers for TX and RX buffers.