2020-11-17 02:33 AM
Hi,
I'm trying to send and receive data over an I2C port.
Working with STM32MP15 ecosystem release v2.0.0 (concrete STM32MP157F-EV1 and openstlinux 5.4 dunfell) and i2c-tools.
I want to access I2C2 on MB1262C IO EXPANSION connector CN21.
Following this post I have done this steps:
root@stm32mp1:~# i2cdetect -l
i2c-1 i2c STM32F7 I2C(0x40015000) I2C adapter
i2c-2 i2c STM32F7 I2C(0x5c002000) I2C adapter
i2c-0 i2c STM32F7 I2C(0x40013000) I2C adapter
root@stm32mp1:~# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
40: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@stm32mp1:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@stm32mp1:~# i2cdetect -y 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- UU -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@stm32mp1:~#
My I2C slave has the address 0x77 and normally I can read some data from register 0xD0.
But I can't see this in the output above?
So I tried to manually access the I2C slave:
root@stm32mp1:~# i2cget -f -y 0 0x77 0xd0
Error: Read failed
root@stm32mp1:~# i2cget -f -y 1 0x77 0xd0
Error: Read failed
root@stm32mp1:~# i2cget -f -y 2 0x77 0xd0
Error: Read failed
What am I doing wrong?
I'm not able to measure any data on the pins on CN21 with my oscilloscope. Seems that no data is sent to any I2C port?
Thanks for help.
Kind regards,
Dmn
2020-11-17 02:40 AM
Hi @DmnSd ,
Did you already refer to I2C related wiki pages:
https://wiki.st.com/stm32mpu/wiki/I2C_overview
https://wiki.st.com/stm32mpu/wiki/I2C_device_tree_configuration
Any hint / help there ?
Olivier
2020-11-17 02:55 AM
Is i2c2 enabled in the device tree?
2020-11-17 06:44 AM
Dear @Community member ,
dear @KnarfB ,
thanks for your answers.
I read through the links mentioned above:
Linux kernel is configured correct.
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_STM32F7=y
CONFIG_I2C_SMBUS=y
Kernel uses the default device tree "stm32mp157f-ev1.dtb" in which i2c is configured correctly, isn't it?
I also have written a user space C application to access i2c -> no success.
I will dig a little bit deeper in device tree file.
But as I asked before: Device tree should be correct?
Kind regards,
Dmn
2020-11-17 06:47 AM
Hi @DmnSd
IP available on expansion connector are possibly not enabled by default.
Better to have a check.
Olivier
2020-11-24 01:35 AM
Hi @Community member ,
hi @KnarfB ,
I modified device tree as follows:
I want to access I2C2 on MB1262C on GPIO expansion CN21.
As the schematics show I2C2 is on pin PH4 and PH5.
Device tree says I2C2 is at 0x40013000.
i2c2: i2c@40013000 {
So I modified device tree file stm32mp157f-ev1.dts:
diff --git a/arch/arm/boot/dts/stm32mp157f-ev1.dts b/arch/arm/boot/dts/stm32mp157f-ev1.dts
index 0c18333c0..e8e9fc390 100644
--- a/arch/arm/boot/dts/stm32mp157f-ev1.dts
+++ b/arch/arm/boot/dts/stm32mp157f-ev1.dts
@@ -65,17 +65,16 @@
};
&i2c2 {
- gt9147: goodix_ts@5d {
- compatible = "goodix,gt9147";
- reg = <0x5d>;
- panel = <&panel_dsi>;
- pinctrl-0 = <&goodix_pins>;
- pinctrl-names = "default";
- status = "okay";
-
- interrupts = <14 IRQ_TYPE_EDGE_RISING>;
- interrupt-parent = <&stmfx_pinctrl>;
- };
+ pinctrl-names = "default", "sleep";
+ pinctrl-0 = <&i2c2_pins_a>;
+ pinctrl-1 = <&i2c2_pins_sleep_a>;
+ i2c-scl-rising-time-ns = <185>;
+ i2c-scl-falling-time-ns = <20>;
+ st,smbus-alert;
+ st,smbus-host-notify;
+ status = "okay";
+ /delete-property/dmas;
+ /delete-property/dma-names;
};
&m_can1 {
From stm32mp15-pinctrl.dtsi I get this pins for I2C2:
i2c2_pins_a: i2c2-0 {
pins {
pinmux = <STM32_PINMUX('H', 4, AF4)>, /* I2C2_SCL */
<STM32_PINMUX('H', 5, AF4)>; /* I2C2_SDA */
bias-disable;
drive-open-drain;
slew-rate = <0>;
};
};
i2c2_pins_sleep_a: i2c2-1 {
pins {
pinmux = <STM32_PINMUX('H', 4, ANALOG)>, /* I2C2_SCL */
<STM32_PINMUX('H', 5, ANALOG)>; /* I2C2_SDA */
};
};
So I think the pins are configured correct?
After compiling and flashing the pins 27 and 28 on CN21 are now high in idle. As I expected.
But reading from a I2C slave show the same error anyway and there is no data on my oscilloscope:
root@stm32mp1:~# i2cdetect -l
i2c-1 i2c STM32F7 I2C(0x40015000) I2C adapter
i2c-2 i2c STM32F7 I2C(0x5c002000) I2C adapter
i2c-0 i2c STM32F7 I2C(0x40013000) I2C adapter
root@stm32mp1:~# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- UU -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
40: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- 5d -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@stm32mp1:~# i2cget -f -y 0 0x77 0xd0
Error: Read failed
root@stm32mp1:~# i2cget -f -y 0 0x77 0xd0
Error: Read failed
Any idea how I can configure the GPIO expansion correct?
Dmn
2020-11-25 06:39 AM
Using Buildroot I added this to the DTS file to make the I2C work for the DK2:
&i2c5 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c5_pins_a>;
};
Your configuration is much more complex. Perhaps try this simple configuration and see if that works.