I2C总线

I2C总线无论是在嵌入式开发领域,应该是最常用的总线协议之一。老刘接触I2C应该是在2003年,做的是一个时钟芯片的驱动,当时使用的CPU也没有I2C控制器,采用的是GPIO模式的方式写的代码,对那次调试体会很深,按照I2C时序,输出正确的波形,配置/读取I2C器件的数据。

关于I2C协议,网上资料一抓一大吧,老刘也不打算整理太多,只是想根据以往的项目经验,给大家分享以下几点:

  • 如果使用GPIO模拟,最好不要让两个CPU可以操作同一个器件,因为那样会涉及到总线仲裁;

  • 如果使用GPIO模拟,最好接上拉电阻,使SDA和SCL线在空闲状态为高电平状态;

  • 现在由于低功耗的要求,现在很多CPU的电压的IO引脚输出电平会有所区别,有1.2V、1.5V、1.8V,这时需要与I2C器件的电平进行匹配,虽然现在一般的器件都可以认为要求的电压*0.7即可认为是高电平,但出于临界值得状态容易受到信号干扰,造成数据不可靠。如果电平不匹配,那就让硬件工程师接个电平转换器件吧,还能增强IO口的驱动能力呢;

  • 如果一条总线上接多个I2C器件,就要注意器件的地址不要出现重复,尤其是会使用多个相同器件的情况下更需注意;

  • 在2.6以后的Linux开发中,一般都是采用Attach的模式,先将I2C器件挂到platform总线上,而老版本的Linux内核采用的是Detach模式,Linux会自动检测所挂接的I2C器件,只有器件有回应之后才能正常操作。老刘吃过亏,因为当年还是用老思想调试电容触摸屏驱动,而其工作原理是只有被按下之后才会产生中断,允许I2C控制器的操作,它不接受I2C控制器的探测行为。

老刘在这里给大家找了份最基本的文档,来源于百度文库,文章的作者未知,老刘感谢其无私奉献精神,对于初学者应该会有一个帮助。


I2C总线接口详解.pdf

另外,在老刘做在玩Intel服务器CPU的时候,还用过一个SMBus总线,也是一个两线协议,与I2C协议有些区别和联系,老刘有时间再帮大家进行资料收集。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

156 views 暂无评论