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通信不成功。通过修改复位引脚输出电平,通信正常,问题解决。通过这个问题,可以反思问题的表象不一定就是问题的本质,如果一直在表象上去做工作,一定会浪费很多很多的时间,适当改变思维方式,也许就是那么简单。
一般出现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通信不成功。通过修改复位引脚输出电平,通信正常,问题解决。通过这个问题,可以反思问题的表象不一定就是问题的本质,如果一直在表象上去做工作,一定会浪费很多很多的时间,适当改变思维方式,也许就是那么简单。
相关文章推荐
- linux-i2c驱动 之 i2c设备层的注册过程probe函数如何被调用分析
- linux设备驱动之 i2c设备驱动 at24c08驱动程序分析【全部地址的操作】
- linux IIC子系统分析(七)——实例分析通过i2c-dev操作I2C设备
- Linux I2C子系统分析-I2C设备驱动
- Linux I2C子系统分析-I2C设备驱动
- Linux行走(2)——分析字符设备过程
- Linux设备驱动程序架构分析之I2C架构(基于3.10.1内核)
- Linux设备驱动之I2C架构分析
- 操作系统大型实验进展(6)-----Linux 内核文件系统与设备操作流程分析
- Linux 内核文件系统与设备操作流程分析
- Linux设备驱动之I2C架构分析
- Linux设备驱动程序架构分析之I2C Spec摘要
- Linux 内核文件系统与设备操作流程分析
- Linux设备驱动之I2C架构分析
- Linux设备驱动之I2C架构分析
- Linux 内核文件系统与设备操作流程分析
- Linux设备驱动之I2C架构分析
- Linux设备驱动之I2C架构分析
- Linux I2C子系统分析-I2C总线驱动&&Linux I2C子系统分析-I2C设备驱动
- linux s3c2440 下i2c设备(EEPROM)操作