本文档记录了如何寻找CA55的Linux端存在的iic接口,并确定管脚,尝试点亮SSD1306芯片0.96寸oled。虽然CM33端有iic接口,但是有时候我们需要直接将从iic设备拿到的数据传入linux,会比从CM33再核间通信到CA55方便得多。开始测试前需要注意在linux端串口篇说过,输入的上拉是不好做的,这里的iic通信更是如此,所以博主直接找了个电平转换模块使用,板子上有1.8V的排针,查阅数据手册即可:

1.查找iic管脚
启动开发板,打开串口助手,在命令行输入以下指令:
ls /sys/firmware/devicetree/base/soc/ | grep i2c
可以看到命令行输出以下信息:
i2c@11C01000
i2c@14400400
i2c@14400800
i2c@14400c00
i2c@14401000
i2c@14401400
i2c@14401800
i2c@14401c00
i2c@14402000
我们效仿uart去查询物理地址映射到了哪些管脚,输入以下指令:
cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep -iE "11C01000|14400|riic"
可以看到命令行输出以下内容:
pin 6 (P0_6): device 11c01000.i2c function i2c8 group i2c8
pin 7 (P0_7): device 11c01000.i2c function i2c8 group i2c8
pin 24 (P3_0): device 14400400.i2c function i2c0 group i2c0
pin 25 (P3_1): device 14400400.i2c function i2c0 group i2c0
pin 26 (P3_2): device 14400800.i2c function i2c1 group i2c1
pin 27 (P3_3): device 14400800.i2c function i2c1 group i2c1
pin 28 (P3_4): device 14400c00.i2c function i2c2 group i2c2
pin 29 (P3_5): device 14400c00.i2c function i2c2 group i2c2
查询原理图,我们发现P34和P35刚好是被拓展排针引出来了的。所以使用这一对引脚进行iic通信:

2.测试iic接口
博主使用的是下面中间这个电平转换模块,支持1.8V-5V的电平转换:

将VCCA连接到开发板上的1.8V,VCCB连接到开发板上的3.3V,将GND接好。A0和A1分别连接P34和P35,B0和B1分别连接oled的SDA和SCL。再给oled接上GND和VCC。
在命令行输入以下命令:
i2cdetect -y -r 2
这个指令是用来扫描iic总线上挂载的设备地址。可以看到输出以下内容:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
可以看到有一个地址是0x3c的设备存在,而我们oled的硬件物理地址恰好就是0x3c!说明oled已经成功被芯片识别到,接下来我们就可以直接操作寄存器来做简单的测试。将stm32的oled驱动代码和字模交给AI让AI帮我们生成写字符的命令行指令:
i2cset -y 2 0x3c 0x00 0xae
i2cset -y 2 0x3c 0x00 0x00
i2cset -y 2 0x3c 0x00 0x10
i2cset -y 2 0x3c 0x00 0x40
i2cset -y 2 0x3c 0x00 0x81
i2cset -y 2 0x3c 0x00 0xcf
i2cset -y 2 0x3c 0x00 0xa1
i2cset -y 2 0x3c 0x00 0xc8
i2cset -y 2 0x3c 0x00 0xa6
i2cset -y 2 0x3c 0x00 0xa8
i2cset -y 2 0x3c 0x00 0x3f
i2cset -y 2 0x3c 0x00 0xd3
i2cset -y 2 0x3c 0x00 0x00
i2cset -y 2 0x3c 0x00 0xd5
i2cset -y 2 0x3c 0x00 0x80
i2cset -y 2 0x3c 0x00 0xd9
i2cset -y 2 0x3c 0x00 0xf1
i2cset -y 2 0x3c 0x00 0xda
i2cset -y 2 0x3c 0x00 0x12
i2cset -y 2 0x3c 0x00 0xdb
i2cset -y 2 0x3c 0x00 0x30
i2cset -y 2 0x3c 0x00 0x20
i2cset -y 2 0x3c 0x00 0x02
i2cset -y 2 0x3c 0x00 0x8d
i2cset -y 2 0x3c 0x00 0x14
for p in 0 1 2 3 4 5 6 7; do i2cset -y 2 0x3c 0x00 $((0xb0 + p)); i2cset -y 2 0x3c 0x00 0x00; i2cset -y 2 0x3c 0x00 0x10; for c in 1 2 3 4 5 6 7 8; do i2cset -y 2 0x3c 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 i; done; done
i2cset -y 2 0x3c 0x00 0xaf
i2cset -y 2 0x3c 0x00 0xb3
i2cset -y 2 0x3c 0x00 0x00
i2cset -y 2 0x3c 0x00 0x11
i2cset -y 2 0x3c 0x40 0x60 0x90 0x08 0x08 0x08 0x08 0x10 0x00 0x00 0x80 0x40 0x40 0x40 0x80 0x00 0x00 0xc0 0x00 0x00 0x00 0x00 0x00 0xc0 0x00 i
i2cset -y 2 0x3c 0x40 0x00 0x80 0x40 0x40 0x40 0x80 0x00 0x00 0xc0 0x80 0x40 0x40 0x40 0x80 0x00 0x00 0x40 0xf0 0x48 0x48 0x00 0x00 0x00 0x00 i
i2cset -y 2 0x3c 0x40 0xc0 0x80 0x40 0x40 0x40 0x00 0x00 0x00 0x40 0xd8 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x40 0x40 0x40 0x80 0x00 0x00 i
i2cset -y 2 0x3c 0x40 0xc0 0x80 0x40 0x40 0x40 0x80 0x00 0x00 0x00 0x80 0x40 0x40 0x40 0x80 0xf8 0x00 0x80 0x40 0x40 0x40 0x40 0x80 0x00 0x00 i
i2cset -y 2 0x3c 0x00 0xb4
i2cset -y 2 0x3c 0x00 0x00
i2cset -y 2 0x3c 0x00 0x11
i2cset -y 2 0x3c 0x40 0x20 0x20 0x21 0x21 0x21 0x12 0x0c 0x00 0x0f 0x12 0x22 0x22 0x22 0x22 0x13 0x00 0x00 0x07 0x18 0x20 0x18 0x07 0x00 0x00 i
i2cset -y 2 0x3c 0x40 0x0f 0x12 0x22 0x22 0x22 0x22 0x13 0x00 0x3f 0x00 0x00 0x00 0x00 0x3f 0x00 0x00 0x00 0x3f 0x00 0x00 0x00 0x00 0x00 0x00 i
i2cset -y 2 0x3c 0x40 0x3f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x3f 0x00 0x00 0x00 0x00 0x00 0x00 0x0f 0x12 0x22 0x22 0x22 0x22 0x13 0x00 i
i2cset -y 2 0x3c 0x40 0x3f 0x00 0x00 0x00 0x00 0x3f 0x00 0x00 0x0f 0x10 0x20 0x20 0x20 0x10 0x3f 0x00 0x11 0x22 0x22 0x24 0x24 0x18 0x00 0x00 i
直接将整段复制下来粘贴进命令行回车确认,我们就可以看见屏幕中间出现了博客的名称”Sevenfriends”!效果图如下:

以上就是本文档的全部内容。这篇博客只是进行了简单的iic测试,确保iic能够使用。包括教程中使用的oled,其实最正规的做法是将oled驱动编写为内核驱动,修改设备树为oled增加节点,然后重新编译系统。后期可能会更新相关教程!
