嵌入式系统中I2C总线通信基本方法(上)

简介: 嵌入式系统中I2C总线通信基本方法(上)

944bb42b75c14da3a1a95eaaaff663fd.png

将 I2C spec 文章总结为一篇,目录如下

I2C Introduction
I2C Architecture
I2C Transfer
I2C Synchronization And Arbitration
I2C Hs-mode


1、I2C Introduction

1、I2C 历史

  1. I2C:Inter-Integrated Circuit,集成电路总线。
  2. I2C 是 Philips 公司在 1982 年为主机板、嵌入式系统(短距)设计的一种简单、双向二线制同步串行总线。
  3. Philips 半导体事业部就是现在的 NXP
  4. I2C 的专利在 2006 年 11 月 1 日已到期,大家可以免费使用。
  5. Intel 1995 年推出的 I2C 兼容总线(System Managerment Bus),即 SMBus 或 SMB
  6. 最新版本 I2C spec v.6 于 2014.04.04 推出。


2、I2C 的未来

  1. MIPI 协会在 2014 年左右定稿了 I3C (improved Inter Integrated Circuit)规范,I3C 在 I2C 的规格上建立了功能超集,支持高传输速率模式。
  2. 当前不论是 Soc 厂商,还是 device 厂商,都已经开始或正在向 I3C 过度。
  3. I3C spec 有 2016 版本、2018 版本,最新的是 2021 版本(446页)。


3、I2C 的速度

  1. I2C 读法:“I方C”、“I-squared-C”、"I two C"
  2. I2C 是一种低速、串行总线,有 SDA(串行数据线) 和 SCL(串行时钟线) 两条信号线,半双工通信。


通信速度如下:

• Bidirectional bus:

  1. Standard-mode (Sm), 100 kbit/s
  2. Fast-mode (Fm), 400 kbit/s,用在 sensor、carema、touch 等。
  1. Fast-mode Plus (Fm+),1 Mbit/s
  2. High-speed mode (Hs-mode),3.4 Mbit/s,用在 NFC、buck&boost 等

• Unidirectional bus:

  1. Ultra Fast-mode (UFm),5 Mbit/s

速度由 SCL 决定,不同模式对上升沿的要求不一样,上升沿斜率受上拉电阻和等效电容影响。


4、I2C 是一种多主从架构总线

  1. I2C 的读写均由 master 端发起。
  2. I2C 通信的每一个 byte(8bits)都需要 slaver 端的回应 ACK/NACK 作为回应。
  3. 多 master 端需要引入仲裁机制。
  4. 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 规定的预留设备地址去除,保留地址如下:

c53d843781e65f0eebe5894f5540c4d6.png

note:写的是 two groups,而不仅仅是八个,0000 XXX 和 1111 XXX 系列地址都是保留的。

note:注意 1111 1XXX 是 Hs-mode master code,1111 0XXX 是 10-bit slave addressing,博主后面会讲。


6、定义术语

48c56b681d0f1308869e4c7b3ab1328f.png


2、I2C Architecture

f31020731658dc10dcf2ecd7b30128ea.png

98987577794429f65c5789835e7d58e8.png

I2C 采用的 GPIO 一般为开漏模式,支持线与功能,但是开漏模式无法输出高电平,所以需要外部上拉。Vdd 可以采用 5V、3.3V、1.8V 等,电源电压不同,上拉电阻阻值也不同。

一般认为 I2C 总线上,低于 0.3Vdd 为低电平,高于 0.7Vdd 为高电平。

I2C 协议中每个挂到总线上的设备都有独一无二的静态设备地址。

空闲时,I2C 总线上两根线都是高电平,因为有上拉电阻。

1、推挽结构和开漏结构

1、推挽结构:使用两个三极管或 MOSFET,以推挽方式存在于电路中。电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高。既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

b34600c3d7552d22d9a607a7b8177280.png

图中上面是 NPN 型三极管,下面是 PNP 型三极管。分别有以下两种情况:

输出高电平:向负载灌电流。

23e00ac4fef01ead4186938b881d70fe.png

输出低电平:从负载拉电流。

7a29e60bc90b2b7d0a4c025b985226a8.png

2、开漏结构(OD):对比推挽结构,开漏结构只有一个三极管或者MOS管。

之所以叫开漏,是因为 MOS 管分为三极:源极、栅极、漏极。漏极开路输出,所以叫开漏;如果是三极管:基极、集电极、发射极,集电极开路,所以叫开集输出(OC)。

开集输出,NPN 三极管:

8bc94501294245419e645f06ca62cfce.png

Vin 高电平,三极管导通,对外输出低电平,外部被直接拉到低。

Vin 低电平,集电极(C)开路,输出电平状态由外部决定。

ca9e4398d863431c8eb5a44b4cd36783.png

以上分析均采用三极管,MOS 管类似。


因此,推挽结构可以输出高低电平。开漏输出只能输出低电平,高电平由外部电路决定。


2、线与功能


线与:所有 GPIO 输出高就是高,只要有一个输出低,整条线上面的都是低,这就是“与”的意思。


