I2C 总线协议

一,简介

 I2C总线被全球超过50个公司的1000+个机构公司使用,已然是一个世界标准.另外,I2C总线与多种不同的控制总线是兼容的,比如SMBus(系统管理总线),PMBus(电源管理总线),IPMI(智能平台管理总线),DDC(显示数据通道)以及ATCA(高级电信架构).如果没记错的话,linux中的I2C框架是完全支持SMBus的.
 

I2C 总线协议_第1张图片

I2C 总线协议_第2张图片

 

二,协议规定

两条数据线,即串行数据(SDA)和串行时钟(SCL),在连接到总线的设备之间传递信息。 每个设备都有一个唯一的地址(无论是微控制器,LCD驱动器,存储器还是键盘接口),并且可以根据设备的功能用作发送器或接收器。  LCD驱动器可能只是接收器,而存储器可以接收和发送数据。 除了发送器和接收器外,在执行数据传输时,设备也可以视为主机或从机(请参见表1)。 主设备是启动总线上的数据传输并生成时钟信号以允许该传输的设备。 那时,任何寻址的设备都被视为从设备。

I2C 总线协议_第3张图片

I2C总线是多主机总线。 这意味着可以连接一个以上的能够控制总线的设备。 由于主机通常是微控制器,因此让我们考虑在连接到I2C总线的两个微控制器之间进行数据传输的情况(见图2)。

I2C 总线协议_第4张图片

该示例重点介绍了I2C总线上的主从关系和接收器-发送器关系。

请注意,这些关系不是永久的,而仅取决于当时数据传输的方向。

数据传输将按以下步骤进行:

1.假设微控制器A要向微控制器B发送信息:

–微控制器A(主),对微控制器B(从机)进行寻址

–微控制器A(主发送器),将数据发送至微控制器B(从接收器)

–微控制器A终止传输。
 2.如果微控制器A要从微控制器B接收信息:

–微控制器A(主)寻址微控制器B(从机)

–微控制器A(主接收器)从微控制器B(从发送器)接收数据

–微控制器A终止传输。

   即使在这种情况下,主机(微控制器A)也会产生时序并终止传输。
   将多个微控制器连接到I2C总线的可能性意味着多个主机可以尝试同时启动数据传输。 为避免此类事件可能造成的混乱,已制定了仲裁(arbitration)程序
   此过程依赖于所有I2C接口到I2C总线的线与(wire-and)连接。
   如果两个或两个以上的主机试图将信息放到总线上,则第一个产生一个“1”,而另一个产生“0”主机将失去仲裁。 仲裁期间的时钟信号是主机通过使用与SCL线的线与连接生成的时钟的同步组合。

主设备始终负责在I2C总线上生成时钟信号。 每个主机在总线上传输数据时都会产生自己的时钟信号。 来自主机的总线时钟信号只有在缓慢的从设备 stretch时钟线时才可以改变,或者在发生仲裁时由另一个主机来改变。
   

 SDA和SCL信号

SDA和SCL都是双向线路,通过电流源或上拉电阻连接到正电源电压(请参见图3)。 总线空闲时,两条线均为高电平。 连接到总线的设备的输出级必须具有漏极开路或集电极开路才能执行线与功能。  I2C总线上的数据可以在标准模式下以高达100 kbit / s的速率传输,在快速模式下以高达400 kbit / s的速率传输,在快速模式Plus或高达1 Mbit / s的速率下传输。 在高速模式下为3.4 Mbit / s。 总线电容限制了连接到总线的接口数量。
  I2C 总线协议_第5张图片

 

SDA和SCL逻辑电平

由于可以连接到I2C总线的各种不同的技术设备(CMOS,NMOS,双极性),逻辑电平“ 0”(低)和“ 1”(高) 不是固定的,取决于相关的VDD电平。 输入参考电平设置为VDD的30%和70%。  VIL为0.3*VDD,VIH为0.7*VDD。

数据有效性

SDA线上的数据必须在时钟的高电平期间保持稳定。 仅当SCL线上的时钟信号为LOW时,数据线的HIGH或LOW状态才能改变(见图4)。 每个传输的数据位产生一个时钟脉冲。

I2C 总线协议_第6张图片

 

