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,

    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)

     

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

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

Children
No Data
Related