I2C总线协议详解

 

 

  今天花了半天时间学习I2C总线协议,算是弄得比较透彻,拿出来和大家分享一下。

  ·I2C总线特点

  ·I2C总线三种状态

  ·I2C总线必要知识点

  ·I2C总线写过程

  ·I2C总线读过程

一、I2C总线特点  

  在讲之前呢我为大家画了一幅图。

  从图看呢,比较简陋,但是麻雀虽小五脏俱全,想表达的都可以在图中看出来。

  从图中我们可以看出呢,I2C总线的特点呢是:

  1.它是由两根线组成的,一根叫SCL(串行时钟线),一根叫SDA(串行数据线)。线少,好处自然不用多说咯,但是速度肯定就慢了,用作外设之间的数据接口够用了。而快速的芯片内部通信,用的是AMBA总线通信,想了解的自己查一下,或者过几天我研究后再写。

  2.每颗I2C芯片呢都可以作为主机和从机,但一次通行中只允许存在一个主机。

  两点特点是不是有点少啊,没事儿,在了解后面的知识点后,自己总结吧,主要讲后面内容呢。

二、I2C总线的三种状态

  I2C总线存在三种状态:

  1.空闲

  2.工作开始

  3.工作停止

  先说空闲状态:当SCL与SDA同时为高电平时,为空闲态,说白了,就啥也不干。如下图:

                                

  再说说开始工作状态,此时SCL为高,而SDA出现下降沿,如下图:

   

  最后就是停止工作状态,此时SCL为高,SDA出现上升沿,如下图:

三、I2C总线必要知识点

  除了要知道上面的三种状态,还需要知道下面五点内容,方可理解最后的读写过程。要来了,接招:

  1.I2C总线协议要求1个字节位宽为8位(8bit)

  2.从机地址位宽为7bit,但上面说了啊一个字节要8bit,不着急,还有1个bit的位宽用来存放主机是用来写(0),还是用来读(1),加起来刚好8bit。比如0100101(地址位)0(读写位,此处为写),可以看出读写位为最低位。

  3.每颗I2C芯片都有各自的地址,互相之间有可能相同,有可能不同。相同时呢,就是要实现一个主机同时对多个从机进行数据交换。为了使各个I2C芯片之间更加灵活,每颗I2C芯片都有固定的4位地址,以及3位可编程地址,当4位固定地址相同时,用软件编辑后3位,使之相同,所以最多可以有8台(2的三次方)从机可以同时与主机通信。

  4.一个字节传输完毕之后,主机将SDA拉高,主机I2C芯片就不再干活了,等待从机反馈(ACK acknowledge),这时从机I2C芯片开始对传输过程做判定,判定读取成功时,将SDA拉低,以表示我完成啦,你继续吧。主机得到这个讯息之后,就会进行下一步既定的操作。如果从机读取失败,那么SDA将不会变化。此时主机就会知道,哦,没发成功,接下来是继续重新传输一遍还是终止操作,这个由写好的程序来定。 到这里大家会不会想到这样会有一个BUG,那就是只要SDA一直不变,那主机就一直不干活了?当然主机也不是傻子(其实应该是程序猿也不是傻子),那就等一个时间呗,一定时间内,我收不到信号拉低,那就认为你出问题了。这个时间就是半个SCL周期。

  5.在4中提到了时钟周期,这里再科普一下。看下图(download的,还有百度水印):

  从这张图可以看出,一整个流程应该是9个时钟周期,在第九个周期的高过程,必须完成ACK。每位数据对应一个high,在这半个周期内,要求SDA上的数据是稳定的,不能发生改变,为啥?用类似建立时间保持时间来理解。

四、I2C总线写过程

  写过程如下:

  1.主机发送从机地址(7bit)+0(0是写),所有从机都会接收到这个信息,但是只有地址匹配的从机反馈一个ACK(0),并准备后面的接收工作,其它地址不对的从机,'早点洗洗睡吧,没咱啥事儿了'。

  2.主机收到这个ACK,开始发送内存地址(8bit),所有地址匹配的从机(前面说过,一个主机可以匹配多个从机,只要那从机地址相同就行)接收这个8bit的内存地址,在吩咐下去之后,给主机一个反馈ACK(0),'我OK啦'。

  3.主机收到这个ACK,开始发送数据给从机,一个字节8bit,从机接收完成,给主机反馈ACK(0)。

  4.主机收到这个ACK,是继续发送数据,还是发送终止信号,取决于数据是否发送完毕。

五、I2C总线读过程

  读过程如下:

  1.主机发送从机地址(7bit)+0(0是写),这里为啥又是写呢?首先,主机得找到这些从机呀,当然要将从机地址写给各个从机了。所有从机都会接收到这个信息,但是只有地址匹配的从机反馈一个ACK(0),并准备后面的接收工作,其它地址不对的从机,'诶......早点洗洗睡吧,又没咱啥事儿了'。

  2.主机接收到这个ACK,开始发送8bit的内存地址给从机,'把这个地址找到,把货给我取出来备着,我一会儿要从你这里提货啊!'。从机找好这些地址后,反馈一个ACK(0)给主机。

  3.主机收到这个ACK,再发一次从机地址(7bit),只不过这次最后一个换成1(读)了。从机收到并返回ACK(0)。

  4.主机收到这个ACK,做好了接收从机信息的准备,这个时候从机信息到了,主机接收完信息后不对从机发送反馈(毕竟人家是老大啊,老大拿好了还要给小喽喽打个报告?)直接发起终止信号,心疼从机3秒钟。

 

  好了,到这里就讲完了,继续心疼从机3秒.......

补充:I2C通信协议允许暂停功能,就是在主机传输数据时,从机需要进行一个优先级高的事件时,从机通过拉低SCL,迫使主机等待,等到处理完紧急事件后,从机释放SCL,主机继续传输。

posted @ 2018-04-26 21:09  Jamesjiang2050  阅读(5210)  评论(0编辑  收藏  举报