Unable to get i2c30 working on pins P03 and P04

Hello!

We are working on a custom PCB with nrf54l15 chip on nrf connect sdk version 3.2.0.

The I2C (TWIM) SCL line functions correctly, but the SDA line is not being driven by the peripheral. During I2C transactions, we observe 9 SCL clock pulses (correct for address + ACK), but SDA remains high throughout - it never toggles for the address bits. Since we are using pins  P03 for SDA and P04 for SCL we have to use i2c30 and because we are using TFM we have already disabled its logging with:

CONFIG_TFM_SECURE_UART=n
CONFIG_TFM_LOG_LEVEL_SILENCE=y

I'm having issue specifically with SDA line. No matter what i do i cant seem to get it working the communication always looks like this (see attached image from logic analyzer):

I have verified that the connection to my logic analyzer is good since if I manually toggle the pins manually they both work. 

I have also tried building an app without any security features and all other functions and files removed. Currently my project is just i2c communication and i cant get it to work.

Is this some issue because of TFM, is it a driver issue or do i have something configured wrong. Attached you will also find my prj.conf, overlay file and the main file.

Do you see any error in my code?

For debugging purposes i have made this minimal reproducible sample without tfm. With i2c30 and it doesn't work.

 

# I2C
CONFIG_I2C=y
CONFIG_GPIO=y
CONFIG_TFM_SECURE_UART=n
CONFIG_TFM_LOG_LEVEL_SILENCE=y

# Log
CONFIG_LOG=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BUFFER_SIZE=4096
CONFIG_USE_SEGGER_RTT=y
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=4096

# Memory
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=0

#include <zephyr/device.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(AppMain, LOG_LEVEL_DBG);

int main(void) {
	LOG_INF("I2C Test Application Started");

	const struct device *i2c = DEVICE_DT_GET(DT_NODELABEL(i2c30));

	if (!device_is_ready(i2c)) {
		LOG_ERR("I2C bus i2c30 not ready!");
		return -1;
	}
	LOG_INF("I2C bus ready: %s", i2c->name);

	uint8_t tx_data[2] = {0x00, 0x55};
	uint8_t rx_data;
	int count = 0;
	while (1) {
		/* Write to address 0x50 */
		int ret = i2c_write(i2c, tx_data, 2, 0x50);
		LOG_INF("Write ret: %d", ret);

		k_msleep(500);

		/* Read from address 0x50 */
		ret = i2c_read(i2c, &rx_data, 1, 0x50);
		LOG_INF("Read ret: %d, data: 0x%02X", ret, rx_data);

		k_msleep(500);

		count++;
		LOG_INF("Cycle %d complete", count);
	}

	return 0;
}

&pinctrl {
	i2c30_default: i2c30_default {
		group1 {
			psels = <NRF_PSEL(TWIM_SCL, 0, 4)>,
					<NRF_PSEL(TWIM_SDA, 0, 3)>;
			bias-pull-up;
		};
	};
};
&button3{
	status = "disabled";
};
&uart30{
	status = "disabled";
};
&spi30{
	status = "disabled";
};
&i2c30 {
	compatible = "nordic,nrf-twim";
	status = "okay";
	pinctrl-0 = <&i2c30_default>;
	pinctrl-names = "default";
	clock-frequency = <I2C_BITRATE_STANDARD>;
};

Parents Reply
  • On our pcb i can not do it unfortunately. However i did some tests on our nrf54l15 dev kit and i have compiled the results into this pdf. this were the results:

    IF i use P00 for SDA:

    SDA is always high and clock is not consistent:

    If I use P01 for SDA:

    SDA is producing some noise and clock disappears

    if i use P02 for SDA:

    SDA is always held high

    if i use P03: SDA is just noise and its held low:

    SCL was always on P04

    I also tried putting SCL to P03 and SDA to P02

    SDA is again held low and it has random noise but it almost looks like a signal

     nrf54l15 i2c results.pdf

Children
Related