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

SPI doesn't work in nrf52810 while emulating nrf52810 in nrf52832DK was successful

Our project is to read the gyro (lis3dh) by using SPI communication.

Since the infocenter says that using nrf52832 for developing nrf52810 is okay.

We currently developed codes by using nrf52832DK for nrf52810.

SPI was successful in the emulation and we have tried to transfer the code to the actual nrf52810 chip as the infocenter explained and correcting some bugs

emulating and transferring process:

https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.0.0%2Fnrf52810_user_guide.html&cp=4_0_0_5_0

correcting bugs: SPIM0 peripheral

https://devzone.nordicsemi.com/f/nordic-q-a/35145/crashing-during-the-spi-transfer-on-nrf52810

We thought that mapping the pins would be enough but it was not.

In emulation, reading the sensor was successful but in the actual nrf52810 environment, SPI reads only '0xff'

For double checking, blinking LED and BLE NUS was successful but the spi communication was failed.

How can we solve this problem?

Does the transferring procedure has some bug?

Parents
  • How can we solve this problem

    The first step is to see what's actually happening on the wires; eg, using an oscilloscope.

    And use the debugger to see what's happening in your code.

  • Thanks. Here is a schematic of our code

    #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. */
    
    void spi_init(void)
    {
    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin = 16;
    spi_config.miso_pin = 15;
    spi_config.mosi_pin = 14;
    spi_config.sck_pin = 12;
    spi_config.mode = NRF_DRV_SPI_MODE_3;
    spi_config.frequency = NRF_DRV_SPI_FREQ_4M;
    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
    }
    
    uint8_t SPI_Read(uint8_t cmd, uint8_t cmd_len, int delay)
    {
    memset(m_tx_buf,0,3);
    memset(m_rx_buf,0,4);
    
    m_tx_buf[0]=cmd;
    spi_xfer_done = false;
    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, cmd_len,m_rx_buf, cmd_len));
    while(!spi_xfer_done); // sending command
    
    m_tx_buf[0]=0xFF;
    spi_xfer_done = false;
    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, cmd_len,m_rx_buf, cmd_len));
    while(!spi_xfer_done);
    return m_rx_buf[0]; // reading recieved data
    }
    
    uint8_t LIS3DH_ReadID(void)
    {
    uint8_t ret, cmd;
    
    cmd=0x8F;
    ret=SPI_Read( cmd, 1,DELAY_MS);
    
    nrf_delay_ms(DELAY_MS);
    return m_rx_buf[0];
    }
    
    main{
    
    spi_init();
    
    LIS3DH_ReadID();
    
    	NRF_LOG_INFO("[HHC] LIS3DH ID = 0x%x.", sensorId); //returns 0xff  only..
    
    } 

  • Thanks awneil. We will check the actual signal by using oscillo scope tommorow since we have to borrow it...

    We just used segger RTT debuger and log_info for debugging but we couldn't find any insight by using them. Is there any proper way to check the spi by using debugger?

  • You use the debugger to step through your code, set breakpoints, examine variables, etc

  • I already used the breakpoints but couldn't find anything..

    I edited the source code.

    Using oscilloscope may give me some breakthroughs.

    I will reply later.

    My concern is that bugs exist in the SDK 15.0

  • These are capture of osciloscope of nrf53820

    SCK and CS:

    we used nrf_gpio_pin_set and nrf_gpio_pin_clear to handle the cs 

    SCK and MOSI : 

    We send the read command (0x8f and 0xff) but there is no response from the sensor

    These are signals of nrf52810 emulation

    SCK and MISO (successful to read 0x33)

    SCK and MOSI (sending 0x8f and 0xff)

    Even if the same source code, there are some difference in SCK signal

    I can't understand how to deal with it 

  • Plug a USB stick in here:

    and get proper screenshots from the scope!

Reply Children
Related