11.6.2. 功能描述

11.6.2.1. 协议约定

数据帧

大小固定为8bit(一字节)

传输方向

高位先发

总线释放状态

SCL 和 SDA 均为高电平,其中 SCL 一直由Master设备控制;

启动信号(START)

SCL高,SDA由高转低;

停止信号(STOP)

SCL高,SDA由低转高;

应答信号
  • ACK:Master设备控制 SCL,发送完8bit后释放 SDA,在第九个 SCL 波形时,Slave设备拉低 SDA;

  • NACK:Master设备控制 SCL,发送完8bit后释放 SDA,在第九个 SCL 波形时,Slave设备拉高 SDA;

Slave设备地址
  • 含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突;

  • 不含CPU的非智能器件,高4bit由厂家在器件内部固化,不可改变;低3bit由引脚连接电平决定(例如eeprom,三个引脚常用名字A1、A2、A3);

读写位

1bit,与Slave设备地址的7bit,组成读写数据帧的数据内容(Slave设备7bit + 1bit),0表示读,1表示写;

空闲检测

Master设备检测到 SDA、 SCL 均为高电平。

11.6.2.2. Master & Slave模式

../../../_images/i2c.png

图 11.23 I2C协议

../../../_images/i2c_conn.png

图 11.24 master & slave关系图

Master发送操作:master设备通过I2C_DATA_CMD[8]写0进行发送请求,将数据写进I2C_DATA_CMD[7:0],然后发送到I2C总线,由响应的slave设备从总线接收数据。

Master接收操作:master设备通过I2C_DATA_CMD[8]写1进行接收请求,由响应的slave设备将数据发送到I2C总线,然后master从I2C_DATA_CMD[7:0]获取数据。

Slave发送操作:接收到master的接收请求,将数据写进I2C_DATA_CMD[7:0],然后发送到I2C总线。

Slave接收操作:接收到master的发送请求,从I2C_DATA_CMD[7:0]获取数据

Mater发起寻址,发起START信号,生成SCL,生成STOP信号,可发送和接收;Slave作为被寻址的一方,发起ACK或Not ACK信号,可发送和接收。注意I2C_DATA_CMD[8]只能在master模式下配置,I2C任何的通信行为都由master主动发起。

11.6.2.3. 7bit & 10bit寻址

7bit寻址格式

I2C_TAR[6:0]对应此7位地址,R/W为I2C_DATA_CMD[8]。

../../../_images/i2c_7bit_addr.png

图 11.25 7bit寻址格式

备注

其中寻址模式存在一些slave设备支持start字节,即master先发起‘0000 0001’字节(不需要slave ACK),再发起START信号进行寻址。

10bit寻址格式

10bit寻址分为两个字节发送,第一个字节的bit[7:3]向slave指示这是一个10bit的地址。紧接者的bit[2:1]为I2C_TAR[9:8],R/W为I2C_DATA_CMD[8];第二个字节为I2C_TAR[7:0]。

../../../_images/i2c_10bit_addr.png

图 11.26 10bit寻址格式

11.6.2.4. Restart说明

重复起始条件和起始条件类似,重复起始条件发生在停止条件之前。master想继续给slave发送消息时,在一个字节传输完成后可以发送重复起始条件来启动下一次传输,而不是产生停止条件。

Restart也是在SCL高电平的时候产生一个SDA的下降沿。因此需要先令SDA和SCL都处于高电平状态,再令SDA拉低,本质操作和起始条件是一样的。

../../../_images/restart.png

图 11.27 Restart时序

传输时序示例如下:

../../../_images/read_read.png

图 11.28 多次读数据

../../../_images/write_write.png

图 11.29 多次写数据

../../../_images/read_write.png

图 11.30 读数据转写数据

../../../_images/write_read.png

图 11.31 写数据转读数据

11.6.2.5. SDA_SETUP_TIME和SDA_HOLD_TIME说明

SDA_SETUP_TIME为SCL延迟时间,表示SCL上升沿相对SDA的延迟量,只有当I2C作为slave发送数据时使用。