1、推挽结构下,两个 GPIO 口连接到一根线上,假如左边的 PMOS 导通,右边的 NMOS 导通,Vdd 就会通过两个 MOS 管直接接地,由于 MOS 管导通电阻不大,会导致电流很大,直接损坏这两个 GPIO口,因此,推挽输出不支持线与。

17467f7913466868a34045f866917852.png

note:实际上并不一定是上面 NMOS 下面 PMOS,只要上下两个管子采用不同类型,即可保证同一时刻只有一个管子导通,即可分别输出高低电平。


2、开漏结构:假如很多 GPIO 是开漏结构,接到了一根线,如下图。开漏结构输出的高电平靠外部上拉,假如有一个 GPIO 接地,那么电流会通过上拉电阻流进地,因为有上拉电阻的存在,所以电流不大,不会损坏 GPIO 口。

image.png

线与,是 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 被从设备拉低,这时候就会短路。


再次提醒,线与:当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占用状态。

7af5eda6c7b9a606040557ac10e65221.png

3、上拉电阻计算

1、上拉电阻过小,电流大,端口低电平 level 增大,会发现总线上电平拉不到 0V。

2、上拉电阻过大,上升沿时间增大,方波可能会变成三角波。

因此计算出一个精确的上拉电阻阻值是非常重要的。计算上拉电阻的阻值,有明确计算公式:

最大电阻和上升沿时间 tr 、总线电容 Cb 、标准上升沿时间 0.8473 有关。

最小电阻和电源 Vdd 电压、GPIO 最大输出电压 Vol、 GPIO 最大电流 Vol 有关。

查《I2C-bus specification and user manual.pdf》7.1节:

ad28636eadbe3c3b0a6ce55c86c25377.png

image.png

查《I2C-bus specification and user manual.pdf》表10:

8a20110ca20e32fca8ca6a643d81c028.png

从上图可以得到最大电阻和最小电阻计算公式以及如下数据:


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 计算)


标准模式 :

889c1b71f478f981e037e379b3e2c776.png

快速模式:

8d876a0ef154db44d0dff695293a6119.png

高速模式:

ba5ed07c082afa339191cd235872b352.png

最小电阻(Vdd越大,上拉电阻就要越大):

cbae4926c7586f8f774382a5969e0cd7.png

注意,高速模式下,电源电压一般采用 1.8 V,不会采用 3.3V,因为如果用 3.3V 计算你会发现最小电阻比最大电阻大。


采用合适的电源电压和合适的上拉电阻,才会让你的 I2C 传输信号最优。


大家在不同速率采用的电阻一般有以下几种:1.5K、2.2K、4.7K。


上拉电阻关系图

0dcba1ca74b62a3a6c028325890e198e.png

3、I2C Transfer

0、Definition of timing

想要深入探讨 I2C 协议,必须深刻理解各种时间的定义,如下为 F/S-mode

21d8c8563331917121ff8843c55f455d.png

  1. 建立时间(Tsu):时钟上升沿到来之前,输入端数据已经到来并稳定持续的时间间隔。
  2. 保持时间(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:

861cbc4c043d63f855f2b76e6e3f4946.png

4cf682b9c4decad8351283ff436d7978.png

a81296f7fe86e9e52be94fc61bfea6ae.png

282ead2bd248a0877e302c4763fb9312.png

00a11f6b30c7114f61d9671d32b8e13f.png

4f62cc79a297fa1de65c95f554bdb31a.png


嵌入式系统中I2C总线通信基本方法(下)https://developer.aliyun.com/article/1389595

目录
相关文章
|
6月前
|
Linux C语言 SoC
嵌入式linux总线设备驱动模型分析
嵌入式linux总线设备驱动模型分析
81 1
|
1月前
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
|
1月前
【通信协议讲解】单片机基础重点通信协议解析与总结之IIC(一)
【通信协议讲解】单片机基础重点通信协议解析与总结之IIC(一)
|
1月前
【通信协议讲解】单片机基础重点通信协议解析与总结之SPI(二)
【通信协议讲解】单片机基础重点通信协议解析与总结之SPI(二)
|
4月前
|
数据采集 网络协议 数据处理
LabVIEW与Arm控制器之间的通讯
LabVIEW与Arm控制器之间的通讯
39 0
|
6月前
|
存储 Linux 芯片
嵌入式系统中I2C总线通信基本方法(下)
嵌入式系统中I2C总线通信基本方法(下)
226 0
|
6月前
|
传感器 芯片 内存技术
嵌入式系统中SPI 子系统基本原理实现
嵌入式系统中SPI 子系统基本原理实现
160 0
|
消息中间件 Unix Linux
嵌入式 Linux进程之间的通信
嵌入式 Linux进程之间的通信
|
存储 Go 芯片
单片机外围模块漫谈之四,USB总线基本概念。
单片机外围模块漫谈之四,USB总线基本概念。
|
监控 芯片
单片机外围模块漫谈之三,CAN总线
单片机外围模块漫谈之三,CAN总线