I have a system based around the MIMXRT685-EVK running Zephyr. I have the i3c port configured and interfacing with a few i2c devices. They all work for some time, but depending of frequency of communication the bus/driver will just die after a few minutes.
I experienced this on the evk and on our custom board. And similarly with all the peripherals on the bus or just a single one.
here you can see the scope (yellow SDA, green SCL, violet device interrupt) it just stops trying any comms on the bus when it should be servicing the interrupt:
logic output
It happens for this device which is imu - lsm6dso (a zephyr built in driver), sampling at higher frequency from interrupts. Even communicating with another device at slower frequency it will stay up longer but eventually crash (maybe 5-10 minutes with a polling message every second).
Here is the warnings we saw from the i3c_mcux driver just before the bus goes dead. the errors are failed attempts to read from device registers (the bus in the scope has no activity from subsequent attempts, shown in red as errors):
warning from i3c_mcux before bus crash
Has anyone seen any issues similar with the i3c bus and zephyr implementation specifically?
our whole bus is essentially i2c devices we don't need the features of i3c (we are using it because we are using all the other ports) if there is a way it might be more stable if we "force" it into i2c mode all the time?
It don't know if there is a bug in the driver or some way to better configure it? we are using it pretty much as it came. see device tree sections:
&i3c0 {
status = "okay";
i2c-scl-hz = <400000>;
i3c-scl-hz = <400000>;
i3c-od-scl-hz = <400000>;
clk-divider = <12>;
clk-divider-slow = <1>;
clk-divider-tc = <1>;
pinctrl-0 = <&pinmux_i3c>;
pinctrl-names = "default";
lsm6dso0: lsm6dso@6a0000000000000050 {
status = "okay";
compatible = "st,lsm6dso";
reg = <0x6a 0x00 0x50>;
irq-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
};
};
pinmux_i3c: pinmux_i3c {
group0 {
pinmux = <I3C0_SCL_PIO2_29>,
<I3C0_SDA_PIO2_30>;
input-enable;
slew-rate = "slow";
drive-strength = "high";
};
group1 {
pinmux = <I3C0_PUR_PIO2_31>;
slew-rate = "normal";
drive-strength = "normal";
};
};
Any help is much appreciated.
Thanks, Galen