i2c协议详细介绍

1.SDA和SCL信号

  SDA和SCL都是双向线,通过一个电流源或者上拉电阻连接到一个正电压。当总线空闲时,两线都是高电平。连接到总线的设备输出状态必须开漏或者开集电极来执行线与功能。总线数据的传输速率在标准模式下达到100kbit/s,在快速模式下达到400kbit/s,在快速+模式下达到1Mbit/s,在高速模式下达到3.4Mbit/s。总线电容限制了连接到总线上的接口数量

2.SDA和SCL的逻辑电平

  由于不同种类的技术设备(CMOS,NMOS,bipolar)都能接入IIC总线,逻辑电平0和1不是固定的,而是依赖于相关联的Vdd。输入参考电平是0.3Vdd和0.7Vdd(一些早期设备是固定的Vil=1.5V和Vih=3.0V)。

3.数据有效性

  SDA上的数据必须在SCL为高电平时保持稳定,而在SCL为低电平时,切换高低状态。每发送一位数据,需要一个时钟脉冲。

4、起始和停止状态。

  全部的通信事物开始于一个起始信号,终止于一个停止信号。在SCL为高电平时,SDA从高到低的转换,定义为起始状态。在SCL为高电平,SDA从低到高的转换,定义为停止状态。

  

  起始状态和停止状态一直由主机生成。起始状态之后总线处于忙的状态。在停止状态出现,再经过一个确定的时间后,总线状态变成空闲。

  如果主机生成一个重复的起始状态代替停止状态,总线将一直保持忙状态。在这方面,起始状态和重复的起始状态在功能上是一致的。

  连接到总线上的设备如果集成了所需的接口硬件,能够很容易的监测到起始状态和停止状态。对于没有此硬件的控制器,不得不在一个时钟周期内至少采样SDA线两次,来监测其电平变化。

5.字节格式

  在SDA线上的每个字节都是8位长。每次传输能被发送的字节数量无限制。每个字节后面必须跟随来自接收方的ACK(一个低电平)。数据总是从字节的高位开始传输。如果从机不能够接收或者发送另一个完整的字节数据,比如从机正在执行一个中断服务,从机应该保持SCL为低电平,强制主机进入一个等待状态。当从机准备好数据并且释放SCL线,数据传输可继续进行。

6.ACK和NACK

  每个字节后面都会产生ACK。接收者使用ACK位通知发送者字节数据已经被成功接收,下一个可以被发送。主机产生所有的时钟脉冲,也包括产生ACK的第九个时钟脉冲。

  ACK信号被定义如下:发送者在ACK时钟脉冲期间释放SDA线,接收者能置SDA线为低电平,并且在时钟脉冲高电平期间保持低电平状态。建立和保持时间也必须被考虑。

  在第九个时钟脉冲如果SDA保持高电平,则被定义为NACK信号。此时,主机能生成一个停止状态来终止发送或者生成一个重复开始状态来启动一个新的发送。如下有五种情况能导致产生NACK信号:

  (1)总线上没有数据地址对应的接收者,所以没有设备能够响应一个ACK。

  (2)接收者因为正在执行一个实时功能,没有准备好开始和主机通信,不能够执行接收或者发送。

  (3)在数据传输期间,接收者获取的数据或者命令不能被理解。

  (4)在数据传输期间,接收者不能接收更多的数据了。

  (5)当主机作为接收者时,它必须使用NACK信号通知从机发送者停止传输。

7.时钟同步
  两个主机能同时在空闲的总线上开始发送。这里必须有一个方式来决定哪个主机控制总线完成其数据传输。这个被时钟同步和仲裁来完成。在单个主机系统中,时钟同步和仲裁是不需要的。

  时钟同步使用IIC接口的线与连接,在SCL线上完成。这意味着在SCL线上一个从高到低的转换会造成主机开始对他们的低电平周期计数。一旦一个主机时钟变为低电平,它将使SCL线保持低电平直到时钟的高电平状态到达。如果另一个时钟仍然保持低电平周期,则由低到高的时钟电平转换不能改变SCL线的状态。SCL线因此被拥有最长低电平时钟的主机保持为低。此时,拥有更短低电平时钟的主机则进入一个高电平等待状态。当全部主机计数完其时钟低电平周期,SCL线被释放变为高电平。然后主机开始计数其时钟高电平周期,第一个完成时钟高电平周期的主机将再次将SCL线拉低变为低电平。

  通过这种方式,一个同步的SCL时钟被生成。同步时钟的低周期被拥有最长时钟低周期的主机决定,同步时钟的高周期被拥有最短时钟高周期的主机决定。

  

8.仲裁

  当 SCL 线是高电平时,仲裁在 SDA 线上发生。在其他主机发送低电平时,发送高电平的主机将由于总线电平与自己不同而失去总线,继而断开其输出级。

  

9.从机地址和读写位

  从机有7位地址,在EEPROM中有固定地址和硬件决定地址组成1010+A2A1A0,第八位为读写位,0为写,1为读。

数据传输应该以一个停止位结束。如果在结束前,主机仍想传输数据,则可以重新发送起始位和地址数据。

  主机写,从机主要产生ACK

  

  主机读,从机发送数据后,主机产生ACK,最后一个数据主机发送NACK和STOP

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章