This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

spi configuration related issue

HI all

        I am facing SPI cofiguration issue on nRF 52 DK.I am using PAJ7025R2 sensor and will act as a slave, and nRF52 acts as a master.Currently i am not getting any data from MISO pin.

I am using spi example as a reference.

configuration settings:

#define NRF_DRV_SPI_DEFAULT_CONFIG \
{ \
.sck_pin = NRF_DRV_SPI_PIN_NOT_USED, \
.mosi_pin = NRF_DRV_SPI_PIN_NOT_USED, \
.miso_pin = NRF_DRV_SPI_PIN_NOT_USED, \
.ss_pin = NRF_DRV_SPI_PIN_NOT_USED, \
.irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY, \
.orc = 0xFF, \
.frequency = NRF_DRV_SPI_FREQ_1M, \
.mode = NRF_DRV_SPI_MODE_2, \
.bit_order = NRF_DRV_SPI_BIT_ORDER_LSB_FIRST, \
}

i have probed on C.R.O also, where i am getting all(SCK,MOSI,CS) signals except MISO signal.

i have changed configuration only, i didn't change anything in low level drivers.

for my task, is it require to change anything low level also?

if so, please help me.  

below is my main application..

#include "nrf_drv_spi.h"
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#define SPI_INSTANCE 0 /**< SPI instance index. */
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE); /**< SPI instance. */
static volatile bool spi_xfer_done; /**< Flag used to indicate that SPI instance completed the transfer. */

//#define TEST_STRING "Nordic"
//static uint8_t m_tx_buf[] = TEST_STRING; /**< TX buffer. */
static uint8_t m_tx_buf[] = {0x00,0x64,0x00,0x80,0x02,0x03}; /**< TX buffer. */
static uint8_t m_rx_buf[2] = {0x00}; /**< RX buffer. */
static const uint8_t m_length = sizeof(m_tx_buf); /**< Transfer length. */

/**
* @brief SPI user event handler.
* @param event
*/
void spi_event_handler(nrf_drv_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));
for (int i=0; i<2; i++)
{
NRF_LOG_INFO(" m_rx_buf[%d] = 0x%x\r\n", i, m_rx_buf[i]);

}

// }
}

int main(void)
{
bsp_board_init(BSP_INIT_LEDS);

APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();

nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = SPI_SS_PIN;
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin = SPI_SCK_PIN;
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));

NRF_LOG_INFO("SPI example started.");
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &m_tx_buf[0], 1, NULL, 0));//sending data to slave
nrf_delay_ms(200);

APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &m_tx_buf[1], 1, NULL, 0));//sending data to slave
nrf_delay_ms(200);

APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &m_tx_buf[2], 1, NULL, 0));//sending data to slave
nrf_delay_ms(200);


while (1)
{
// Reset rx buffer and transfer done flag
memset(m_rx_buf, 0, m_length);
spi_xfer_done = false;

//APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, 5, m_rx_buf, m_length));
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &m_tx_buf[3], 1, NULL, 0));//sending data to slave
nrf_delay_ms(5000);

APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &m_tx_buf[4], 1, NULL ,0));//sending data to slave
nrf_delay_ms(5000);

// APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, NULL, 0,&m_rx_buf[0],2));//receive data from slave
// nrf_delay_ms(5000);

NRF_LOG_INFO(" m_rx_buf[0] = 0x%x, m_rx_buf[0] = 0x%x\r\n",m_rx_buf[0], m_rx_buf[1]);



while (!spi_xfer_done)
{
__WFE();
}

NRF_LOG_FLUSH();

bsp_board_led_invert(BSP_BOARD_LED_0);
nrf_delay_ms(200);
}
}

