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.

Parents
  • 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.

Reply
  • 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.

Children
  • 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.

Related