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

Unable to communicate with DS1307 using Twi sensor example SDKv15.3.0 on Rigardo nRF52 DK

HI

I started off to test all the drivers before the actual development process kickstarts.I tried using the TWI sensor example for an i2c driver check.I used a DS1307 simple RTC for it.But i am unable to even send my first data frame and here is my code.when I tried debugging the code ,it seems to be stuck in the while loop for completion check of  first tx transmission .
Can you point out my mistakes and any other suggestion i need to check .

Here are the complete specs 
Board Rigardo BMD 350

SDK v15.3.0

DS1307 connection with Rigardo board

SCL PIN-->pin0.27

SDA PIN-->pin0.26

GND      -->GND

VCC (not connected using coin cell battery for power )

Rigardo board is powered by USB wire

Thanks in advance

#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

/* Common addresses definition for temperature sensor. */
#define LM75B_ADDR          (0x90U >> 1)

#define LM75B_REG_TEMP      0x00U
#define LM75B_REG_CONF      0x01U
#define LM75B_REG_THYST     0x02U
#define LM75B_REG_TOS       0x03U


#define DS1307_ADDR        (0x68)

#define DS1307_SEC (0x00)
#define DS1307_MIN (0x01)
#define DS1307_HRS (0x02)
#define DS1307_DAY (0x03)
#define DS1307_DATE (0x04)
#define DS1307_MONTH (0x05)
#define DS1307_YEAR (0x06)


typedef struct
{
    uint8_t s;
    uint8_t m;
    uint8_t h;
} sum_t;

static sum_t m_sum = {0};
/* Indicates if operation on TWI has ended. */
static volatile bool m_xfer_done = false;

/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

/* Buffer for samples read from temperature sensor. */
static uint8_t m_sample[3];

/**
 * @brief Function for setting active mode on MMA7660 accelerometer.
 */
void LM75B_set_mode(void)
{
    ret_code_t err_code;
uint8_t reg[2] = {0x00,0x00};
    err_code = nrf_drv_twi_tx(&m_twi,DS1307_ADDR, reg, sizeof(reg), false);  
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
	
    /* Writing to LM75B_REG_CONF "0" set temperature sensor in NORMAL mode. */
   
    uint8_t reg1[8] = {DS1307_SEC,0x15,0x59,0x14,0x06,0x05,0x07,0x19};
    err_code = nrf_drv_twi_tx(&m_twi,DS1307_ADDR, reg1, sizeof(reg1), false);  
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
		/*
		m_xfer_done = false;
    uint8_t reg1[2] = {DS1307_MIN,0x38};
    err_code = nrf_drv_twi_tx(&m_twi,DS1307_ADDR, reg1, sizeof(reg1), false);  
     APP_ERROR_CHECK(err_code);
		while (m_xfer_done == false);
		
		m_xfer_done = false;
		uint8_t reg2[2] = {DS1307_HRS,0x14};
    err_code = nrf_drv_twi_tx(&m_twi, DS1307_ADDR, reg2, sizeof(reg2), false);  
		APP_ERROR_CHECK(err_code);
		while (m_xfer_done == false);		
		
		
		m_xfer_done = false;
		uint8_t reg3[2] = {DS1307_DAY,0x06};
    err_code = nrf_drv_twi_tx(&m_twi, DS1307_ADDR, reg3, sizeof(reg3), false);  
		APP_ERROR_CHECK(err_code);
		while (m_xfer_done == false);		
		
		m_xfer_done = false;
		uint8_t reg4[2] = {DS1307_DATE,0x05};
    err_code = nrf_drv_twi_tx(&m_twi, DS1307_ADDR, reg4, sizeof(reg3), false);  
		APP_ERROR_CHECK(err_code);
		while (m_xfer_done == false);	
		
    m_xfer_done = false;
		uint8_t reg5[2] = {DS1307_MONTH,0x07};
    err_code = nrf_drv_twi_tx(&m_twi, DS1307_ADDR, reg5, sizeof(reg3), false);  
		APP_ERROR_CHECK(err_code);
		while (m_xfer_done == false);	

    m_xfer_done = false;
		uint8_t reg6[2] = {DS1307_YEAR,0x19};
    err_code = nrf_drv_twi_tx(&m_twi, DS1307_ADDR, reg6, sizeof(reg3), false);  
		APP_ERROR_CHECK(err_code);
		while (m_xfer_done == false);			
		*/
}

/**
 * @brief Function for handling data from temperature sensor.
 *
 * @param[in] temp          Temperature in Celsius degrees read from sensor.
 */
__STATIC_INLINE void data_handler(uint8_t *temp)
{
    //NRF_LOG_INFO("Temperature: %d Celsius degrees.", temp);

    
    /* Subtracting oldest sample. */
    m_sum.s    = temp[1];
    m_sum.m    = temp[2];
    m_sum.h    = temp[3];
	NRF_LOG_INFO("%2x: %2x:%2x",
                m_sum.h ,
                m_sum.m ,
                m_sum.s 
           );
       

}

/**
 * @brief TWI events handler.
 */
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
    switch (p_event->type)
    {
        case NRF_DRV_TWI_EVT_DONE:
            if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX)
            {
                data_handler(m_sample);
            }
            m_xfer_done = true;
            break;
        default:
            break;
    }
}

/**
 * @brief UART initialization.
 */
void twi_init (void)
{
    ret_code_t err_code;

    const nrf_drv_twi_config_t twi_lm75b_config = {
       .scl                = ARDUINO_SCL_PIN,
       .sda                = ARDUINO_SDA_PIN,
       .frequency          = NRF_DRV_TWI_FREQ_100K,
       .interrupt_priority = APP_IRQ_PRIORITY_LOW,
       .clear_bus_init     = false
    };

    err_code = nrf_drv_twi_init(&m_twi, &twi_lm75b_config, twi_handler, NULL);
    APP_ERROR_CHECK(err_code);

    nrf_drv_twi_enable(&m_twi);
}

/**
 * @brief Function for reading data from temperature sensor.
 */
static void read_sensor_data()
{
    m_xfer_done = false;

    /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
    ret_code_t err_code = nrf_drv_twi_rx(&m_twi, DS1307_ADDR, (uint8_t*)&m_sample, 3);
    APP_ERROR_CHECK(err_code);
}

/**
 * @brief Function for main application entry.
 */
int main(void)
{
    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();
    const uint8_t reg= 0x00;
    NRF_LOG_INFO("\r\nTWI sensor example started.");
    NRF_LOG_FLUSH();
    twi_init();
    LM75B_set_mode();

    while (true)
    {
        nrf_delay_ms(500);
        ret_code_t err_code = nrf_drv_twi_tx(&m_twi, DS1307_ADDR, &reg, sizeof(reg), true);
			  read_sensor_data();
        do
        {
            __WFE();
        }while (m_xfer_done == false);

        read_sensor_data();
        NRF_LOG_FLUSH();
    }
}

Parents Reply
  • Hi

    Did you capture a plot from the working device also to see what might be different?

    I agree with Andrew that the rise times are a bit high, but it doesn't look bad enough to disrupt communication completely. The scope probe itself will add some capacitance, so if it still doesn't work when you remove the probe it is probably not a capacitance issue. 

    Best regards
    Torbjørn

Children
No Data
Related