我遇到了飞思卡尔p1022tw板的I2C驱动程序问题。 U-Boot控制台上有一个命令可以从I2C设备读取:
i2c md chip address[.0, .1, .2] [# of objects]
当我从ID为0x60的设备读取4个字节时,在地址0x0处,我得到:
tw=>i2c md 60 0 4
0000: 45 45 45 45 EEEE
它返回的这些值是错误的。如果我当时读取一个字节,我可以得到正确的值:
tw=>i2c md 60 0 1
0000: 45 E
tw=>i2c md 60 1 1
0001: 45 E
tw=>i2c md 60 2 1
0002: 46 F
tw=>i2c md 60 3 1
0003: 00 .
我应该在第一个命令中得到45 45 46 00
或EEF0
。在该器件的多个读数中,它始终只返回第一个字节值。如果我尝试从地址0x2开始获取6个字节,这是输出:
tw=>i2c md 60 2 6
0002: 46 46 46 46 46 46 FFFFFF
总线上的其他设备上不会发生此问题。例如,在id为0x4F的设备中,将打印正确的值:
tw=>i2c md 4F 0.2 6
0000: 18 00 f6 48 00 00 ...H..
上一个命令中的地址为“.2”,因为芯片使用2个字节作为地址。第一个设备只使用1,因此不需要输入“.1”(我已经测试过了)。
我完成了用于I2C通信的飞思卡尔驱动程序的实现,但我没有更改任何内容,它适用于其他设备。我的同事也说同样的代码在他的董事会上工作。有没有人有类似的问题或有任何关于为什么会发生这种情况的理论?
提前致谢。
我遇到了这种情况。我有驱动程序,读取和写入功能,并且它不适用于所有i2c设备。我发现是因为不工作的设备有不同的操作格式进行了多次操作。不幸的是,这种情况发生了,有一种非标准的协议。当您打开问题设备的文档并将其与工作和/或驱动程序实现进行比较时,您很可能会看到差异。