Dear Ladies and Gentlemen,
I am trying to get a DPS310 pressure sensor to work via SPI. As I use I2C for other purposes, I chose SPI1 channel. The given SPI example in SDK 17.02 sadly still uses the legacy driver, I wanted to use the new nrfx interface described in:
https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/group__nrf__spi.html
So I coded:
#include "spi.h"
#define strLen 64
enum pin_t{_red=0, _green=1, __red=4, __green=8, __bt1=31, __sck=26, __mosi=27, __miso=7, __csbar=22};
#define SPI_INSTANCE 1 /**< SPI instance index. */
static const nrfx_spi_t spi = NRFX_SPI_INSTANCE(SPI_INSTANCE); /**< SPI instance. */
static volatile bool spi_xfer_done; /**< Flag used to indicate that SPI instance completed the transfer. */
static uint8_t m_rx_buf[strLen + 1]; /**< RX buffer. */
static const uint8_t m_length = strLen; /**< Transfer length. */
/**
* @brief SPI user event handler.
* @param event
*/
void spi_event_handler(nrfx_spi_evt_t const* p_event, void* p_context)
{
spi_xfer_done = true;
NRF_LOG_INFO("Transfer completed.");
if (m_rx_buf[0] != 0)
{
NRF_LOG_INFO(" Received:");
NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
}
}
char* DPS_reg_read(uint8_t regIndex)
{
ret_code_t err_code;
uint8_t regSel[1];
regSel[0]=regIndex;
memset(m_rx_buf, 0, m_length);
spi_xfer_done = false;
nrfx_spi_xfer_desc_t m_pos_write;
m_pos_write.p_tx_buffer = regSel;
m_pos_write.tx_length = sizeof(regSel);
m_pos_write.p_rx_buffer = m_rx_buf;
m_pos_write.rx_length = m_length;
//nrf_gpio_pin_clear(__csbar); //Set CS to 0 (on)
err_code=nrfx_spi_xfer(&spi, &m_pos_write, 0);
APP_ERROR_CHECK(err_code);
while (!spi_xfer_done)
{
__WFE();
}
//nrf_gpio_pin_set(__csbar); //Set CS to 1 (off)
return m_rx_buf;
}
/**@brief Function for initializing the nrf log module. */
static void log_init(void)
{
ret_code_t err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
NRF_LOG_DEFAULT_BACKENDS_INIT();
}
int main(void)
{
log_init();
NRF_LOG_INFO("Log on.");
nrfx_spi_config_t spi_config = NRFX_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = __csbar;//SPI_SS_PIN;
spi_config.miso_pin = __miso;//SPI_MISO_PIN;
spi_config.mosi_pin = __mosi;//SPI_MOSI_PIN;
spi_config.sck_pin = __sck;//SPI_SCK_PIN;
err_code = nrfx_spi_init(&spi, &spi_config, spi_event_handler, NULL);
APP_ERROR_CHECK(err_code);
char* res=DPS_reg_read(0x28);
NRF_LOG_INFO("Read: %d", res[0]);
// Enter main loop.
for (;;)
{
idle_state_handle();
}
return 0;
}
But the example never puts out anything as soon as I call DPS_reg_read(); I also tried commenting out the __WFE(); in completion loop, but this also failed. I never saw, that the spi event handler reported transfer complete. Can you give advice, what must be done to get SPI to run?
Best regards,
Richard