TWI/I2C interrupt problem

Hi every body.

I have trying without success to attach an event handler function to the TWI.

I am reading a temperature and humidity sensor using I2C. In polling mode everything is working perfectly but when I try to attach a callback function, that function is never called.

Any idea about what I am doing wrong?

Here is the code I am implementing:

// ##########   M.I. BSP   ########## 
#include "bsp_handler.h"

// ##########   M.I. Lib   ########## 
#include "board.h"
#include "uart_handler.h"

#include "nrfx_twim.h"

// i2c parameters for SHT35
#define SHT35_I2C_ADDRESS			0x44
#define CMD_SOFT_RST0				0xA2	// soft reset command LSB
#define CMD_SOFT_RST1				0x30	// soft reset command MSB
#define HIGH_REP_WITH_STRCH0      	0x06	// request command LSB
#define HIGH_REP_WITH_STRCH1      	0x2C	// request command MSB

#define NRF52833_XXAA

static const char messageBuffer[] =
"*** DEMO EHAL-I2C Driver ***\r\n"
"*** Website: https://monitoreointeligente.com/ ***\r\n";

// setup UART
uart_instance SerialExt(UART0_PORT_AVAILABLE);
uint8_t StringDebug[SERIAL_BUFFER_SIZE] = {};
uint8_t rx_buffer[SERIAL_BUFFER_SIZE] = {};
uint8_t tx_buffer[SERIAL_BUFFER_SIZE] = {};

// setup I2C
nrfx_twim_t i2c_instance = NRFX_TWIM_INSTANCE(0);
uint8_t i2c_rx[6] = {0};
uint8_t i2c_tx[2] = {CMD_SOFT_RST1, CMD_SOFT_RST0};


void i2cEventHandler(nrfx_twim_evt_t const *p_event, void *p_context)
{
	int n;
	switch(p_event->type)
	{
		case NRFX_TWIM_EVT_BUS_ERROR:
			n = sprintf((char*)StringDebug, "Error\r\n");
			SerialExt.write(StringDebug, false, n);
			break;
		
		case NRFX_TWIM_EVT_DATA_NACK:
			n = sprintf((char*)StringDebug, "Data Nack\r\n");
			SerialExt.write(StringDebug, false, n);
			break;

		case NRFX_TWIM_EVT_DONE:
			n = sprintf((char*)StringDebug, "Done!\r\n");
			SerialExt.write(StringDebug, false, n);
			break;
		default:
			break;
	}
}


