您的位置:首页 > 运维架构 > Linux

linux I2C设备写操作错误的分析过程

2014-09-24 22:00 281 查看
今天调试驱动的时候发现了一个问题,初始化I2C设备的时候写I2C出错,kernel标准错误类型是Input/output error。

一般出现Input/output error错误,都跟硬件多少有点关系,但是在其他版本的SDK上测试确认这个I2C设备没问题,可以正常工作。所以认为是I2C通信没问题,肯定是其他问题导致的。

I2C的通信依靠SDA、SCL,这两根控制线的空闲状态分别是:

SDA:持续高电平。

SCL:持续高电平。

I2C写操作出错时,检测到的控制线的状态分别是:

SDA:有脉冲信号。

SCL:有脉冲信号。

I2C总线的控制协议:SCL为high时,SDA下降沿开始传输数据;SCL为high时,SDA上升沿停止传输。通过在内核中添加打印,发现了出错的地方:

wait_for_completion_timeout()

既然SCL和SDA都有脉冲信号,说明数据确实是在传输,但是为何会出错,当然只会有以下几种可能:

1、从设备地址不对。

2、从设备工作状态不对。

可以确认地址正确,那就只剩下从设备工作状态不对的情况。要么元器件损坏、要么休眠、复位等等··

通过对比两个不同版本的SDK工作时的I2C设备的控制引脚状态,发现Reset引脚的电平正好是反的。通信错误的软件版本--设备的Reset引脚为低电平;另外一个为高电平。查看设备的datasheet,其定义:Reset引脚常态为高电平、18个工作时钟以上的低电平进行复位操作。

所以这个问题可以总结为设备一直处于复位状态,导致I2C通信不成功。通过修改复位引脚输出电平,通信正常,问题解决。通过这个问题,可以反思问题的表象不一定就是问题的本质,如果一直在表象上去做工作,一定会浪费很多很多的时间,适当改变思维方式,也许就是那么简单。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息