I need to read a SPI device every fixed milliseconds so I thought to create a TIMER and read SPI slave inside its handler. But there are some problems cause I get all zero values and in some cases I get the "SPI timeout transfer" error. I think that is a problem related to the ineraction between the SPI and TIMER interrupts.
The TIMER definition:
K_TIMER_DEFINE( fetchlDataTimer, Timer_Handler, NULL ); ... k_timer_start( &fetchDataTimer, K_SECONDS( 1 ), K_SECONDS( 1 ) );
The SPI read function inside the TIMER handler:
void ICM20948_Read_Reg( const struct spi_dt_spec *spec, uint8_t reg, uint8_t *data, uint8_t dataLen ) { reg |= 0x80; const struct spi_buf spiBufTx = { .buf = ®, .len = 1 }; struct spi_buf_set tx = { .buffers = &spiBufTx, .count = 1 }; struct spi_buf spiBufRx[] = { { .buf = NULL, .len = 1 }, { .buf = data, .len = dataLen } }; struct spi_buf_set rx = { .buffers = spiBufRx, .count = 2 }; spi_transceive_dt( spec, &tx, &rx ); }
1) What's the problem?
2) When I create a timer with the K_TIMER_DEFINE macro am I going to use a TIMERx peripheral? If so, how can I choose one in particular?
3) OUT TOPIC: is the above SPI read routine a good choice in terms of time performance? If not, have you some suggestions?