将 I2C spec 文章总结为一篇,目录如下
I2C Introduction I2C Architecture I2C Transfer I2C Synchronization And Arbitration I2C Hs-mode
1、I2C Introduction
1、I2C 历史
- I2C:Inter-Integrated Circuit,集成电路总线。
- I2C 是 Philips 公司在 1982 年为主机板、嵌入式系统(短距)设计的一种简单、双向二线制同步串行总线。
- Philips 半导体事业部就是现在的 NXP。
- I2C 的专利在 2006 年 11 月 1 日已到期,大家可以免费使用。
- Intel 1995 年推出的 I2C 兼容总线(System Managerment Bus),即 SMBus 或 SMB
- 最新版本 I2C spec v.6 于 2014.04.04 推出。
2、I2C 的未来
- MIPI 协会在 2014 年左右定稿了 I3C (improved Inter Integrated Circuit)规范,I3C 在 I2C 的规格上建立了功能超集,支持高传输速率模式。
- 当前不论是 Soc 厂商,还是 device 厂商,都已经开始或正在向 I3C 过度。
- I3C spec 有 2016 版本、2018 版本,最新的是 2021 版本(446页)。
3、I2C 的速度
- I2C 读法:“I方C”、“I-squared-C”、"I two C"
- I2C 是一种低速、串行总线,有 SDA(串行数据线) 和 SCL(串行时钟线) 两条信号线,半双工通信。
通信速度如下:
• Bidirectional bus:
- Standard-mode (Sm), 100 kbit/s
- Fast-mode (Fm), 400 kbit/s,用在 sensor、carema、touch 等。
- Fast-mode Plus (Fm+),1 Mbit/s
- High-speed mode (Hs-mode),3.4 Mbit/s,用在 NFC、buck&boost 等
• Unidirectional bus:
- Ultra Fast-mode (UFm),5 Mbit/s
速度由 SCL 决定,不同模式对上升沿的要求不一样,上升沿斜率受上拉电阻和等效电容影响。
4、I2C 是一种多主从架构总线
- I2C 的读写均由 master 端发起。
- I2C 通信的每一个 byte(8bits)都需要 slaver 端的回应 ACK/NACK 作为回应。
- 多 master 端需要引入仲裁机制。
- slaver 端通过设备地址区分,有 7bits 和 10 bits 等地址,还有一种 8bits 地址,实际上是 7bits + 读写位。【其中7位地址 = 种类型号(4bit)+ 寻址码(3bit)】
5、I2C 总线能挂多少设备?
7-bit address :2 的 7 次方,能挂 128 个设备。
10-bit address :2 的 10 次方,能挂 1024 个设备。
但是 I2C 协议规定,总线上的电容不可以超过 400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过 8 个器件。
总线之所以规定电容大小,是因为 I2C 使用的 GPIO 一般为开漏结构,要求外部有电阻上拉,电阻和总线电容产生了一个 RC 延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险(方波变三角波)。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以 RC 乘积必须更小。(可以理解为输出高电平就是给电容充电,电容越大,充电越慢)
注意,要把 spec 规定的预留设备地址去除,保留地址如下:
note:写的是 two groups,而不仅仅是八个,0000 XXX 和 1111 XXX 系列地址都是保留的。
note:注意 1111 1XXX 是 Hs-mode master code,1111 0XXX 是 10-bit slave addressing,博主后面会讲。
6、定义术语
2、I2C Architecture
I2C 采用的 GPIO 一般为开漏模式,支持线与功能,但是开漏模式无法输出高电平,所以需要外部上拉。Vdd 可以采用 5V、3.3V、1.8V 等,电源电压不同,上拉电阻阻值也不同。
一般认为 I2C 总线上,低于 0.3Vdd 为低电平,高于 0.7Vdd 为高电平。
I2C 协议中每个挂到总线上的设备都有独一无二的静态设备地址。
空闲时,I2C 总线上两根线都是高电平,因为有上拉电阻。
1、推挽结构和开漏结构
1、推挽结构:使用两个三极管或 MOSFET,以推挽方式存在于电路中。电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高。既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
图中上面是 NPN 型三极管,下面是 PNP 型三极管。分别有以下两种情况:
输出高电平:向负载灌电流。
输出低电平:从负载拉电流。
2、开漏结构(OD):对比推挽结构,开漏结构只有一个三极管或者MOS管。
之所以叫开漏,是因为 MOS 管分为三极:源极、栅极、漏极。漏极开路输出,所以叫开漏;如果是三极管:基极、集电极、发射极,集电极开路,所以叫开集输出(OC)。
开集输出,NPN 三极管:
Vin 高电平,三极管导通,对外输出低电平,外部被直接拉到低。
Vin 低电平,集电极(C)开路,输出电平状态由外部决定。
以上分析均采用三极管,MOS 管类似。
因此,推挽结构可以输出高低电平。开漏输出只能输出低电平,高电平由外部电路决定。
2、线与功能
线与:所有 GPIO 输出高就是高,只要有一个输出低,整条线上面的都是低,这就是“与”的意思。
1、推挽结构下,两个 GPIO 口连接到一根线上,假如左边的 PMOS 导通,右边的 NMOS 导通,Vdd 就会通过两个 MOS 管直接接地,由于 MOS 管导通电阻不大,会导致电流很大,直接损坏这两个 GPIO口,因此,推挽输出不支持线与。
note:实际上并不一定是上面 NMOS 下面 PMOS,只要上下两个管子采用不同类型,即可保证同一时刻只有一个管子导通,即可分别输出高低电平。
2、开漏结构:假如很多 GPIO 是开漏结构,接到了一根线,如下图。开漏结构输出的高电平靠外部上拉,假如有一个 GPIO 接地,那么电流会通过上拉电阻流进地,因为有上拉电阻的存在,所以电流不大,不会损坏 GPIO 口。
线与,是 I2C 协议的基础!
小节
mode | open-drain | push-pull |
speed | slower | fsater |
power | higher | lower |
slave clock stretching | yes | not supported |
power 功耗上,开漏因为上拉电阻的存在,每次高低电平变换都会消耗能量,因此功耗高。
clock stretching 时钟延展方面,开漏支持时钟延展,推挽结构不支持时钟延展。原因和上面的推挽不支持线与一样的。有的人会有疑问,时钟延展不是在 SCL 低电平时,从设备去拉 SCL 线吗?不应该有问题呀。但如果是推挽 GPIO,此时主控会尝试拉高 SCL ,才会发现 SCL 被从设备拉低,这时候就会短路。
再次提醒,线与:当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占用状态。
3、上拉电阻计算
1、上拉电阻过小,电流大,端口低电平 level 增大,会发现总线上电平拉不到 0V。
2、上拉电阻过大,上升沿时间增大,方波可能会变成三角波。
因此计算出一个精确的上拉电阻阻值是非常重要的。计算上拉电阻的阻值,有明确计算公式:
最大电阻和上升沿时间 tr 、总线电容 Cb 、标准上升沿时间 0.8473 有关。
最小电阻和电源 Vdd 电压、GPIO 最大输出电压 Vol、 GPIO 最大电流 Vol 有关。
查《I2C-bus specification and user manual.pdf》7.1节:
查《I2C-bus specification and user manual.pdf》表10:
从上图可以得到最大电阻和最小电阻计算公式以及如下数据:
1、标准模式:0~100KHz,上升沿时间要求 tr = 1us
2、快速模式:100~400KHz,上升沿时间要求 tr = 0.3us
3、高速模式:up to 3.4MHz,上升沿时间要求 tr = 0.12us
note:该上升沿时间 tr 是 0.3Vdd 到 0.7Vdd 的时间要求。
假设:Vdd 是 1.8V,Cb 总线电容 200pF(虽然协议规定负载电容最大 400pF,实际上超过 200pF波形就很不好,我们以 200pF 来计算,实际大家使用时建议以 100pF 计算)
标准模式 :
快速模式:
高速模式:
最小电阻(Vdd越大,上拉电阻就要越大):
注意,高速模式下,电源电压一般采用 1.8 V,不会采用 3.3V,因为如果用 3.3V 计算你会发现最小电阻比最大电阻大。
采用合适的电源电压和合适的上拉电阻,才会让你的 I2C 传输信号最优。
大家在不同速率采用的电阻一般有以下几种:1.5K、2.2K、4.7K。
上拉电阻关系图
3、I2C Transfer
0、Definition of timing
想要深入探讨 I2C 协议,必须深刻理解各种时间的定义,如下为 F/S-mode
- 建立时间(Tsu):时钟上升沿到来之前,输入端数据已经到来并稳定持续的时间间隔。
- 保持时间(Thd):时钟上升沿到来之后,输入端数据继续保持稳定并持续的时间间隔。
标识符 | 定义 |
tf | 信号下降时间 |
tr | 信号上升时间 |
tLOW | 信号低电平时间 |
tHIGH | 信号高电平时间 |
tHD;DAT | 数据保持时间 |
tSU;DAT | 数据建立时间 |
tSP | 输入滤波器必须抑制的毛刺脉宽 |
tBUF | 启动和停止条件的空闲时间 |
tHD;STA | 重复起始条件的保持时间 |
tSU;STA | 重复起始条件的建立时间 |
tSU;STO | 停止条件建立时间 |
Sr 重新启动,S 启动,P 停止。
如上参数在 spec 中有严格规定,可查表,一般 standard mode 和 Fast mode 在一起,Hs mode 单独列,表4、表5、表6、表7:
嵌入式系统中I2C总线通信基本方法(下)https://developer.aliyun.com/article/1389595