any help that could be greatful.

  • Hi Akash,

    I assume that you are using the SPI example found in SDKv15 in folder [nRF5_SDK_15.0\examples\peripheral\spi\] as reference?

    No it is not required to change anything on the low level.

    I am interested if you have connected to the correct pins as the pins are defined in the sdk_config.h? (from the default unmodified example it should be the pins commented)

        nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
        spi_config.ss_pin   = SPI_SS_PIN;  		// pin 29
        spi_config.miso_pin = SPI_MISO_PIN;  //  pin 28
        spi_config.mosi_pin = SPI_MOSI_PIN;  //  pin  4
        spi_config.sck_pin  = SPI_SCK_PIN;   //  pin  3
        APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));

     Please check the pins with a logic analyzer such as saleae or use a scope on those pins to double check that you actually are sending the correct data out of the chosen pins.

     

    Best regards,
    Martin L.

  • Hi Martin,

    Thanks for your reply.

    yes. I am using  [nRF5_SDK_15.0\examples\peripheral\spi\] as a reference.

    yes. I am using same pins which are defined in sdk_config.h(SS = 29,MISO = 28,MOSI = 4,SCK = 3), and i have connected the connections properly.

    And i have verified the data(over MOSI pin) over C.R.O, where i am getting  expecting data.

    But i am not getting any data(if i probe on MISO pin) from slave device.

    is there any configuration required that changing shifting bit(MSB/LSB) and mode(0,1,2,3)?

    I am trying to read chip id of slave device, but i was not getting any response from device.

    For same slave device, i worked on STM32 where it was working fine.

    below code is for configuration settings.

    #define NRF_DRV_SPI_DEFAULT_CONFIG \
    { \
    .sck_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .mosi_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .miso_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .ss_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY, \
    .orc = 0xFF, \
    .frequency = NRF_DRV_SPI_FREQ_8M, \
    .mode = NRF_DRV_SPI_MODE_3, \
    .bit_order = NRF_DRV_SPI_BIT_ORDER_LSB_FIRST, \
    }

     nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin = SPI_SS_PIN;
    spi_config.miso_pin = SPI_MISO_PIN;
    spi_config.mosi_pin = SPI_MOSI_PIN;
    spi_config.sck_pin = SPI_SCK_PIN;
    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL).

    finally,i am not getting any response from slave device.

    regards,

    akash.

  • akash naidu said:
    is there any configuration required that changing shifting bit(MSB/LSB) and mode(0,1,2,3)?

    You change that in:

    #define NRF_DRV_SPI_DEFAULT_CONFIG \
    { \
    .sck_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .mosi_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .miso_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .ss_pin = NRF_DRV_SPI_PIN_NOT_USED, \
    .irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY, \
    .orc = 0xFF, \
    .frequency = NRF_DRV_SPI_FREQ_8M, \
    .mode = NRF_DRV_SPI_MODE_3, \
    .bit_order = NRF_DRV_SPI_BIT_ORDER_LSB_FIRST, \
    }

    According to what the mode/freq. your slave requires.

     

    What configurations did you set for the STM32 master?

    Did you check every signal from master-slave? sclk,ss ....

    What are you sending to the slave?

  • My slave is supports SPI3(CPOL = 1,CPHA = 1) mode, and 14Mhz frequency.

    below code is for STM32 master configuration..

      /* SPI1 parameter configuration*/
      hspi1.Instance = SPI1;
      hspi1.Init.Mode = SPI_MODE_MASTER;
      hspi1.Init.Direction = SPI_DIRECTION_2LINES;
      hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
      hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
      hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
      hspi1.Init.NSS = SPI_NSS_SOFT;
      hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
      hspi1.Init.FirstBit = SPI_FIRSTBIT_LSB;
      hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
      hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
      hspi1.Init.CRCPolynomial = 10;

    I have verified all signals(SCK,SS,MOSI) over C.R.O.I have been getting all signals properly.

    static uint8_t m_tx_buf[] = {0x80,0x02}; /**< TX buffer. */

    i am sending 2 bytes of data.

    first byte is used to set as read mode in slave.

    second byte is used to read the chip id of the slave.

  • Hi Akash,

    Could you compare the MOSI with SCLK (as well as SS) for the STM32 and the nRF52 to see that they actually behave the same? 

    I think that will give you a good clue what is going on.

    I want to confirm that the data sent out of the STM32 is exactly the same as the data sent out from nRF52. (but my hunch is that this is not the case)

     

Related