开发者学堂课程【HaaS 物联网应用开发课程:3_7_I2C 协议介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/801/detail/13833
3_7_I2C 协议介绍
内容介绍
一、I2C 是什么
二、I2C 特点
三、I2C 协议
一、I2C 是什么
本节课程的主题是 I2C 总线接口介绍,首先会介绍一下 I2C 是什么?主要应用程序有哪些?接下来会介绍 I2C 的特点,最后对 I2C 的协议进行介绍。
I2C 正确的读法是i 方 c,它的英文全称是 inter-integrated circuit 是一种串行通信总线,它使用的是多种层结构,由飞利浦公司在80年代为了让 CPU 能够连接更多低速的外设而设计的。
目前 I2C 已经到了6.0的版本,大家可以通过这个地址来下载来看看, I2C 的应用场景也有很多,最常见的如下,第一,保存用户设置常用的 NVRAM 芯片;第二,DAC 和 ADC 实现数字模拟信号之间的相互转换;第三,小型的液晶屏或者是 OLED 屏,这种屏的分辨率不能太高;第四,各种监控设备,比如说手机上的电池监控模块、键盘监控、CPU温度以及风扇转速监控等等。第五,实时时钟芯片;第六,GPIO 的扩展芯片,当 CPU 的 GPO 口不够用的时候,可以通过 I2C 接口的 gpo 扩展芯片来扩展更多的 gpo 来使用;第七,也就是最常见的像各种传感器,比如说温湿度传感器、光感传感器、加速度、陀螺仪以及接近传感器等等。
二、I2C 特点
接下来看一下 I2C 的特点,对照这张图来看 I2C是由 SDA 和 SDL 两条双向漏极电路组成,它需要在外界电阻的情况下才能正常工作, I2C 是基于地址的,每一个 I2C 的从设备都有唯一的一个地址来对进行标识。
它的地址模式有两种,最早期的 I2C 设备地址只有 7-bit 的地址模式,后来扩展到了 10-bit 的模式。I2C 是多主从结构的,一个 I2C 上可以挂在多个主设备,同一时刻,要么主设备向从设备发送数据,要么从设备向主设备发送数据,数据传输不能同时双向进行。I2C 支持多种速度模式,10kg 以下是低速模式,标准速度是100 kbps,快速模式是400kbps,快速Plus模式是一兆 pps ,高速模式是3.4Mpps,现在还有超高速模式可以达到5MPS。
影响 I2C 速度的主要因素是信号从0~1的一个稳定时间,都知道数字信号只有零和一,但是在信号发生零和一切换的时候,它并不是一个直角切上去的,它是有一个转换时间的,这个转换时间跟外接的电容有很大的关系,转换时间越短,I2C 的速度就可以越快,下面这张表就是I2C 在标准模式、快速模式以及快速 Plus 模式下边,对信号稳定时间及外接电容大小的要求。
三、I2C 协议
接下来看一下I2C 的协议,首先来看一下I2C 的几个重要的概念,transmitter 是发送方,任意时刻正在向I2C 总线发送数据的一方就是 transmitter,Receiver 和 transmitter 是对应的,任意时刻接收来自总线数据的一方就是 receiver, Masters 是主设备,发起或者停起 I2C 通信过程的一方就是 Masters,Slave 是从设备,被主设备寻址的设备就是从设备,因为前面我们提到了 I2C 是支持多个主设备的,每个主设备都可以发起数据传输的过程,因此也就一定会出现说两台主设备同时发起的数据传输,这种情况下就需要对 I2C 总线进行仲裁,以决定哪台设备可以占用总线,Arbitration 就是仲裁协议,Synchronization 同步脉冲基准是由主设备发给从设备的,在从设备端需要对信号基准进行同步,才能确保后续传输数据的正确性。任何一次的I2C 传输都是一个起始标志开始和一个停止标志结束的,在总线处于空闲状态的情况下,就是 SDA 跟 SCL 都是高电平的情况下,然后 SDA 发生一个从高电平向低电平的切换,就代表一次 I2C 的数据传输的开始,在 SCL 处于高电平的情况下, SDA 从低电平向高电平的一个跳变,这就代表 I2C 数据传输的结束。
I2C 的数据传输格式先来看一下右上角这个图, I2C 传输采用的是巴比特的传输模式,采用最高位在前,最低位在后。
数据传输周期内除了巴比特的数据之外,还有一个是ACK 或者是 NACK ,这个是由接收方发送的。当接受方正常收取并处理数据的时候,回复一个 ACK,接受方不能处理数据的时候就什么也不回复,代表 NACK 。
再来看一下这张图,再来看一下下面这张图,I2C 的数据切换应该发生在 SQL 处于低电平的时候,处于高电平的时候数据应该保持不变,那接收方就是在scl处于高电平的期间对 SDA 进行采样的,一次I2C 传输的过程当中可以传输多个字节,比如这张图上边这是一个起始标志,然后中间12345678,再加上后面的 ACK 是一个数据的完整的传输过程。
接下来它可以不停止,然后直接传送下一个数据12345678,接下来再是一个接收方发送的 ACK ,然后后面可以停止,也可以继续发送数据,在一次 I2C 数据传输结束之后,主设备端可以发送 stop 的信号,也可以发送一个 repeat start 的一个信号,如果一次 I2C 传输入结束之后,主设备端发起的是 repeated start,那么 repeated start 之后数据传输可以立马,开始从而省掉一个 stop 的传输周期。前面有提到 ACK 或者是 NACK 如果接受方回复 ACK 给发送方,则代表数据传输正常结束,如果接收方再回复 NACK 给发送方,那么代表数据传输没有正常完成,可能会有这么几种情况,
第一主设备要寻址的 I2C 的从设备没有找到,但是从设备没有挂载在总线上,那么就没有人回复 ACK 给主设备,这个时候就是一个 NACK 的信号;
第二种情况是接收方正在处理其他的实时操作,还没有准备好和发送方进行数据通信;
这三种情况是接收方收到了自己不认识的数据,他也不会回复 ACK 给对方;
这四种情况是接收方没办法接收更多数据的时候,他也不会回复。在发生 NACK 之后,主设备可以结束发送,也可以不结束,直接重新开始发送。
接下来以一张图来给大家讲一下I2C 操作的一个完整过程,当主设备需要给从设备发送数据的时候,便会发起写操作。
首先是主设备发起一个 star 标志,代表整个传输过程的开始,接下来的七比特是从设备的地址信息,第八比特写入零代表是 I2C 写操作,当从设备收到地址信息之后,会和自己的地址进行匹配,如果和自己的地址一样,那么它就会发出 ACK 信号,回复主设备告诉说这个从设备现在是在总线上的,那么接下来主设备就会继续发送数据一和数据二,那整个格式是这样的,最高位在前第七、第六、第五,然后最低位在后,第零。然后从设备收到这个数据之后,回复一个 ACK ,然后接下来传输第二个字节第七、第六、第五、第零,同样是以这样的顺序,然后从设备收到之后会回复一个 ACK ,然后接下来因为主设备只需要发送两个袋子,所以它会以 stop 标志结束这次 I2C 的数据传输过程。
这张图是一个I2C读操作的完整过程,同样是有主设备发起起始信号到总线,start 标志是有主设备发起,然后发送设备的地址到总线上,然后有一个读写标志填入一,代表是读操作。从设备收到以后和自己地址进行匹配,匹配成功发送 ACK 信息给主设备,接下来从设备会依次发送自己要发送的数据给主设备,同样是以高位在前,低位在后的方式。从设备发送完一个字节的数据之后,主设备收到回复一个 ACK ,然后从设备继续发送后面的第二个字节,主设备收到之后回复 ACK 之后结束整个传输数据过程,这个过程是以 stop 为结束标志。
最后来看一下I2C 的两种地址模式之间的差别,前面提到 I2C 有7比特模式和10比特模式两种,其中七比特模式可以代表128个地址,但是因为有八个地址是预留的,所以实际有效地址只有120个,右边这张图就是预留的这些地址以及它的一个说明。
然后十比特模式的有效地址是1024个,十比特模式和七比特模式在寻址过程当中的差异是什么样的?
来看一下下面这张图,第一行这个是七比特模式,主设备发起 stop 信号之后,直接发起七个比特的设备地址到总线上,然后发送读信号,然后从设备回复一个 ACK ,接下来从设备就要对应的数据送到总线上,主设备回复 ACK ,然后主设备结束此次 I2C 传输的过程,那十比特模式下边,主设备发起 stop 信号之后,它还会发起一个十比特的一个地址标识,它先是11110,这是一个十比特的地址标识,然后后面发送十比特地址的高两个 bit ,A9和 A8,然后发写一个一进去代表是读操作,然后这个时候从设备会回复一个 ACK ,然后在第二个字节里面,它会把地址剩下的八个比特A7~A0传输到总线上,那这个时候如果有一个从设备匹配到的这个十比特的地址,它就继续继续回复 ACK ,然后接下来就是从设备把数据送到 I2C 总线上,主设备回复 ACK 之后结束本次数据传输的过程,那这个11110这个地址对照一下上面的七比特模式下面的预留的八个地址,其实它就是这个十比特 slave addressing 意思就是说它是为十比特预留的这个地址,这样在本节中就介绍了I2C 数据传输的起始、结束以及传输数据的过程、读写操作的过程以及七比特和十比特模式的差别,这样整个I2C 的协议部分就介绍完了。