您的位置:首页 > 其它

GPIO模拟I2C操作调试注意事项

2016-04-14 10:37 357 查看
I2C作为板级串行数据总线,其规格相对简单,但调试过程中的一些细节问题容易被忽视,产生意想不到的时序错误。写这边文章为了记录我在调试I2C过程中遇到的问题,以便今后查阅并作为经验与大家分享。

关于I2C总线的规格可以参考I2C的规格书,描述准确详细,此不赘述。

使用MCU等SoC芯片中的I2C模块,一般不会出现问题,因为关于I2C的操作时序都经过芯片设计公司封装成功能完好的IP。但通过GPIO来模拟I2C操作时,所有的时序需由用户自己把握,因此,对于I2C的时序和操作要有深刻的认识。以下是使用GPIO模拟I2C调试时需要重点关注的问题:

(1)I2C总线信号引脚开漏输出特性。Specification中明确规定SCL,SDA需使用开漏引脚,这一规定是与I2C总线特性相关的,因此,GPIO的选用要满足这一特性。

(2)I2C总线信号引脚上拉。I2C总线空闲时,信号线需处于高电平状态,总线无驱动时由电阻上拉到电源。MCU或其他SoC芯片可以使能内部上拉或使用外部电阻上拉。

(3)SCL时钟速度。标准速度SCL通常为100KHz,高速SCL可达400KHz,根据I2C设备时钟特性,调试时需合理设置delay time。

(4)SDA数据线释放(取消驱动)。I2C总线的SDA是单工双向的数据线,同一时间只能由一方提供驱动(主机或是设备),否则会出现驱动冲突,导致数据出错或时序错误。以下几种情况SDA要及时释放:

1)主机发送1字节数据,check ack之前要及时释放SDA。主机发送数据时SDA由主机驱动,check ack时主机检测由设备驱动的1bit数据。如果主机驱动SDA未及时释放,SCL为低时产生冲突,SCL为高时检测ack出错,甚至会出现SCL为高时SDA的跳变产生错误Start/Stop标志,尤其是在主机发送数据最后1bit为高的情况下。
2)主机接收1字节数据(非最后1字节),send ack之后要及时释放SDA。主机接收数据时SDA由设备驱动,之后设备会释放SDA,由主机驱动SDA发送ack,发送ack之后要及时释放SDA,驱动权交给设备。如果主机send ack之后未及时释放SDA,在SCL为低时产生驱动冲突,SCL为高时主机采样数据会出现SDA跳变产生错误Stop标志,尤其是在接收下一字节数据的第1bit位为高的情况下。

这种情况下调试eeprom读写现象:数据高bit位为0时读写正常,数据高bit位为1时,读数据全0xFF。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  I2C 调试