当前位置: 技术问答>linux和unix
内核I2C操作
来源: 互联网 发布时间:2017-05-15
本文导语: 我使用的是TI的板子,板子里有个TCA6416A的芯片是用于IO口扩展的。现在有4个LED灯接在TCA6416A芯片的IO口上,而TCA6416A是通过I2C与CPU通讯。在arch/arm/mach-omap2/board-omap3evm.c文件中,struct i2c_board_info __initdata omap3evm_i2c_tca6416...
我使用的是TI的板子,板子里有个TCA6416A的芯片是用于IO口扩展的。现在有4个LED灯接在TCA6416A芯片的IO口上,而TCA6416A是通过I2C与CPU通讯。在arch/arm/mach-omap2/board-omap3evm.c文件中,struct i2c_board_info __initdata omap3evm_i2c_tca6416a_boardinfo[] = {I2C_BOARD_INFO("tca6416", 0x21), ....}注册了TCA6416A I2C总线和设备的驱动。现在问题是,我使用TCA6416A这个设备,通过probe()函数探测I2C设备,当获得多个I2C设备时,通过地址0x21来判断是否是TCA6416A,然后从probe获得client,接着直接通过i2c_master_send,i2c_master_recv接口操作TCA6416A点亮LED?这样做是否有不合理的地方?因为发现如果让LED闪烁,如果时间比较短25ms,时间比25ms长很多。即使尝试在读写I2C操作时,添加锁也会有类是的问题存在。请问,这是什么情况?谢谢!
|
首先 ,i2c_board_info这只是静态注册了i2c_client,这不是总线,也不是驱动,是设备(声明)。
然后,一般的I2C总线适配器至少能够支持两种I2C速率,一个Standard Mode 100kHz,一个Fast Mode 400kHz。所以,消息的传输应该是没有问题的,LZ用这样的方法控制LED也是合理的。问题可能出现在其他部分,LZ可以尝试将代码贴出供大家参考,这样应该能够比较快的发现问题。
然后,一般的I2C总线适配器至少能够支持两种I2C速率,一个Standard Mode 100kHz,一个Fast Mode 400kHz。所以,消息的传输应该是没有问题的,LZ用这样的方法控制LED也是合理的。问题可能出现在其他部分,LZ可以尝试将代码贴出供大家参考,这样应该能够比较快的发现问题。