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模式

图 11.23 I2C协议

图 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]。

图 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]。

图 11.26 10bit寻址格式
11.6.2.4. Restart说明
重复起始条件和起始条件类似,重复起始条件发生在停止条件之前。master想继续给slave发送消息时,在一个字节传输完成后可以发送重复起始条件来启动下一次传输,而不是产生停止条件。
Restart也是在SCL高电平的时候产生一个SDA的下降沿。因此需要先令SDA和SCL都处于高电平状态,再令SDA拉低,本质操作和起始条件是一样的。

图 11.27 Restart时序
传输时序示例如下:

图 11.28 多次读数据

图 11.29 多次写数据

图 11.30 读数据转写数据

图 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保持的时间。

图 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的过程:
master先产生一个START条件
master发送start byte(0000_0001),并发送ACK信号
在此过程中,不能有任何slave相应ACK
master生成restart信号。

图 11.33 START BYTE时序
11.6.2.7. 通用广播地址(General call address)
通用广播地址是为了寻址总线上所有设备。如果一个设备不需要使用广播功能,可以不响应广播。如果设备需要使用广播功能,则它在检测到广播地址后发送响应,并作为slave接收读取总线上发送的数据。
master不知道总线上有多少slave发送响应,总线上所有可以响应广播的slave读取广播地址后的第二个以及后面的字节。而不能处理这些广播数据的slave通过不发送响应的方式忽略它。同样的,master也检测不到没有响应的slave。
广播信息的含义在第二个字节决定

图 11.34 GEN_CALL格式
有两种情况:
- 第二个Byte最低位B为0:
0000_0110(06h):复位并通过硬件写数据到slave的可编程部分。所有可以响应此类广播的slave,收到此两个字节后,进行复位并进入它们地址的可编程部分。
0000_0100(04h):通过硬件写内容到slave的可编程部分,作用类似(06h),但设备不会复位。
0000_0000(00h):这种不允许作为第二个字节使用。
第二个Byte最低位B为1:
该两字节广播定义为“硬件广播”,由一个硬件master器件发送例如,键盘扫描器。它们不能编程来发送一个期望的slave地址,由于硬件master预先不知道报文要传输给哪个器件,它只能产生这个硬件广播呼叫和它自己的地址让系统识别它。
第二个字节中前7位是硬件master的地址,这个地址被一个连接到总线的智能器件识别 (例如 微控制器)并指引硬件master的信息。如果硬件master也可以作为slave,它的slave地址和master地址一样。

图 11.35 硬件广播格式
11.6.2.8. 总线挂死恢复机制
SDA挂死恢复
I2C某些通信异常会造成总线挂死情况,例如slave设备应答ACK拉低SDA时出现异常,此时slave无法释放总线,造成master无法继续掌握总线进行通信。
因此检测到SDA挂死条件,则触发恢复机制。原理如下:
Master尝试在SDA发送逻辑1并且检查SDA是否恢复,最多连续发送9个时钟周期
如果SDA在9个时钟周期内恢复,master则发送一个STOP信号释放总线
如果SDA在9个时钟周期内未恢复,则系统需要硬件复位

图 11.36 第9个时钟恢复

图 11.37 第7个时钟恢复
SCL挂死恢复 通常只有在电路电气发生故障才存在SCL一直处于低电平,除了硬件复位系统外,没有有效的方法来解决此问题,若使能SCL挂死中断,可查看I2C_INTR_STAT[14]检查SCL状态。
11.6.3. 编程指南
11.6.3.1. MASTER初始化流程

图 11.38 master初始化流程
11.6.3.2. SLAVE初始化流程

图 11.39 slave初始化流程