裸机上I2C的设计

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

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

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

 

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

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

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

传输数据时序

上图是传输2Bit(2位)数据的时序,在时钟线拉低的时候,允许数据变化。若是在时钟线高电平时,允许数据变化,那数据线传个低电平后传个高电平,就完成了停止信号了。

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

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

 

猜你喜欢

转载自www.cnblogs.com/zero-cookies/p/9112423.html
I2C