按照学习通信协议的套路,下面讨论I2C的物理层和协议层。
物理层
在上图中我们可以看到:
那么根据我们所掌握的简单的通信知识和经验,我们可以得出以下初步结论:
有了上面的初步了解,在看协议的具体内容时,我们就能很快接受并记住I2C的物理层特性。
物理层特性 它是支持设备的总线。 可连接多个I2C通信设备,支持多个通信主从。 连接到总线上的每个设备都有一个独立的地址。 总线通过上拉电阻连接到电源。 当I2C设备空闲时,会输出高阻状态。 当所有设备空闲且全部输出高阻状态时,上拉电阻会将总线拉至高电平。 当多台主机同时使用总线时,为了防止数据冲突,采用仲裁的方式来决定哪个设备占用总线。 它具有三种传输模式:标准模式传输速率为/s,快速模式为/s,高速模式可达3.4Mbit/s。 连接到同一总线的IC数量受到总线最大电容400pF的限制。 协议层
协议层定义:
说白了,它定义了传输过程中01字符串的含义。
传输过程
我将最基本的操作(例如启动和停止信号以及响应信号)称为原子操作。
在讨论如何实现原子操作之前,我们首先对I2C传输流程有一个整体的了解。
粗略地说,I2C传输过程中存在三种情况:写、读、混合读写。
写作过程
从上图可以看出,整个编写流程由以下几个部分组成:
这是一个非常严格的过程。 每次发送特定消息时,都需要等待对方的回复。 只有确认接收端已经收到后,才会继续发送数据。 最大程度保证了数据传输的可靠性。
值得注意的是,这里的从机地址协议规定可以选择7位或10位,但大多数情况下都使用7位地址。
阅读过程
整个阅读过程由以下几个部分组成:
读写混合模式
读写混合的过程比读写分离模式要复杂一些。
它在一次通信中有两个操作:
具体流程有以下几个部分:
根据我的初步研究分析,之所以有三种模式,应该是对应三种不同的需求:
原子操作
上述传输过程是比较宏观的。 我们来看看I2C是如何实现上述信号的。
下面的实现都是协议特定的设计,是人为定位的。 虽然它们有一定的内部设计逻辑,但你只需要记住定义即可。
启动和停止信号
当下列条件同时满足时,为启动信号:
当下列条件同时满足时,为终止信号:
数据表示
也称为数据有效性,它具体定义了01数据的级别表示。
1的表示:
0 表示:
当SCL为低电平时,SDA没有意义。 此时01表示切换。
从上面的定义可以看出,I2C在一个时钟周期内只能传输1位数据。
总结以上几点:当SCL为高电平时,数据有效。
地址和数据方向
协议将地址定义为7位或10位。 这个你可以自己选择。 一般选择7位。
原因很简单,一个字节就是8位。 7个地址位+方向位正好是一个字节。
因此,有两个对应的地址名称需要注意:
回复
接收端每收到一个字节信号,就必须向发送端发送一个确认(ACK)或无响应(NACK)信号。
协议规定该信号在发送一个字节数据后的第9个时钟周期内产生。
此时,如果SDA为低电平,则表示响应信号,否则为非响应信号。
概括
有了上面对I2C协议的了解。 你会发现,所谓xxx通信协议,是指总线上的控制电平按照协议标准发生变化。 只要能够达到协议规定的特征级别,协议就可以实现。 因此,软件和硬件都可以实现该协议通信。 不同的是软件实现会消耗CPU资源,而硬件通信可以减轻CPU的负担。