实战分享:I2C总线详解

大家好,我是阿荣。感恩遇见!

本文部分图文来源于网络,并经过整合、编辑和勘误。实战分享栏目将重点介绍嵌入式的基础知识,并融合一些实战经验,持续勘误和迭代,建议关注和收藏!WX同名。

I2C总线是一种常用的通信接口。让我们先来看看百度百科对它的定义。

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

由这个定义中我们可以知道,I2C总线采用双线形式串行传输,属于半双工模式

这里简单介绍下串行和并行的区别。

并行传输

从字面上就可以理解,意思是多个位拥有各自独立的数据线进行传输,如下图所示。

实战分享:I2C总线详解_第1张图片

串行传输

数据公用一条数据线,数据需要一位一位的进行传输,如下图所示。

实战分享:I2C总线详解_第2张图片
I2C总线标准文档为《THE I2C-BUS SPECIFICATION》,目前已经更新到V2.1版本。接下来将依据此文档对I2C总线进行讲解。

硬件特性

I2C总线由两条线组成——串行数据(SDA)和串行时钟(SCL)。每个器件相对应的脚连接到这两根线上,从而形成一个小型网络,如下图示。图中,I2C总线上挂载有微控制器,LCD驱动芯片,EEPROM等器件。连接到总线上的器件数量只由总线电容400pF的限制决定。

I2C总线支持三种传输模式。在标准模式下可达100kbit/s;在快速模式下可达400kbit/s;在高速模式下可达3.4Mbit/s。

实战分享:I2C总线详解_第3张图片
I2C总线上允许多个主机存在。当多个主机要访问同一个从机时,这时会产生冲突。为了解决这种冲突,I2C总线有同步和仲裁的机制。讲解这种机制前,我们需要先搞清楚I2C的一些硬件特性。

连接到I2C总线上的器件的输出端采用漏极开路或集电极开路进行设计,执行的是线与的逻辑。如何理解这种线与的逻辑呢?我们知道,I2C的低电平代表0,高电平代表1。当总线上多个器件同时传输数据时,只要有一方为0,则总线上为0。因为0取与都为0。再回到硬件上看,由于采用线与的设计,输出端无法依靠自身输出高电平,只能通过外部上拉来实现高电平。其电平值由外部电源决定。因此,当总线空闲时,这两根线均为高电平。

位传输时,SCL处于高电平时,SDA数据有效(data line stable;data valid),可进行采样;SCL处于低电平时,运行SDA进行电平变换(change of data allowed)。

实战分享:I2C总线详解_第4张图片

同步

主机在进行数据传输时需要在SCL线上输出自己的时钟波形。当多个主机需要传输数据时,时钟需要先同步。如下图示意,由上面的讲解我们知道,总线上总是优先呈现低电平状态。当SCL被从高电平拉低后,各个器件开始低电平周期计数。当短周期的器件CLK1低电平结束后,仍有器件CLK2处于低电平,因此,此时的CLK1进入等待状态(wait state)。最终直到CLK2低电平结束后,SCL电平切换到高电平。高电平情况类似。由此可得出结论:

“产生的同步SCL时钟的低电平周期由低电平时钟周期最长的器件(CLK2)决定,而高电平周期由高电平时钟周期最短的器件(CLK1)决定”。

实战分享:I2C总线详解_第5张图片

仲裁

“当SCL线时高电平时,仲裁在SDA线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不同”。

数据传输格式

I2C总线数据帧通常由以下元素组成:起始条件(START condition)/重复起始条件(repeated START condition),从机地址(ADDRESS),数据(DATA),响应信号(ACK),不响应信号(NACK),停止条件(STOP condition)。波形如下图示意。

实战分享:I2C总线详解_第6张图片
下面对每个元素进行讲解。
起始条件(START condition)/重复起始条件(repeated START condition)

这两个电平其实是一样的。当SCL处于高电平时,SDA从高电平切换到低电平。注意到了吗?通常在SCL高电平时采用SDA的电平作为比特位,此处用电平变化标记为起始条件或重复起始条件。这样就可以与位数据进行区分,因为位数据在SCL高电平时不变化。

从机地址(ADDRESS)

从机地址有两种,一种为7位,另一种为10位。从机地址后面跟一个比特位(R/W),当该位为0时表示写操作;当该位为1时表示读操作。

数据(DATA)

每个数据为8位,采用MSB方式传输。MSB指高位先传输,而LSB则指低位先传输。

响应信号(ACK)和不响应信号(NACK)

数据传输必须带响应。响应信号(ACK)为SCL处于高电平时,SDA处于低电平;不响应信号(NACK)为SCL处于高电平时,SDA处于高电平。

停止条件(STOP condition)

SCL处于高电平时,SDA从低电平切换到高电平,这就是停止条件(STOP condition)的电平情况。

清楚各个元素后,现在通过这些元素组合成一帧数据。I2C总线有以下几种数据传输格式:
图片中关键字解析如下:
S: 起始条件(START condition)。
Sr:重复起始条件(repeated START condition)
SLAVE ADDRESS:从机地址(ADDRESS)。
R/W(带上划线):读写比特位。
A:响应信号(ACK)。
DATA:数据(DATA)。
A/A(带上划线):响应信号(ACK)或不响应信号(NACK)。
P:停止条件(STOP condition)。

1.主机发送7位/10位地址寻址从机,并写入数据。.

实战分享:I2C总线详解_第7张图片
2. 主机发送7位/10位地址寻址从机,并读取数据。

实战分享:I2C总线详解_第8张图片
3. 由上述两种情况组合而成的复合情况。

实战分享:I2C总线详解_第9张图片
至此,I2C总线的基本特性已经涵盖完了。由这些认知,我们可以开始做驱动开发了。下面举个例子。

实例

这是士兰微电子SC7A20加速度传感器芯片规格书中的截图。对比下之前的说明,相信能看得懂。

实战分享:I2C总线详解_第10张图片
再看下SC7A20的数据帧格式。这里说明以下各个符号的意思。

ST:起始条件。
SAD+W:从机地址加写比特位。
SAD+R:从机地址加读比特位。
SAK:从机响应信号ACK。
MAK:主机响应信号ACK。
NMAK:主机不响应信号NACK。
SP:停止条件。
SR:重复起始条件。
SUB:寄存器地址。

实战分享:I2C总线详解_第11张图片
下图是寄存器说明表格。这次从WHO_AM_I寄存器中读取设备ID值。

实战分享:I2C总线详解_第12张图片
这个是逻辑分析仪采集的波形图。从机的地址为0x19,寄存器地址为0x0F,读取到的设备ID值为0x11。

实战分享:I2C总线详解_第13张图片
有任何疑问,欢迎在评论区一块讨论。

你可能感兴趣的:(实战分享,单片机,嵌入式硬件,arm,iot,mcu)