Hi All,
I am trying to use TWI on NRF52832 using SDK 12.3 + SD132 but without any success.
For some reason, there is no signal coming out on the configured SDA + SCL pins. I checked using a logic analyzer. I tried using both the blocking and non blocking mode without any success. The pins that I am using are
SDA : 13
SCL : 12
My sdk_config.h section is
// <e> TWI_ENABLED - nrf_drv_twi - TWI/TWIM peripheral driver //========================================================== #ifndef TWI_ENABLED #define TWI_ENABLED 1 #endif #if TWI_ENABLED // <o> TWI_DEFAULT_CONFIG_FREQUENCY - Frequency // <26738688=> 100k // <67108864=> 250k // <104857600=> 400k #ifndef TWI_DEFAULT_CONFIG_FREQUENCY #define TWI_DEFAULT_CONFIG_FREQUENCY 26738688 #endif // <q> TWI_DEFAULT_CONFIG_CLR_BUS_INIT - Enables bus clearing procedure during init #ifndef TWI_DEFAULT_CONFIG_CLR_BUS_INIT #define TWI_DEFAULT_CONFIG_CLR_BUS_INIT 0 #endif // <q> TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit #ifndef TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT #define TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 #endif // <o> TWI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority // <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice // <0=> 0 (highest) // <1=> 1 // <2=> 2 // <3=> 3 // <4=> 4 // <5=> 5 // <6=> 6 // <7=> 7 #ifndef TWI_DEFAULT_CONFIG_IRQ_PRIORITY #define TWI_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // <e> TWI0_ENABLED - Enable TWI0 instance //========================================================== #ifndef TWI0_ENABLED #define TWI0_ENABLED 1 #endif #if TWI0_ENABLED // <q> TWI0_USE_EASY_DMA - Use EasyDMA (if present) #ifndef TWI0_USE_EASY_DMA #define TWI0_USE_EASY_DMA 1 #endif #endif //TWI0_ENABLED // </e> // <e> TWI1_ENABLED - Enable TWI1 instance //========================================================== #ifndef TWI1_ENABLED #define TWI1_ENABLED 0 #endif #if TWI1_ENABLED // <q> TWI1_USE_EASY_DMA - Use EasyDMA (if present) #ifndef TWI1_USE_EASY_DMA #define TWI1_USE_EASY_DMA 0 #endif #endif //TWI1_ENABLED // </e> // <e> TWI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TWI_CONFIG_LOG_ENABLED #define TWI_CONFIG_LOG_ENABLED 0 #endif #if TWI_CONFIG_LOG_ENABLED // <o> TWI_CONFIG_LOG_LEVEL - Default Severity level // <0=> Off // <1=> Error // <2=> Warning // <3=> Info // <4=> Debug #ifndef TWI_CONFIG_LOG_LEVEL #define TWI_CONFIG_LOG_LEVEL 3 #endif // <o> TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. // <0=> Default // <1=> Black // <2=> Red // <3=> Green // <4=> Yellow // <5=> Blue // <6=> Magenta // <7=> Cyan // <8=> White #ifndef TWI_CONFIG_INFO_COLOR #define TWI_CONFIG_INFO_COLOR 0 #endif // <o> TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. // <0=> Default // <1=> Black // <2=> Red // <3=> Green // <4=> Yellow // <5=> Blue // <6=> Magenta // <7=> Cyan // <8=> White #ifndef TWI_CONFIG_DEBUG_COLOR #define TWI_CONFIG_DEBUG_COLOR 0 #endif #endif //TWI_CONFIG_LOG_ENABLED // </e> #endif //TWI_ENABLED // </e>
My TWI initialization code is
bool INTERNAL_I2C_Init(void) { //INITIALZE INTERNAL_I2CTWIMASTER_TWI_INST_USE_EASY_DMA //ONLY INITIALIZE IF NOT ALREADY DONE if(s_initialized) { return true; } //INITIALIZE DRIVER ret_code_t ret; const nrf_drv_twi_config_t config = { .scl = BSP_EXTERNAL_DS3231_SCL, .sda = BSP_EXTERNAL_DS3231_SDA, .frequency = NRF_TWI_FREQ_100K, .interrupt_priority = APP_IRQ_PRIORITY_LOW, .clear_bus_init = false }; do { ret = nrf_drv_twi_init(&s_internal_twi_handle, &config, s_internal_i2c_event_handler, NULL); if(ret != NRF_SUCCESS) { break; } nrf_delay_ms(2000); nrf_drv_twi_enable(&s_internal_twi_handle); nrf_delay_ms(2000); UTIL_DebugPrint(MODULE_NAME_I2C"%s OK\n", __FUNCTION__); s_initialized = true; return true; }while(0); UTIL_DebugPrint(MODULE_NAME_I2C"%s FAIL\n", __FUNCTION__); return false; }
and the write function is
bool INTERNAL_I2C_WriteData(uint8_t i2c_add, uint8_t reg_add, uint8_t* buff, uint8_t len) { //SEND THE SPECIFIED DATA OF SPECIFIED LENGTH TO THE SPECIFIED REGISTER ADDRESS //THROUGH I2C INTERFACE //WAIT FOR ONGOING OPERATOIN TO FINISH while(s_operation_ongoing) { } ret_code_t ret; uint8_t final_data[len + 1]; //CREATE DATA BUFFER final_data[0] = reg_add; memcpy(&final_data[1], (const void * restrict)buff, len); UTIL_DebugPrint(MODULE_NAME_I2C"A\n"); //SLA+W + REGISTER_ADDRESS + WRITE_DATA + STOP s_operation_ongoing = true; ret = nrf_drv_twi_tx(&s_internal_twi_handle, i2c_add, final_data, (len + 1), false); UTIL_DebugPrint(MODULE_NAME_I2C"tx ret code %u\n", ret); if(ret != NRF_SUCCESS) { return false; } UTIL_DebugPrint(MODULE_NAME_I2C"B\n"); return true; }
When I write some data to the twi device (DS3231), the i2c write function returns with the data is never actually sent out. I checked the i2c device and it is working fine. I am able to communicate to it using bus pirate.
Not sure what I could be doing wrong here. Any help is appreciated.