I2C总线的简单理解

来源:互联网 发布:多台docker php-fpm 编辑:程序博客网 时间:2024/05/19 13:09

I2C总线简介

I2C总线是一种简单双向二进制同步串行总线,其只需要两根双向I/O线即可以实现连接在总线上的器件之间的信息传递。

I2C总线包含两根双向I/O线:SCL(serial clock)线和SDA(serial data line)线,当总线处于空闲状态时SCL和SDA为高电平,其结构如下:


I2C总线术语

术语

描述

发送器

发送数据到总线上的器件

接收器

从总线上接收数据的器件

主机

初始化发送、产生时钟信号、终止发送的器件

从机

被主机寻址的器件

多主机

同时又多于一个主机尝试控制总线,但不破坏报文

同步

两个以上器件同步时钟的信号的过程

仲裁

有多个主机尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程

I2C总线同步和仲裁

注意到SDA和SCL线都是漏极开路结构(OD),当总线空闲时其为高电平,但只要连接到总线上的任一器件输出低电平,总线就会变成低电平。这就是说总线上任一器件的SDA/SCL和总线是“与”的关系。

多主机尝试控制总线,它们都会输出自己的SCL到总线上,而总线的SCL就是多主机的SCL相互与的结果。总线SDA上的数据只有在总线SCL为高电平时有效。由于总线上的任一器件和总线的关系是“与”。也就是说有任一器件发出低电平,总线都会变成低电平。换句话说就是任一器件提出反对意见(低电平),总线SDA上的数据都是无效的。

因此,同步我的理解就是大家都允许才开始抢占控制总线的时间段。

在多主机都允许开始,总线SCL表现为高电平,即总线SDA是有效的。这时候总线仲裁就变为SDA的仲裁了。同样由于“与”的关系,一旦其他主机发送低电平,总线SDA会表现为低电平,如果有发送高电平的主机,那么它将断开数据输出级。只能淘汰高电平或低电平主机,但因为此时总线SDA表现为低电平,如果要报文不破坏就只能淘汰高电平的主机。

SDA仲裁可以持续多位,如果起始条件一致,那就接着仲裁地址位,如果地址位一致,那就接着仲裁下一位。这样的仲裁就不会破坏报文。

 

通俗点说,仲裁分为两个部分:仲裁SCL和仲裁SDA。仲裁SCL表现为寻找多主机都同意总线SDA有效的时间点,即同步。仲裁SDA表现为淘汰掉破坏报文者,即主机发送内容与总线上的内容不一致者。

I2C总线起始条件和终止条件

起始条件:总线SCL高电平,SDA从高电平变为低电平时。

终止条件:总线SCL高电平,SDA从低电平变为高电平时。

注:当SDA在传输数据时,如果其需要转换电平,那么SCL必须先拉低为低电平。

I2C总线的字节格式和响应

发送到总线SDA上的每个字节必须为8位,每个字节后面必须跟一个响应位。每次传输发送的字节数不限。

发送器在发送完一个字节后会释放掉总线SDA,在第九个时钟,接收器可以响应一个ACK,即拉低总线SDA电平,这称为响应。当然接收器也可以不响应,但第九个时钟的位置称为响应位。

I2C总线写过程

(1)主机发出起始条件:SCL为高电平,SDA从高电平变为低电平

(2)主机发送欲寻址器件的地址(7bit)和写操作0(1bit),等待ACK

(3)从机响应ACK

(4)主机发送寄存器地址(8bit),等待ACK

(5)从机响应ACK

(6)主机发送数据(8bit),即要写入寄存器的数据,等待ACK

(7)从机响应ACK

(8)步骤(6)和(7)重复多次

(9)主机发出终止条件:SCL为高电平,SDA从低电平变为高电平

I2C总线读过程

(1)主机发出起始条件:SCL为高电平,SDA从高电平变为低电平

(2)主机发送欲寻址器件的地址(7bit)和读操作1(1bit),等待ACK

(3)从机响应ACK

(4)主机发送寄存器地址(8bit),等待ACK

(5)从机响应ACK

(6)主机发出起始条件

(7)主机发送欲寻址器件的地址(7bit)和读操作1(1bit),等待ACK

(8)从机响应ACK

(9)从机发送寄存器数据(8bit),等待主机ACK

(10)主机发送ACK

(11)步骤(9)和步骤(10)重复多次

(12)主机发送NACK

(13)主机发出终止条件:SCL为高电平,SDA从低电平变为高电平