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

nRF9160 I2C and UART not working together

Hi,

We are using ncs tag v1.0.0. 

I am using i2c_scanner example firmware. It works find when used as it is. 

When I added "UART2" in this firmware i am getting hard fault. 

If i2c is removed from this firmware then "UART2" works fine. 

Below is my prj.conf file. 

CONFIG_TRUSTED_EXECUTION_NONSECURE=y

CONFIG_I2C=y
CONFIG_I2C_NRFX=y
CONFIG_I2C_2=y
CONFIG_I2C_2_NRF_TWIM=y

CONFIG_NEWLIB_LIBC=y

# UART 2 
CONFIG_SERIAL=y
CONFIG_UART_NRFX=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_2_NRF_UARTE=y

Below is my .overlay file 

&i2c2 {
	status = "ok";
	sda-pin = < 13 >;
	scl-pin = < 14 >;
    clock-frequency = <I2C_BITRATE_STANDARD>;  
};

&uart2 
{ 
   status = "ok"; 
   current-speed = < 9600 >;
   tx-pin = < 16 >;
   rx-pin = < 17 >;
   rts-pin = < 18 >;
   cts-pin = < 19 >;
};

below is my the main function. 

void main(void)
{
	struct device *i2c_dev;
	
	k_sleep(500);

	printk("Starting i2c scanner...\n");

	i2c_dev = device_get_binding(I2C_DEV);
	if (!i2c_dev) {
		printk("I2C: Device driver not found.\n");
		return;
	}

        uart2 = device_get_binding("UART_2");
        uart_irq_callback_set(uart2, UDi_Uart2RxInt);
        uart_irq_rx_enable(uart2);
	
	uint8_t error = 0u;
	
	i2c_configure(i2c_dev, I2C_SPEED_SET(I2C_SPEED_STANDARD));


	printk("Value of NRF_TWIM3_NS->PSEL.SCL: %ld \n",NRF_TWIM3_NS->PSEL.SCL);
	printk("Value of NRF_TWIM3_NS->PSEL.SDA: %ld \n",NRF_TWIM3_NS->PSEL.SDA);
	printk("Value of NRF_TWIM3_NS->FREQUENCY: %ld \n",NRF_TWIM3_NS->FREQUENCY);
	printk("26738688 -> 100k\n");
	
	
	
	for (u8_t i = 4; i <= 0x77; i++) {
		struct i2c_msg msgs[1];
		u8_t dst = 1;

		/* Send the address to read from */
		msgs[0].buf = &dst;
		msgs[0].len = 1U;
		msgs[0].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
		
		error = i2c_transfer(i2c_dev, &msgs[0], 1, i);
		if (error == 0) {
			printk("0x%2x FOUND\n", i);
		}
		else {
			//printk("error %d \n", error);
		}
		
		
	}
	

	
	
}

when "uart_irq_callback_set(uart2, UDi_Uart2RxInt);" is called it creates hard fault as shown below 

Peripheral<HT>	<HT>	Domain<HT>	<HT>	Status<CR><LF>
00 NRF_P0<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
01 NRF_CLOCK<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
02 NRF_RTC1<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
03 NRF_NVMC<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
04 NRF_UARTE1<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
05 NRF_UARTE2<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
06 NRF_TWIM2<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
07 NRF_SPIM3<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
08 NRF_TIMER0<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
09 NRF_TIMER1<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
10 NRF_TIMER2<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
11 NRF_SAADC<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
12 NRF_PWM0<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
13 NRF_PWM1<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
14 NRF_PWM2<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
15 NRF_PWM3<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
16 NRF_IPC<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
17 NRF_VMC<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
18 NRF_FPU<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
19 NRF_EGU1<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
20 NRF_EGU2<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
21 NRF_GPIOTE1<HT>	<HT>	Non-Secure<HT>	OK<CR><LF>
<CR><LF>
SPM: NS image at 0xc000<CR><LF>
SPM: NS MSP at 0x20020620<CR><LF>
SPM: NS reset vector at 0xd941<CR><LF>
SPM: prepare to jump to Non-Secure image.<CR><LF>
***** Booting Zephyr OS v1.14.99-ncs2 *****<CR><LF>
Starting i2c scanner...<CR><LF>
device_get_binding<CR><LF>
Exception occurred in Secure State<CR><LF>
***** HARD FAULT *****<CR><LF>
  Fault escalation (see below)<CR><LF>
***** BUS FAULT *****<CR><LF>
  Precise data bus error<CR><LF>
  BFAR Address: 0x50008120<CR><LF>
***** Hardware exception *****<CR><LF>
Current thread ID = 0x200200ec<CR><LF>
Faulting instruction address = 0xc7a0<CR><LF>
Fatal fault in ISR! Spinning...<CR><LF>

Regards,

Smitesh Mali

Related