嵌入式系统中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

目录
相关文章
|
1月前
|
传感器 监控 芯片
嵌入式系统中MCU与SoC通信方式的选择与应用
嵌入式系统中MCU与SoC通信方式的选择与应用
63 3
|
1月前
|
存储 固态存储 内存技术
计算机硬件的基本组成与工作原理
计算机硬件的基本组成与工作原理
|
4月前
|
存储 Linux 芯片
嵌入式系统中I2C总线通信基本方法(下)
嵌入式系统中I2C总线通信基本方法(下)
54 0
|
4月前
|
传感器 芯片 内存技术
嵌入式系统中SPI 子系统基本原理实现
嵌入式系统中SPI 子系统基本原理实现
97 0
|
7月前
|
存储 Go 芯片
单片机外围模块漫谈之四,USB总线基本概念。
单片机外围模块漫谈之四,USB总线基本概念。
|
10月前
|
存储 传感器 开发者
一文搞懂I2C通信总线
I2C(集成电路总线),由Philips公司(2006年迁移到NXP)在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
|
存储
计算机的总线是干什么的?底层原理是什么?
计算机的总线是干什么的?底层原理是什么?
131 0
|
存储 芯片
计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制
计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制
283 1
计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制
|
API C++ Windows
驱动开发:内核封装WSK网络通信接口
本章`LyShark`将带大家学习如何在内核中使用标准的`Socket`套接字通信接口,我们都知道`Windows`应用层下可直接调用`WinSocket`来实现网络通信,但在内核模式下应用层API接口无法使用,内核模式下有一套专有的`WSK`通信接口,我们对WSK进行封装,让其与应用层调用规范保持一致,并实现内核与内核直接通过`Socket`通信的案例。
295 0
驱动开发:内核封装WSK网络通信接口
|
网络安全
驱动开发:内核封装TDI网络通信接口
在上一篇文章`《驱动开发:内核封装WSK网络通信接口》`中,`LyShark`已经带大家看过了如何通过WSK接口实现套接字通信,但WSK实现的通信是内核与内核模块之间的,而如果需要内核与应用层之间通信则使用TDK会更好一些因为它更接近应用层,本章将使用TDK实现,TDI全称传输驱动接口,其主要负责连接`Socket`和协议驱动,用于实现访问传输层的功能,该接口比`NDIS`更接近于应用层,在早期Win系统中常用于实现过滤防火墙,同样经过封装后也可实现通信功能,本章将运用TDI接口实现驱动与应用层之间传输字符串,结构体,多线程收发等技术。
279 0
驱动开发:内核封装TDI网络通信接口