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 Martin,

    I forgot to give reply.

    My problem has been resolved since 2 months back.

    Thanks for support.

    Best Regards,

    Akash.

  • Could you please share the solution since I am facing the same problem?? Thank you

  • check this spi configuration..

    int spiInit(void){
      //Structure for SPI master configuration, initialized by default values.
      spi_master_config_t spi_instance =  SPI_MASTER_INIT_DEFAULT;
      
      spi_instance.SPI_Pin_SCK  = 12;	
      spi_instance.SPI_Pin_MOSI = 14;
      spi_instance.SPI_Pin_MISO = 13;
      spi_instance.SPI_Pin_SS   = 15;
      
      spi_instance.SPI_CONFIG_CPOL = SPI_CONFIG_CPOL_ActiveLow;
      spi_instance.SPI_CONFIG_CPHA = SPI_CONFIG_CPHA_Trailing;
      
      spi_instance.SPI_CONFIG_ORDER = SPI_CONFIG_ORDER_LsbFirst;
      spi_instance.SPI_Freq = SPI_FREQUENCY_FREQUENCY_M8; // 125 Hz.
      
      spi_instance.SPI_PriorityIRQ = NRF_APP_PRIORITY_HIGH;	//with softdevice enabled.
      
      
      //Initialize SPI master.
      uint32_t err_code = spi_master_open(SPI_MASTER_0, &spi_instance);// init the SPI0 Instance.
      if( err_code == NRF_ERROR_INVALID_STATE ){
        
        return 2;
      }
      else if( err_code == NRF_ERROR_NULL ){
        
        return 3;
      }
      else if( err_code == NRF_ERROR_NOT_SUPPORTED ){
        
        return 4;
      }
      else if(err_code != NRF_SUCCESS){
        return 0;
      }
      //else it is good to go now.
      
      //Register SPI master event handler.
      spi_master_evt_handler_reg( SPI_MASTER_0, spi_master_event_handler);
      return 1;
    }

    spi event code

    void spi_master_event_handler(spi_master_evt_t spi_master_evt){
      switch(spi_master_evt.evt_type){
      case SPI_MASTER_EVT_TRANSFER_COMPLETED:
        // printf ("SPI_MASTER_EVT_TRANSFER_COMPLETED\r\n");
        //Transmission done.
        transmission_completed_spi = true;
        //rx_buffer must have received data now.
        break;
      default:
        // no implementation is required for now.
        break;
      }
    }

    for read/write spi API

    spi_master_send_recv(SPI_MASTER_0, tx_buffer_spi, TX_RX_MSG_LENGTH, rx_buffer_spi, TX_RX_MSG_LENGTH);

    i hope this could be helpful.

Related