平台:基于imx6ull开发板使用I2C驱动OLED
问题:无法驱动OLED, 在i2c_transfer()中报错, 返回error为-6.
分析思路:查看-6代表什么意思,上网搜索,得到:
查看可以知道,有两种情况可能会出错,参考网上资料,
通信协议 I2C 子系统之 Debug-i2c通信协议 (51cto.com)
讲的很详细,很有帮助。
使用i2c-tools查看设备地址,看是不是物理地址出错。
如何使用i2c-tools看这教程:
手把手教你使用 i2c-tools-i2c-tools使用 (51cto.com)
排除是否因为设备地址出错,使用I2c-tools查看设备地址:
查看系统的I2C总线为I2c-0 和i2c-1
21a0000.i2c表示寄存器的外设的地址,查看芯片手册可以知道:
所以本次OLED使用的IIC外设是I2C1,系统为我们在sys目录下自动生成的名字是i2c-0.
也可以手动在驱动源码修改。
这下总算明白了,因为之前使用STM32驱动OLED是用了软件IIC,误以为就是0x78,其实并不是。这里是使用硬件IIC,需要纯正的物理地址,最后面一位不加写bit,0。可以看OLED芯片手册:
可以看到地址不包括R/W位。
也就是说真正是物理地址不包含bo, 而看物理接线图,b1为0.真正地址为0x3C!!!
修改设备树节点地址:
OLED成功亮起!