START和STOP条件

   所有传输均以START(S)开始,并以STOP(P)终止(请参见图5)。
   SCL为高电平时,SDA线上从高电平到低电平的过渡定义了启动条件。
   SCL为高电平时,SDA线上的由低到高的跳变定义了一个停止条件。

   启动和停止条件始终由主机生成。  START条件后,总线被视为繁忙。 在停止条件之后的某个时间,总线被视为再次空闲。 
   如果产生重复的START(Sr)而不是STOP条件,则总线将保持繁忙状态。 在这方面,START(S)和重复START(Sr)条件     在功能上是相同的。 因此,除非Sr特别相关,否则将S符号用作代表START和重复START条件的通用术语。

I2C 总线协议_第7张图片

字节格式

SDA线上的每个字节必须为八位长。 每次传输可传输的字节数不受限制。 每个字节后面必须有一个确认位ack。 首先使用最高有效位(MSB)传输数据(参见图6)。 如果从机在执行其他功能之前(例如,服务于内部中断)无法接收或发送另一个完整的数据字节,则它可以将时钟线SCL保持为低电平以强制主机进入等待状态。 当从机准备好接收另一个数据字节时,数据传输将继续,并释放时钟线SCL。

I2C 总线协议_第8张图片

应答(ACK)和不应答(NACK)

应答发生在每个字节之后。 确认位允许接收器向发送器发送信号,告知该字节已成功接收,并且可以发送另一个字节。 主机产生所有时钟脉冲,包括应答第九个时钟脉冲。
   确认信号的定义如下:发送器在确认时钟脉冲期间释放SDA线,因此接收器可以将SDA线拉低,并在此时钟脉冲的高电平期间保持稳定的低电平(见图4)。 还必须考虑建立和保持时间。

当在第九个时钟脉冲期间SDA保持高电平时,这被定义为“不应答”信号。 然后,主机可以产生停止条件以中止传输,或产生重复的开始条件以开始新的传输。 导致NACK产生的条件有五个:

   1.总线上没有接收器,带有发送的地址,因此没有设备响应应答。
   2.接收器无法执行收发操作,因为它正在执行某些实时功能,并且尚未准备好开始与主机进行通信。
   3.在传输过程中,接收器会收到不理解的数据或命令。
   4.在传输期间,接收器无法再接收任何数据字节。
   5.主接收器必须向从发送器发信号通知传输结束。

时钟同步

两个主机可以同时开始在空闲总线上进行传输,并且必须有一种确定哪个方法可以控制总线并完成其传输的方法。 这是通过时钟同步和仲裁完成的。 在单主机系统中,不需要时钟同步和仲裁。
   时钟同步是通过I2C接口与SCL线的线与连接执行的。 这意味着SCL线上的从HIGH到LOW的过渡会导致相关的主机开始计数其LOW周期,并且一旦主机时钟变为LOW,它就会将SCL线路保持在该状态,直到达到时钟HIGH状态为止(请参见 图7)。 但是,如果另一个时钟仍在其LOW周期内,则此时钟从LOW到HIGH的转变可能不会改变SCL线的状态。 因此,SCL线由主机以最长的低电平周期保持为低电平。 低电平周期较短的主机在此时间内进入高电平等待状态。

也就是这个意思 ---

SCL线的高到低切换会使器件开始数它们的低电平周期,而且一旦器件的时钟变低电平,它会使SCL线保持这种状态直到到达时钟的高电平。但是,如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL线的状态,因此,SCL线被有最长低电平周期的器件保持低电平,此时,低电平周期短的器件会进入高电平的等待状态。

   当所有有关的器件数完了它们的低电平周期后,时钟线被释放并且变成高电平,之后器件时钟和SCL线的状态没有差别,而且所有器件会开始数它们的高电平周期,首先完成高电平周期的器件会再次将SCL线拉低。

   这样,产生的同步SCL时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。

I2C 总线协议_第9张图片

可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步。

  • 低电平对齐:所有时钟同时进入低电平周期;如果有时钟的高电平周期未完成,则会立即进入低电平周期,并计算各自的低电平周期,高电平周期被终止。
  • 高电平对齐:所有时钟同时进入高电平周期。如果有时钟提前进入高电平周期,则提前进入高电平的时钟不会将这段时间算作自己的高电平周期,虽然是高电平,但是不计入高电平周期,只有在高电平对齐之后才会开始计算自己的高电平周期。