SDA_HOLD_TIME为SDA保持时间,表示SCL拉低之后SDA保持的时间。

../../../_images/sdatime.png

图 11.32 SETUP和HOLD说明

11.6.2.6. START BYTE机制

START BYTE机制服务于当片上系统没有专用的I2C模块的情况。START BYTE会将开始条件的过程延长,在生成START条件后,继续发送1个Byte信号(0000_0001),master持续的将SDA线拉低7个周期

当I2C被设为slave时,无需使用START BYTE机制;当I2C被设为master,启用START BYTE可以让轮询总线的处理器以较低的频率采样SDA线。当采样到起始字节中任意一个0时,切换到更快的频率,找到0000_0001后产生restart,然后开始传输。

START BYTE的过程:
  1. master先产生一个START条件

  2. master发送start byte(0000_0001),并发送ACK信号

  3. 在此过程中,不能有任何slave相应ACK

  4. master生成restart信号。

../../../_images/start_byte.png

图 11.33 START BYTE时序

11.6.2.7. 通用广播地址(General call address)

通用广播地址是为了寻址总线上所有设备。如果一个设备不需要使用广播功能,可以不响应广播。如果设备需要使用广播功能,则它在检测到广播地址后发送响应,并作为slave接收读取总线上发送的数据。

master不知道总线上有多少slave发送响应,总线上所有可以响应广播的slave读取广播地址后的第二个以及后面的字节。而不能处理这些广播数据的slave通过不发送响应的方式忽略它。同样的,master也检测不到没有响应的slave。

广播信息的含义在第二个字节决定

../../../_images/gencall.png

图 11.34 GEN_CALL格式

有两种情况:

  1. 第二个Byte最低位B为0:
    • 0000_0110(06h):复位并通过硬件写数据到slave的可编程部分。所有可以响应此类广播的slave,收到此两个字节后,进行复位并进入它们地址的可编程部分。

    • 0000_0100(04h):通过硬件写内容到slave的可编程部分,作用类似(06h),但设备不会复位。

    • 0000_0000(00h):这种不允许作为第二个字节使用。

  2. 第二个Byte最低位B为1:

    • 该两字节广播定义为“硬件广播”,由一个硬件master器件发送例如,键盘扫描器。它们不能编程来发送一个期望的slave地址,由于硬件master预先不知道报文要传输给哪个器件,它只能产生这个硬件广播呼叫和它自己的地址让系统识别它。

    • 第二个字节中前7位是硬件master的地址,这个地址被一个连接到总线的智能器件识别 (例如 微控制器)并指引硬件master的信息。如果硬件master也可以作为slave,它的slave地址和master地址一样。

../../../_images/gencallmaster.png

图 11.35 硬件广播格式

11.6.2.8. 总线挂死恢复机制

SDA挂死恢复

I2C某些通信异常会造成总线挂死情况,例如slave设备应答ACK拉低SDA时出现异常,此时slave无法释放总线,造成master无法继续掌握总线进行通信。

因此检测到SDA挂死条件,则触发恢复机制。原理如下:

  1. Master尝试在SDA发送逻辑1并且检查SDA是否恢复,最多连续发送9个时钟周期

  2. 如果SDA在9个时钟周期内恢复,master则发送一个STOP信号释放总线

  3. 如果SDA在9个时钟周期内未恢复,则系统需要硬件复位

../../../_images/i2c_discover1.png

图 11.36 第9个时钟恢复

../../../_images/i2c_discover2.png

图 11.37 第7个时钟恢复

SCL挂死恢复 通常只有在电路电气发生故障才存在SCL一直处于低电平,除了硬件复位系统外,没有有效的方法来解决此问题,若使能SCL挂死中断,可查看I2C_INTR_STAT[14]检查SCL状态。

11.6.3. 编程指南

11.6.3.1. MASTER初始化流程

../../../_images/i2c_master_pro.png

图 11.38 master初始化流程

11.6.3.2. SLAVE初始化流程

../../../_images/i2c_slave_pro.png

图 11.39 slave初始化流程