我在开发板上测试I2C设备的时候总是读写不成功,我参考的内核board-da850-evm.c里的i2c设备信息I2C_BOARD_INFO("tps6507x", 0x48) I2C_BOARD_INFO("tlv320aic23", 0x1A),分别测试了这两个设备,但是读写失败,我打开的是i2c-1总线,i2c-0总线打不开,应该是没有编译进内核。下面是我测试是串口打印出的消息:
please input slave addr:0x1A
input slave addr is:0x1a
please input reg addr:0x0200
input reg addr is:0x200
input command,optional only within:'1','2','3','0'.
3
write i2c testi2c i2c-1: sendbytes: NAK bailout.
write -1 byte at 0x200
23 bytes write success
bad command
wei lee1:
#1:确实你I2C设备地址,你板子上的I2C设备和DA850-EVM上的不同的话,那就要在你调用的函数中修改I2C设备的地址了。
#2:我看你想访问I2C设备的0X200地址,你确认这个地址是有效的?
#3:I2C设备的地址通常用7个bit来表示,在SCL的第八个脉冲期间,SDA为低电平,并在时钟的高电平期间保持住,这时为“写”,反之为“读”。这里有个参数转化的问题,要看具体的函数要你传参用是7bit的地址,还是8bit的读写地址。
write i2c testi2c i2c-1: sendbytes: NAK bailout.
#4:对于I2C-1,提示没有收到ACK验证,即NOACK,这个很可能是地址不对。在SCL的第9个脉冲期间,从设备拉低SDA,并在SCL的高电平期间保持住,这就是一个确认ACK,否则就是NOACK。
Xia Sue:
回复 wei lee1:
我查了下,板子上的设备接的的I2C0,而我在测试程序里只能打开/dev/i2c-1,不能打开/dev/i2c-0,我觉得这个i2c-1应该指的是i2c-gpio模拟总线,我想是不是就是这个的问题?
至于#2,我试过了很多地址,结果都一样,所以不存在这个问题。
wei lee1:
回复 Xia Sue:
#1:你的板子接的是I2C0,你的内核当中有I2C0的驱动吗?别人板子上用的是GPIO模拟的I2C,你板子上用是真正的I2C,物理连接都不同,那驱动肯定不同啊
#2:这个地址不知道你怎么理解的,如果我没理解错的话,应该是CODEC当中寄存器的地址,在有效的范围内才能做测试,但目前来看主要问题先不在这里。
Xia Sue:
回复 wei lee1:
我的GPIO1[4],GPIO1[5]模拟i2c总线,设备也是接在这个总线上的,物理连接应该是相同的吧
wei lee1:
回复 Xia Sue:
你用的是IO模拟I2C,你现在Linux内核当中运行的驱动和你当前的硬件匹配吗?板子是你自己设计的?驱动也是你自己编写的吗?
gg weee:
回复 wei lee1:
i2c的gpio口模拟的驱动在linux中是现成的,就叫i2c-gpio.c
你搜下内核,有用这个驱动的例子,你要做的就是menuconfig中使能这个功能,然后platform架构声明一个设备,用来传递gpio,然后设备和驱动名对应上,自然这个i2c bus上就能用这个了吧?
Xia Sue:
回复 gg weee:
你说得很有道理,之前似乎陷入了一个误区。一般的gpio引脚模拟i2c和特殊的gpio引脚复用为i2c总线引脚应该是两回事吧?我把这两者搞混淆了。怎么在platform_device中申明24lc64这个设备呢?网上找不到类似的例程。
wei lee1:
回复 gg weee:
例程当中GPIO引脚和楼主自身的GPIO引脚很可能不一致,至少应该修改下例程中的这部分,在编译吧
Xia Sue:
回复 wei lee1:
板子是自己设计的,驱动内核中有。gpio1[4] gpio1[5]本来就可以复用为i2c0引脚,这个是真实的i2c总线,而不是模拟的i2c总线,是不是这样的呢?
Xia Sue:
回复 wei lee1:
修改了呀,但是把gpio1[4] gpio1[5]引脚修改成gpio2[14] gpio2[15]后,向总线发数据,总线上检测不到信号。而把它改成gpio1[2] gpio1[3]后,是可以正常读数据的,因为gpio1[2] gpio1[3]与gpio1[4] gpio1[5]一样,都是可以复用为i2c0总线的两个引脚。