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

NRFX SPIM with BLE template example

Hallo,

I request for your time and effort to solve the issue that I am facing at the moment. Any suggestions and solutions are highly appreciated.

Hardware: NRF52840DK , SPI sensor (MAX86141)

SDK: 17.02 

SoftDevice : S140

I have successfully written code to communicate with one of the SPI sensor (MAX86141) that I have with me using nrfx_spim driver. I am using SPIM instance 3. Please find the details below:

Driver: NRFX_SPIM

Instance: 3

Priority: 6

SPI PINS: CS-> 31 , MOSI-> 29 , MISO-> 30 , SCLK-> 28

I can properly read and write to the sensor without any issues. 

But now when I tried to add the BLE functionality to the project, I faces problem. I started with the ble_app_template program and then added my spi files for the sensor. I have also enabled NRFX_SPIM_ENABLE and NRFX_SPIM3_ENABLED in the SDK_config file. After adding all related headers and files, the program compile successfully. 

Here is my main function,

int main(void)
{
    uint8_t value;

    log_init();
    timers_init();
    NRF_LOG_INFO("Timer initialized \n");
    MAX86141_init();
    power_management_init();
    BleInit();
   
    NRF_LOG_INFO("Template example started.");
    application_timers_start();
    MAX86141_reg_read(REG_PART_ID, &value);
    NRF_LOG_INFO("Part ID &d \n",value);
 
    for (;;)
    {
        idle_state_handle();
    }
}

When I run the program, the application get stuck in the while loop inside the read function as shown in the screenshot below.

Screenshot

MAX86141_reg_read function:

void MAX86141_reg_read (uint8_t addr, uint8_t *data_out)
{
   memset(m_tx_buf, 0, 3);
   m_tx_buf[0] = addr;
   m_tx_buf[1] = READ;
   m_tx_buf[2] = 0x00;
  
   memset(m_rx_buf, 0, 3);
   
   spi_transfer_done = false;
   //APP_ERROR_CHECK(nrfx_spim_transfer(&spi, m_tx_buf, 3, m_rx_buf, 3));
   nrfx_spim_xfer_desc_t xfer_desc2 = NRFX_SPIM_XFER_TRX(m_tx_buf, 3, m_rx_buf, 3); 
    APP_ERROR_CHECK( nrfx_spim_xfer(&spi, &xfer_desc2,0));
   while(spi_transfer_done == false){};

   *data_out = m_rx_buf[2];
   //NRF_LOG_INFO("Inside the read function. Value is :%d", m_rx_buf[2] );
}

As you can see from the debug information, the sensor is not responding. But when I use the same code without BLE, the sensor works fine. 

Are there any configuration that I am missing out? I would really appreciate your help.

Update:

I checked with a scope. There are no activity in the spi lines. No clock, cs, miso and mosi. So i guess the driver is not working.

Thank you for your time.

best regards

Parents Reply
  • I need some more time to Analyse the signals. The SPI lines are functioning properly now. The application is not advertising now. At times it enters the while loop in the read function of MAX86141 and does not exit and enters the NRF_BREAKPOINT_COND inside the app_error_weak.c.  I will get back as soon as I have enough information about what is causing the issue.

Children
No Data
Related