int main(void)
{
	halSetup();

	int n;
	float temp;
	float humidity;
	nrfx_twim_xfer_desc_t tx_config;
	nrfx_twim_xfer_desc_t rx_config;

	// setup UART
	SerialExt.setup(rx_buffer, SERIAL_BUFFER_SIZE, tx_buffer, SERIAL_BUFFER_SIZE, '\n');
	SerialExt.write((uint8_t*)messageBuffer, false, sizeof(messageBuffer));

	// setup I2C
	nrfx_twim_config_t i2c0_config = NRFX_TWIM_DEFAULT_CONFIG(17, 16);
	i2c0_config.interrupt_priority = 2;

	//if(nrfx_twim_init(&i2c_instance, &i2c0_config, NULL, NULL) == NRFX_SUCCESS)
	if(nrfx_twim_init(&i2c_instance, &i2c0_config, i2cEventHandler, NULL) == NRFX_SUCCESS)
	{
		n = sprintf((char*)StringDebug, "I2C init OK!\r\n");
		SerialExt.write(StringDebug, false, n);
	}
	nrfx_twim_enable(&i2c_instance);
	
	tx_config = NRFX_TWIM_XFER_DESC_TX(SHT35_I2C_ADDRESS, i2c_tx, sizeof(i2c_tx));
	rx_config = NRFX_TWIM_XFER_DESC_RX(SHT35_I2C_ADDRESS, i2c_rx, sizeof(i2c_rx));
	
	if(nrfx_twim_xfer(&i2c_instance, &tx_config, NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER) == NRFX_SUCCESS)
	{
		n = sprintf((char*)StringDebug, "Soft Reset command sent!\r\n");
		SerialExt.write(StringDebug, false, n);
	}
	

	while (true)
	{		
		// request command
		i2c_tx[0] = HIGH_REP_WITH_STRCH1;
		i2c_tx[1] = HIGH_REP_WITH_STRCH0;
		
		/*
		tx_config = NRFX_TWIM_XFER_DESC_TX(SHT35_I2C_ADDRESS, i2c_tx, sizeof(i2c_tx));

		if(nrfx_twim_xfer(&i2c_instance, &tx_config, NRFX_TWIM_FLAG_REPEATED_XFER) == NRFX_SUCCESS)
		{
			n = sprintf((char*)StringDebug, "Temp/Humidity command sent!\r\n");
			SerialExt.write(StringDebug, false, n);
		}

		
		rx_config = NRFX_TWIM_XFER_DESC_RX(SHT35_I2C_ADDRESS, i2c_rx, sizeof(i2c_rx));
		
		if(nrfx_twim_xfer(&i2c_instance, &rx_config, NRFX_TWIM_FLAG_REPEATED_XFER) == NRFX_SUCCESS)
		{
			// mapping values
			temp = (175.0 / 65535.0) * (((int16_t)i2c_rx[0] << 8 ) | (int16_t)i2c_rx[1]) - 45;
			humidity = (100.0 / 65535.0) * (((int16_t)i2c_rx[3] << 8) | (int16_t)i2c_rx[4]);

			n = sprintf((char*)StringDebug, "Data received temp: %.2f humidity %.2f\r\n", temp, humidity);
			SerialExt.write(StringDebug, false, n);
		}
		*/
		
		
		tx_config = NRFX_TWIM_XFER_DESC_TXRX(SHT35_I2C_ADDRESS, i2c_tx, sizeof(i2c_tx), i2c_rx, sizeof(i2c_rx));
		if(nrfx_twim_xfer(&i2c_instance, &tx_config, NRFX_TWIM_FLAG_REPEATED_XFER) == NRFX_SUCCESS)
		{
			// mapping values
			temp = (175.0 / 65535.0) * (((int16_t)i2c_rx[0] << 8 ) | (int16_t)i2c_rx[1]) - 45;
			humidity = (100.0 / 65535.0) * (((int16_t)i2c_rx[3] << 8) | (int16_t)i2c_rx[4]);

			n = sprintf((char*)StringDebug, "Data received temp: %.2f humidity %.2f\r\n", temp, humidity);
			SerialExt.write(StringDebug, false, n);
		}
		

		memset(i2c_rx, 0, sizeof(i2c_rx));
		
		k_msleep(1000);
	}
}

Here is the prj.conf

# Enable the UART driver
CONFIG_UART_ASYNC_API=y
CONFIG_NRFX_UARTE0=y
CONFIG_UART_0_ASYNC=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_0_INTERRUPT_DRIVEN=n
CONFIG_UART_USE_RUNTIME_CONFIGURE=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

# Enable I2C
CONFIG_I2C=y
CONFIG_I2C_NRFX=y
CONFIG_NRFX_TWIM=y
CONFIG_NRFX_TWIM0=y
CONFIG_NRFX_TWIM1=n
CONFIG_NRFX_PRS=y
CONFIG_NRFX_PRS_BOX_0=y

# Heap memory pool and Stack memory size 256/1024/4096/16384
CONFIG_HEAP_MEM_POOL_SIZE=1024
#CONFIG_MAIN_STACK_SIZE=16384

# Enable gpio
CONFIG_GPIO=y

# Enable timer
CONFIG_NRFX_TIMER=y
CONFIG_NRFX_TIMER0=y
CONFIG_NRFX_TIMER1=y
CONFIG_NRFX_TIMER2=y
CONFIG_NRFX_TIMER3=y
CONFIG_NRFX_TIMER4=y

# Heap memory pool 256/1024/4096/16384
CONFIG_HEAP_MEM_POOL_SIZE=1024

# C++ config
CONFIG_NEWLIB_LIBC=y
CONFIG_CPLUSPLUS=y
#CONFIG_CPP_STATIC_INIT_GNU=y

Parents Reply Children
Related