在U-Boot中使用I2C读取多个字节

时间:2014-07-26 01:09:45

标签: i2c u-boot

我遇到了飞思卡尔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 00EEF0。在该器件的多个读数中,它始终只返回第一个字节值。如果我尝试从地址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通信的飞思卡尔驱动程序的实现,但我没有更改任何内容,它适用于其他设备。我的同事也说同样的代码在他的董事会上工作。有没有人有类似的问题或有任何关于为什么会发生这种情况的理论?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我遇到了这样的情况。我有驱动程序,读取和写入功能,并且它不适用于所有i2c设备。我发现是因为不工作的设备有不同的操作格式进行了多次操作。不幸的是,这种情况发生了,有一种非标准的协议。当您打开问题设备的文档并将其与工作和/或驱动程序实现进行比较时,您很可能会看到差异。