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>;
};