SCL就是在这种低电平对齐和高电平对齐的反复循环而稳定的。

 

仲裁

仲裁与同步类似,是指仅在系统中使用多个主机时才需要的协议的一部分。 slave不参与仲裁程序。 只有在总线空闲时,主机才可以开始传输。 两个主机可以在启动条件的最短保持时间(tHD; STA)内产生启动条件,从而在总线上产生有效的启动条件。 然后需要仲裁以确定哪个主机将完成其传输。

仲裁一bit一bit的进行。 在每个位中,当SCL为高电平时,每个主机检查SDA级别是否与其发送的内容匹配。 此过程可能需要很多位。 实际上,只要传输相同,两个主机就可以毫无错误地完成整个事务。 主机第一次尝试发送高电平,但检测到SDA电平为低电平时,主机知道它已失去仲裁并关闭其SDA输出驱动器。 另一个主服务器继续完成其事务。

在仲裁过程中不会丢失任何信息。 丢失仲裁的主机可以生成时钟脉冲,直到丢失仲裁的字节的末尾为止,并且在总线空闲时必须重新启动其事务。
   如果主机同时包含从机功能,并且在寻址阶段丢失仲裁,则胜出的主机可能会尝试寻址。 因此,丢失的主机必须立即切换到其从机模式。
   图8显示了两个主机的仲裁程序。 取决于连接到总线的主机数量可能涉及更多。 当主机生成的DATA1的内部数据电平与SDA线上的实际电平之间存在差异时,DATA1输出将关闭。 这不会影响获胜主数据启动的数据传输。I2C 总线协议_第10张图片

 

   由于对I2C总线的控制完全取决于竞争主机发送的地址和数据,因此总线上没有中央主机,也没有任何优先级顺序。
   如果一个主机发送重复的START或STOP条件而另一主机仍在发送数据时,仲裁过程仍在进行中,则存在不确定的条件。 换句话说,以下组合会产生不确定的条件:

   •主机1发送重复的START条件,而主机2发送数据位。
   •主站1发送一个STOP条件,而主站2发送一个数据位。
   •主站1发送重复的START条件,而主站2发送STOP条件。

时钟延长-clock stretching

在I2C的主从通信过程中,总线上的SCL时钟总是由主机来产生和控制的,但如果从机跟不上主机的速率,I2C协议规定从机是可以通过将SCL时钟线拉低来暂停一个传输的,直到从机释放掉SCL线,传输继续进行。

时钟延长通过将SCL线保持为低电平来暂停事务。 直到再次释放高电平,事务才能继续。 时钟延长是可选的,实际上,大多数从设备不包括SCL驱动程序,因此它们无法延长时钟。
   

从字节级来看, 主机要读取从机的数据,如果从机还没有准备好数据(此时还在I2C中断中),这时从机就可以将SCL线拉低来暂停一下传输,如果数据准备好了,从机将SCL线释放,主机就可以继续SCL时钟通过移位的方式读取从机发送寄存器内部的数据。

从位级来看,I2C总线上的设备可以通过增长每一个时钟的低周期来降低总线时钟.所以每个主机可以适应这个设备的内部操作速率.

总的来说,clock stretching其实是一种降频的手段,使得更高频率的主机也能适应低频率从机的通信。clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟。

特别要注意的地方:如果用示波器观察波形,要注意有没有clock stretching。

从机地址和R / W位

数据传输遵循图9所示的格式。在启动条件(S)之后,发送从机地址。 该地址长7位,后跟第八位,后者是数据方向位(R / W)-“ 0”表示传输(写),“ 1”表示对数据的请求(读)。 数据传输总是由主机产生的STOP条件(P)终止。 但是,如果主机仍然希望在总线上进行通信,则它可以产生重复的START条件(Sr)并寻址另一个从机而无需先产生STOP条件。 这样,在这种传输中,读/写格式的各种组合都是可能的。

I2C 总线协议_第11张图片

