I2C协议时序以及协议变体

常用I2C从设备介绍

         啥叫从设备我刚开始是不知道这个概念的,额,还是说说吧,大神请略过^_^,那么言归正传,从设备是指被主控设备选中从而按照具体协议通信的设备就是从设备,那么I2C从设备就是主控和被控走的是I2C协议,常见的I2C从设备有:HDMI,cmos camera(手机平板前后摄像头),电容触摸屏TS,重力传感器gsensor,eeprom存储设备,我们在工作中经常会做I2C的驱动开发,也就是I2C的从设备驱动开发。I2C提供接口时同时遵循I2C协议通信,当然一个设备可能支持多个接口,如我们的eeprom可以支持I2C,也可以支持spi。I2C从硬件角度的一个连接框架如下:

其中SCL是时序控制线,SDA是数据线,上面的话从设备只画了两个,实际上从设备可能是很多的,那么我的SOC主控需要读写数据的时候是如何区分是哪个从设备的呢:是通过从设备地址,这个地址是唯一的,一般是7bit、10bit,那么从设备相应soc的时候怎么知道是读取,还是写数据呢,此时就出现了I2C协议了,协议格式如下:


上图解释:Scl是主要是发送一个时钟来控制sdl的一个数据发送,什么时候发送开始新信号,什么时候发送从设备地址出来,什么时候告诉从设备是读操作还是写操作,sda中高电平表示读,低电平表示写,发送完读写标志后从设备会给soc一个ack(从高拉低电平),响应了以后就可以读写数据了,读写完成会发个ack,最终如果没有数据了会发送一个p结束信号。

那么接下来真正的一个操作过程,以及数据表示是怎么样的呢?此时就需要时序SCL参与了,具体分析如下(画的丑,没办法):

开始位是从soc发出来的,表示方法是突然从高电平变成低电平:意思是再我们的scl高电平的周期,sdl从高变低就表示了一个s:开始信号,另外我们sda的有效数据是在scl高电平的时候采集的,低电平时无效。发了从设备地址,接下来soc会拉高电平,同时从设备为了响应又会拉低,这样由于都是再一根线sda上,立刻对方就能检测到电流的变化。接下来就是数据传输了,传输完成同样再scl为高电平的时候会拉高电平表示停止信号。实际上这个协议针对开始和结束做了特殊处理的,就是正常情况下是高电平的时候是不能改变电平的,为了避免特殊情况把高变低为开始,低变高位结束。

如何操作从设备,操作的时候需不需要传递操作地址,寄存器地址等?实际上是需要传递操作地址的,所以读写的时候I2C协议可能有变体:写的话有传递操作地址,读的时候首先要告诉读的一个地址,也算是一个操作地址,然后得重新发开始位告诉从设备现在是做读操作,然后发从设备地址,R标志。

写:

扫描二维码关注公众号,回复: 1129464 查看本文章

读:

 

所以需要注意这种变体区别。。。今天先写到这里吧,嘻嘻^_^

 


猜你喜欢

转载自blog.csdn.net/u010802169/article/details/80503442