自己做的3358的板子,使用sdk8.0,设备树文件用am335x-evm.dts,I2C用的是I2C-1(设备地址为0x61),用于配置ad9524。
问题:linux启动以后,可以找到设备文件/dev/i2c-1,但对该设备文件进行写操作时,在I2C的引脚上没有任何输出。
Steven Liu1:
先查硬件,你的I2C硬件上做上拉了没有?上拉的电压和对应的管教的VDDSHVn的域电压是否一致?
再查软件,最直接的,查一下你目前使用的I2C1的pinmux寄存器,是否工作在I2C的模式上?
QingKai Ji1:
回复 Steven Liu1:
硬件:I2C引脚上拉了的,电压是一致的。
软件:linux系统起来后,读到的寄存器conf_spi0_d1 = 0x00000062;conf_spi0_cs0 = 0x00000062。
pinmux的工作模式应该是对的。
谢谢!
QingKai Ji1:
回复 QingKai Ji1:
寄存器的值应该是0x00000027(前面给的0x00000062是在关闭了i2c-1时读出的)
这样的话,i2c的pinmux是处于sleep模式?应该如何解决呢?
谢谢!
Steven Liu1:
回复 QingKai Ji1:
你确定你使能了I2C1了吧,使能了后在dts文件中应该会根据你的配置调用I2C1的pinmux正常态配置才对。
查一下你的DTS文件配置,是不是在这里就pinmux的模式就配置的有问题。
如果不知道什么情况,建议先把sleep mode的 pin脚定义也设置为正常工作态的跑一下,作为测试手段,看看这种情况下是不是就可以工作了。然后再往配置的逻辑错误方向找。
QingKai Ji1:
回复 Steven Liu1:
Steven Liu:您好!
我把dts中的i2c-1sleep mode取消之后,再读出的pinmux寄存器值就对了(0x00000062)。
Steven Liu1:
回复 QingKai Ji1:
读出的寄存器值是对了,能正常工作了吗?
如果可以了,如果想理解清楚,就跟进一下哪里掉了sleep的pinmux配置,导致了这个问题。
QingKai Ji1:
回复 Steven Liu1:
Steven Liu:您好!
我通过读写设备文件/dev/i2c-1来使用i2c-1,打开设备文件成功,但在写的时候,出现如下信息:
[ 1085.058289] omap_i2c 4802a000.i2c: timeout waiting for bus ready
[ 1086.078284] omap_i2c 4802a000.i2c: timeout waiting for bus ready
我的操作代码如下:
fd = open("/dev/i2c-1", O_RDWR, S_IRUSR | S_IWUSR); if(fd < 0)
{ return false; }
res = ioctl(fd, I2C_TENBIT, 0);
res = ioctl(fd, I2C_SLAVE, 0x61);
res = write(fd, sendbuf, count + 2);
(在write时,前面是2字节寄存器地址,后面是寄存器值)
请问下,是不是我这样操作有问题呢?
谢谢!
Eggsy Pang:
回复 QingKai Ji1:
在终端上 首先使用i2cdetect -y -r 1 ,可以查看i2c设备地址是否在列表上,不知道你的设备地址是多少?会不会跟板上的其他设备的地址冲突。
如果没有冲突,看一下能不能把设备的寄存器的值读出来,输入命令# i2cdump -y 1 0x77,比如0x77是要查询的设备地址。
可以读到的话,再通过输入命令,来写寄存器的值 i2cset -y 1 0x77 0x20 0x0f ,比如0x77是要查询的设备地址,0x20是寄存器,写的值是0x0f。
QingKai Ji1:
回复 Eggsy Pang:
Eggsy Pang:您好!
我的设备地址是0x61,i2c-1上只挂了这一个设备。使用i2cdetect -y -r 1命令检查不到任何设备,
输出信息如下:
root@am335x-evm:~# i2cdetect -y -r 1 0 1 2 3 4 5 6 7 8 9 a b c d e f00: [ 92.238250] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 93.258253] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 94.278243] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 95.298244] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 96.318237] omap_i2c 4802a000.i2c: timeout waiting for bus ready
……
70: [ 203.418249] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 204.438239] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 205.458240] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 206.478237] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 207.498237] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 208.518265] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 209.538242] omap_i2c 4802a000.i2c: timeout waiting for bus ready– [ 210.558236] omap_i2c 4802a000.i2c: timeout waiting for bus ready– root@am335x-evm:~#
另外,我使用gpio模拟i2c的方式,已经可以配置该设备了。
谢谢!
Jian Zhou:
回复 QingKai Ji1:
I2C设备读写都是标准的,一般不会出问题,你在U-boot下调试过这个I2C读写么?