文章目录
前言
本片博文主要总结I2C 通信协议的相关知识,以及学习过程中的一些体会、遇到的问题,望可以帮助有需要的人。
笔记内容多为自己总结、心得,如有错漏不恰当之处望不吝指正。
一、I2C 是什么?
I2C(inter-integrated circuit)总线,是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
二、I2C 物理层
1.总线引脚定义
SCL: 串行时钟线,用于同步传送数据;
SDA: 串行数据线,用于传输数据;
2.物理层
I2C 通讯设备之间的常用连接方式如下图所示:
I2C 特点如下:
►支持多个设备的总线;
►总线由SCL、SDA总线组成,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步;
► 每个连接到总线的设备都有一个设备地址,用于主机与多个设备之间的选择性通信;
► 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平;
► 当多个主机同时使用总线时,使用仲裁方式决定哪个设备占用总线,防止数据传输冲突;
► 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式;
► 由于总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量;
3.协议层
I2C 协议层主要包含如下部分:
► 起始信号
► 数据传输
► 应答信号
► 停止信号
1)起始/停止信号
SCL = 1时,SDA存在四种状态:高电平、低电平、上升沿和下降沿,因此排列组合如下:
SCL | SDA | 信号定义 |
---|---|---|
1 | 下降沿 | Start信号 |
1 | 上升沿 | Stop信号 |
1 | 1 | 数据1 |
1 | 0 | 数据0 |
2)应答(ACK)信号
► I2C 数据传输 需要接收方响应信号,以指示数据是否正确收到;
► 响应信号传输位于第9个时钟,此时主机释放SDA控制权,由从机端控制SDA;
► 响应信号如下:
应答信号(ACK): SDA = 0;
非应答信号(NACK): SDA = 1;
3)数据传输
► SCL = 0 :允许SDA进行数据切换;
► SCL = 1 :锁定SDA状态输出(SDA = 1,则输出数据为1,SDA = 0,则输出数据为0);
► 数据传输以 字节为单位,
4)数据分类
传输的数据包含 地址字节和要传输的数据字节;
【地址字节】
► I2C 协议规定设备地址可以是 7 位或 10 位,实际中 7 位的地址应用比较广泛;
► 先传输MSB,后传输LSB;
► 第8/11位为读写控制位:0:读/ 1:写;
【数据字节】
数据字节为要传输的数据,无特定格式;
4.通信示例
【字节写入 】
通信过程为:
► 主机发送Start信号;
► 开始传输设备地址,先传输MSB,后LSB,R/W位 = 0;
► 从机收到设备地址,进行匹配,若匹配,则发送应答信号(ACK),否则保持不变;
► 主机收到应答信号,发送写入的地址和写入的数据;
► 从机接收到每个字节后,发送一个应答信号(ACK);
► 数据传输完成,主机发送Stop信号,结束本次传输;
【字节读取 】
通信过程为:
► 主机发送Start信号;
► 开始传输设备地址,先传输MSB,后LSB,R/W位 = 0;
► 从机收到设备地址,进行匹配,若匹配,则发送应答信号(ACK),否则保持不变;
► 主机收到应答信号,发送要读取的数据的地址;
► 从机接收到数据地址后,发送一个应答信号(ACK);
► 主机发送Start信号;
► 开始传输设备地址,先传输MSB,后LSB,R/W位 = 1;
► 从机收到设备地址,进行匹配,若匹配,则发送应答信号(ACK),否则保持不变;
► 主机释放SDA控制权,从机接收SDA控制区,发送数据至主机;
► 主机收到数据后,无需发送ACK应答;
► 数据传输完成,主机发送Stop信号,结束本次传输;
Reference
[1] 《零死角玩转 STM32F103》 - 第24章 I2C—读写 EEPROM
[2] 《AT24C02》- ALL