裸机上I2C的设计

  本文主要说说I2C的某些设计。为什么通信协议比SPI复杂,还有两根线电平跳换上的合理性。

 

  I2C搭的线少,一根时钟线和一根数据线。搭线也就比用到4根线的SPI更方便。加上I2C比较廉价,所以板上器件之间的通信,I2C用的较多。此外,I2C在传输速度上比较慢,较少用于远距离通信。

  SPI,通常有四根线,时钟线、数据输出线、数据输入线、从设备选择线。如果只有一个从设备,就用不上从设备选择线了。

  比起SPI的四根线,I2C只有两根线。所以当主机匹配从设备的时候,需要通过I2C协议发送设备地址来选择从设备。I2C比SPI少了从设备线,就用了更复杂的协议,通过协议来选择从设备。

 

I2C 起始信号与停止信号的比较

  空闲状态下,SCL、SDA都是高电平。在SCL为高电平的前提下,SDA从高电平跳变到低电平,和由低电平跳变到高电平,分别完成了I2C的起始信号和停止信号。

  这里,只需要一根线的电平跳变,就能和空闲状态区别开。I2C在设计上选择了SDA的跳变来作为起始、停止的信号。

 

传输数据时序

  上图是传输2Bit(2位)数据的时序,在时钟线拉低的时候,才允许数据变化。若时钟线高电平时,允许数据变化,那数据线传个高电平,就匹配了停止信号的时序。这时候,I2C总线就会强制结束工作状态,进入空闲状态。

  所以,在起始信号后,需要把时钟线拉低,才能传输数据。

  而数据变化后,需要拉高时钟线,此时即便数据线上是1,也不会触发停止信号。停止信号是拉高时钟线在前,而这个可能情况是,数据线拉高之后才拉高时钟线,所以并不冲突。时钟线拉高,是为了保持数据稳定,此时是不允许数据改变的,确保传输的1位数据不会出错。之后,时钟线再拉低时,稳定的一位数据已经传输成功了。这个时候,才再次允许数据变化。

 

posted @ 2018-05-30 18:17  zero_cookies  阅读(340)  评论(0编辑  收藏  举报