可能的数据传输格式为:

   1•主发送器向从接收器发送。 传输方向未更改(请参见图11)。 从机接收器确认每个字节。
   2•主机在第一个字节后立即读取从机(见图12)。 在第一次确认时,主发送器成为主接收器,从接收器成为从发送器。 从设备仍然会生成该第一个确认。 主机产生后续的确认。  STOP条件是由主机产生的,主机在STOP条件之前发送一个不应答(A)。
   3•组合格式(请参见图13)。 在传输中改变方向期间,START条件和从机地址都重复,但R / W位相反。 如果主接收器发送重复的START条件,则在重复的START条件之前发送不应答(A)。

I2C 总线协议_第12张图片
 

10-bit addressing

10位寻址扩展了可能的地址数量。 具有7位和10位地址的设备可以连接到同一I2C总线,并且7位和10位寻址都可以在所有总线速度模式下使用。 当前,没有广泛使用10位寻址。
 10位从地址由遵循启动条件(S)或重复的启动条件(Sr)的前两个字节形成。
   第一个字节的前七个位是组合1111 0XX,其中最后两个位(XX)是10位地址的两个最高有效位(MSB); 第一个字节的第八位是R / W位,它确定消息的方向。
  尽管保留地址位1111 XXX有八种可能的组合,但只有四个组合1111 0XX用于10位寻址。 其余四个组合1111 1XX保留用于将来的I2C总线增强。

 


先前针对7位寻址而描述的读/写格式的所有组合都可以通过10位寻址来实现。 这里详细介绍了两个:

•主发送器使用10位从地址发送到从接收器。
   传输方向未更改(请参见图14)。 当10位地址遵循START条件时,每个从站将从站地址的第一个字节的前七个位(1111 0XX)与自己的地址进行比较,并测试第八个位(R / W方向位)是否为0。 一个以上的设备可能找到一个匹配项并生成一个确认(A1)。 找到匹配项的所有从站都会将从站地址第二个字节的八位(XXXX XXXX)与自己的地址进行比较,但是只有一个从站会找到匹配项并生成确认(A2)。 匹配的从机将一直由主机寻址,直到收到停止条件(P)或重复的启动条件(Sr),然后再收到一个不同的从机地址。
   •主接收器读取具有10位从地址的从发送器。
   在第二个R / W位之后更改传输方向(图15)。 直到并包括确认位A2,该过程与针对主发送器寻址从接收器的过程相同。 在重复启动条件(Sr)之后,匹配的从站会记住之前已对其寻址。 然后,该从站检查从站地址Sr之后的从站地址的第一个字节的前7位是否与START条件(S)之后的地址相同,并测试第八位(R / W)是否为1。
   如果存在匹配,则从站认为已将其寻址为发送方,并生成确认A3。 从机发送器保持寻址状态,直到它接收到一个停止条件(P),或者直到它接收到另一个重复的起始条件(Sr),后跟一个不同的从机地址。 在重复启动条件(Sr)之后,所有其他从设备也将比较从地址(1111 0XX)的第一个字节的前七个位与它们自己的地址,并测试第八个(R / W)位。
   但是,由于R / W = 1(对于10位设备)或1111 0XX从机地址(对于7位设备)不匹配,将不会寻址它们。

I2C 总线协议_第13张图片

 

 

 

三,I / O级和总线线路的电气规格和时序

表9给出了I / O电平,I / O电流,尖峰抑制,输出斜率控制和引脚电容。表10给出了I2C总线时序特性,总线电容和噪声容限。  I2C总线的时序定义。
   表10中指定的SCL时钟的最小HIGH和LOW周期确定了最大比特传输速率:标准模式设备为100 kbit / s,快速模式设备为400 kbit / s,快速模式为1000 kbit / s 加。 设备必须能够以自己的最大比特率进行传输,要么能够以该速度进行发送或接收,要么通过应用第3.1.7节中描述的时钟同步过程来迫使主机进入等待状态并拉低SCL信号的周期。 在后一种情况下,比特传输速率降低。

 

I2C 总线协议_第14张图片

I2C 总线协议_第15张图片

I2C 总线协议_第16张图片

I2C timing define

I2C 总线协议_第17张图片

 

你可能感兴趣的:(SoC)