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

Error in establishing communication between ADT7410 and nRF52840.

Hey hi,

I am trying to establish communication between ADT7410 and nRF52840 using I2C that is the TWI module.

I have successfully checked the address of the ADT7410 with nRF52840.

The output of so is as follow:

00> <info> app: Application Started
00>
00> <info> app: Entered the twi_init loop
00>
00> <info> app: twi is been initalized
00>
00> <info> app: error_code is : 0x0
00>
00> <info> app: Successfully detected a device at address : 0x48
00>

But unable to get the temperature value from the sensor.

Tried debugging through NRF_LOG_INFO

the program doesn't print "The Error code 2 is %x" from the ADT7410_set_mode.

ADT7410_set_mode function is as follow:

void ADT7410_set_mode(void)
{
NRF_LOG_INFO("We have entered ADT7410 set mode");
NRF_LOG_FLUSH();
ret_code_t err_code;

/* Writing to LM75B_REG_CONF "0" set temperature sensor in NORMAL mode. */
uint8_t reg[2] = {ADT7410_REG_CONF, NORMAL_MODE};
err_code = nrf_drv_twi_tx(&m_twi, ADT7410_ADDR, reg, sizeof(reg), false);
APP_ERROR_CHECK(err_code);
NRF_LOG_INFO("The Error code 1 is %x",err_code);
NRF_LOG_FLUSH();
while (m_xfer_done == false);

/* Writing to pointer byte. */
reg[0] = ADT7410_REG_TEMP;
m_xfer_done = false;
err_code = nrf_drv_twi_tx(&m_twi, ADT7410_ADDR, reg,1, false);
APP_ERROR_CHECK(err_code);
NRF_LOG_INFO("The Error code 2 is %x",err_code);
NRF_LOG_FLUSH();
while (m_xfer_done == false);
}

Please do guide me to solve this issue.

  • When did it change from ADT7410 to SHT21 ?

    There is no activity on the wire

    So you need to find out why that is!

    Are the lines high or low?

    It could be a broken wire - so make sure you check as close as possible to the nRF, and also check as close as possible to the ADT7410 (or is it a SHT21 now?)

    Have you checked that you can actually set the pins high & low from code?

    In  your opening post:

    I have successfully checked the address of the ADT7410 with nRF52840

    so how, exactly, did you do that?

    You also said in an early reply:

    I have checked the hardware with DSO, and it's working perfectly

    So what's changed?

  • #include <stdio.h>
    #include "boards.h"
    #include "app_util_platform.h"
    #include "app_error.h"
    #include "nrf_drv_twi.h"
    #include "nrf_delay.h"
    
    
    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "nrf_log_default_backends.h"
    
    /* TWI instance ID. */
    #define TWI_INSTANCE_ID     0
    
    /* TWI instance. */
    static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
    
    /**
     * @brief UART initialization.
     */
    void twi_init (void)
    {
      NRF_LOG_INFO("Entered the twi_init loop");
    	NRF_LOG_FLUSH();
    	ret_code_t err_code;
    
       const nrf_drv_twi_config_t twi_config = {
           .scl                = ARDUINO_SCL_PIN,
           .sda                = ARDUINO_SDA_PIN,
           .frequency          = NRF_DRV_TWI_FREQ_100K,
           .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
           .clear_bus_init     = false
        };
    
        err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);
        APP_ERROR_CHECK(err_code);
        
        nrf_drv_twi_enable(&m_twi);
    }
    
    
    /**
     * @brief Function for main application entry.
     */
    int main(void)
    {
        ret_code_t err_code;
    	
    	  uint8_t address     = (0x48);
    	  uint8_t status      = (0x02);
    	  uint8_t sample_data = (0x00);
    	
    	  APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    	
    	  NRF_LOG_DEFAULT_BACKENDS_INIT();
    	
    	  NRF_LOG_INFO("Application Started");
    	  NRF_LOG_FLUSH();
    	
    		twi_init();
    		NRF_LOG_INFO("twi is been initalized");
    	  NRF_LOG_FLUSH();
    	
    			 err_code = nrf_drv_twi_rx(&m_twi, address, &sample_data, sizeof(sample_data));
    	     APP_ERROR_CHECK(err_code);
    			 NRF_LOG_INFO("error_code is : 0x%x",err_code);
    			 NRF_LOG_FLUSH();
    	
    	if(err_code == NRF_SUCCESS)
    	{
    		NRF_LOG_INFO("Successfully detected a device at address : 0x%x", address);
        NRF_LOG_FLUSH();
    	}
    	
        while (true)
        {
    			//Empty Loop.
        }
    }
    
    /** @} */

    Code for checking the address of the ADT7410 with nRF52840.

    The hardware is ADT7410 only.

    Have checked each and every connection it is working perfectly, the error is from the software side only.

    It isn't transmitting the signal properly and that why the NRF_DRV_TWI_EVT_DONE event is never raised.

  • Also, the SCL line is low and the SDA line is high that's the only thing that can be observed on DSO.

    I am using the twi_init function as it is, nothing is changing on it, so there should not be any error in initializing the pins.

  • So, again, what has changed since you said,

    I have checked the hardware with DSO, and it's working perfectly

    In the idle state, both lines should be high - due to the pullups.

    So, if SCL is low, something must be pulling it low. You need to find out what.

    Again, use some simple code (perhaps also the debugger) to prove that you can set the lines high and low.

    there should not be any error in initializing the pins

    Are you sure you are looking at the correct pins?

Related