SPI not working

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

Parents Reply Children
Related