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, ®, sizeof(reg), true); read_sensor_data(); do { __WFE(); }while (m_xfer_done == false); read_sensor_data(); NRF_LOG_FLUSH(); } }