详解I2C总线与SPI总线的区别

描述

以下文章来源于汽车电控知识,作者安己乐人

I2C(Inter-Integrated Circuit)表示集成威廉希尔官方网站 互连,是一种用于线路板内部芯片之间通信的总线。

I2C总线的引脚和导线的数量很少,简化了布线空间,极大的方便了芯片设计和应用。

同样可以用于板内芯片间串行通信的还有SPI总线《为什么说SPI总线的数据传输与众不同?》,它们之间有什么区别呢?

1.物理接口

1.1全双工与半双工

SPI总线有4根线,串行数据线MOSI和MISO、串行时钟线SCK和从设备选择SS。

总线

SPI总线接口1对1原理框图

而I2C总线仅需要两条线就可以实现芯片之间的互连通信,这两根线分别为串行数据线SDA和串行时钟线SCL。

总线

I2C总线接口1对1原理框图

通过接口对比可以看出,SPI有2个数据线MOSI和MISO,而I2C只有1个数据线SDA。

SPI的2个数据线分别用于发送和接收,所以可以实现全双工的通信,所谓的双工就是指可以在发送与接收两个方向上传输数据,全双工就是可以同时进行收发。

而I2C只用1根数据线,也可以实现两个方向的传输,但是同一时刻只能进行收或发,不能同时进行,因此I2C是一种半双工的通信方式。

这里要说明一下,I2C的新版协议已经将术语主机和从机更改为控制器和目标,我们这里为了方便理解它的原理,还是用主机和从机的描述。

1.2上拉电阻

SPI总线是信号直接相连,外部不需要上拉电阻。

而I2C总线中的SDA和SCL,都必须通过上拉电阻连接到电源电压。这是因为I2C设备内部输出威廉希尔官方网站 为开漏(OD)输出或开集电极(OC)输出,无法提供高电平输出,所以要在总线上外接上拉电阻,目的就是用来给总线上的时钟或数据提供高电平。

总线

R1和R2为外部上拉电阻

1.3硬件寻址与软件寻址

SPI的SS信号用于主设备选择从设备,当有多个从设备时,主设备通过SS信号线来使能需要通信的从设备,通过硬线信号实现片选的功能,这称为硬件寻址。

而I2C没有类似SS这样的硬线信号,它使用的是设备地址,设备地址是个7位的数据,包括器件类型和地址码,主设备通过数据线中的地址数据来实现片选功能,也就是软件寻址。

此外,SPI的速率与SCK时钟频率有关;I2C的传输速率不仅与SCL时钟频率有关,还与工作模式有关,8位的串行双向数据传输速率在标准模式下最高可达100 kbit/s,在快速模式下最高可达400 kbit/s,在快速增强模式下最高可达1 Mbit/s,在高速模式下最高可达3.4 Mbit/s。8位的单向数据传输,在超快速模式下最高可达5 Mbit/s。

2.主从模式

SPI采用主从模式,主设备通过提供 SCK(Clock)和SS (SlaveSelect)来控制多个从设备,从设备的 Clock 由主设备通过 SCK 管脚提供。

当有多个从设备的时候,主设备会分配给每个从设备一个片选信号,当主设备和某个从设备进行通信时,需要将从设备对应的片选引脚电平拉低。

总线

SPI总线1主3从原理框图

与SPI总线相似,I2C采用的也是主从模式。从设备的 Clock 由主设备通过 SCL 管脚提供。

当有多个从设备的时候,每个设备,包括主设备都有一个唯一的设备地址,主设备在通信时通过SDA发送地址数据来选择对应的从设备。

与SPI不同的是,I2C是一种多主总线,也就是在总线上可以连接多个主设备,这些主设备都可以发起对总线的控制。

总线

I2C总线2主2从原理框图

所以I2C的主从关系不是固定的,它会根据功能需要,在通信过程中动态变化。

I2C总线可以是多主模式,动态变化

2.1仲裁

主从模式中的一主多从在整个周期中都是由主设备来控制时序和进程,不会有控制权冲突的现象。

但是多主模式在多个设备同时控制发送时就会产生冲突,因为总线上同一个时刻,只能有一个主设备获得控制权,所以I2C总线必须还要有个发生冲突时的仲裁机制,以确定最终由哪个主机控制总线并完成其传输。

I2C的仲裁机制是如果两个或多个主机同时发送数据,一个主机发送“0”,另一个主机发送“1”时,发送“0”的主机获得控制权,发送“1”的主机将失去仲裁。

从总线电平来看,就是当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这也称为线与逻辑。

2.2时钟同步

当总线为空闲状态时,SDA和SCL两条线路一定都是高电平。

在总线空闲时,两个主机可以同时启动传输,必须有一种方法来决定由哪一个主机来控制总线并完成传输。这是通过时钟同步和仲裁两个步骤来完成的。

总线

I2C总线时钟同步

如上图所示,时钟同步就是通过SCL接口和SCL总线之间的“线与”连接来执行的。

主机一的SCL接口检测到总线上由高电平到低电平的转换时,便拉低自己的SCL,并开始倒计时应有的SCL低电平保持时间,直到应有的低电平时间结束,会把SCL时钟拉到高电平状态。

如果另一个主机二的SCL时钟仍然处于低电平周期内,则主机一的SCL时钟由低到高的转换不会改变SCL总线为低电平的状态,主机一的SCL时钟会进入高电平等待状态。因此,SCL总线会被具有最长低电平周期的主机保持在低电平。

当所有的主机都已完成自身低电平周期的计时时,SCL时钟总线会被释放并变为高电平。主机SCL接口和SCL总线的状态之间保持一致,都为高电平。所有主机开始计算它们的高电平周期。第一个完成高电平周期的主机再次将SCL线拉低。

这样,就产生了同步的SCL总线时钟,其低周期由具有最长时钟低周期的主机确定,其高周期由具有最短时钟高周期的主机确定,这样大家就统一了时钟的时序。

2.3 仲裁过程

I2C的端口内部威廉希尔官方网站 是可以支持回读的,就是SCL和SDA端口每次输出电平后,会立即回读,用来判断自己的输出是否与总线一致。

具体的仲裁过程由SCL和SDA一起配合来完成,SCL负责完成时钟同步。SDA负责数据仲裁。

仲裁是在SDA线上按位地进行的。当SCL为高电平时,每个主机各自判断自己SDA线输出的电平是否与SDA总线电平一致,如果不一致,则该主机仲裁失败,失去对总线的控制权,需要停止输出。另一个主机赢得仲裁获取对总线的控制权,继续完成它的数据传输。

总线

I2C总线仲裁

仲裁失败的主机可以在总线空闲时重新发起仲裁。但是如果一个主机也具有从机的功能,并且在寻址阶段仲裁失败,则该主机必须立即切换到从机模式,便于主机与其通信。

I2C总线的仲裁有点类似于CAN的冲突检测机制,但是I2C总线的控制是由各个竞争主机发送的地址和数据决定,它并没有CAN ID的优先级概念。

3.I2C总线状态

I2C总线有四种状态:空闲、启动、忙碌、停止。

当总线为空闲状态时,SDA和SCL两条线路一定都是高电平。

所有的传输通信都是以启动(Start)开始,以停止(Stop)结束。当SCL为高电平时,SDA线上的高电平到低电平转换表示启动条件S。当SCL为高电平时,SDA线上的低电平到高电平转换表示停止条件P。

总线

启动条件和停止条件

启动和停止都是由主机发起。在启动发起之后,总线被认为是忙碌的。在停止发起后总线被认为是空闲的。

4.SDA数据有效性

在串行时钟SCL线的高电平期间,SDA线的“高电平”或者“低电平”状态必须保持稳定,此时SDA线上稳定的“高电平”或“低电平”就是有效数据“1”或者“0”。

SDA的数据改变,也就是电平状态改变,只能在SCL线的低电平期间进行。串行时钟SCL每产生一个高电平脉冲,串行数据SDA线就传输一位有效数据。

总线

SDA数据在SCL高时有效

SDA线在SCL线的低电平期间改变数据(改变电平),更改完成后,SCL线由低电平变为高电平并保持稳定,此时SDA线的稳定电平就是有效数据。

5.数据传输格式

总线启动后,串行数据SDA线上每次传输1个字节(8位),每个字节后必须跟随1个应答位,可以连续传输多次,即多个字节。

数据首先从最高有效位(MSB)开始。如果从机由于内部繁忙,无法立即接收或发送下一个字节的数据,从机可以拉低时钟线SCL,使主机进入等待状态,直到从机做好准备后,再释放时钟线SCL,继续接收或发送数据。

总线

I2C总线数据传输格式

应答(ACK)发生在每个字节之后,是接收器向发送器发送的确认信号,表示该字节成功接收。

应答信号是在第9个应答时钟脉冲SCL保持高电平期间,发送器释放SDA线(高电平),接收器拉低SDA线。主机或从机收到ACK应答信号后,可以继续进行接下来的传输,否则主机会中止传输或重新启动传输。

5.1 从机地址和R/W位

主机在启动后,发送从机地址,该地址为7位长度。后面第8位是数据传输方向位,逻辑“1”代表读R,逻辑“0”代表写W,读表示接下来的数据由从机发送给主机,写表示接下来的数据由主机发生给从机。

总线

数据传输示例

在传输中,读/写格式有不同的组合,比如写数据时主机发送器向从机接收器发送信号。传输方向不变,从机接收器确认每个字节。

总线

主机向从机写数据

与写对应的就是读数据,读数据时主机在发送完第一个目标地址字节后立即读取从机。在第1次应答(ACK)后,主机发送器变成主机接收器,从机接收器变成从机发送器。

总线

主机向从机读数据

这里的第1应答是由从机产生,后续的应答是由主机产生。停止信号由主机产生,主机在发起停止信号之前先给从机发送一个不应答(NACK)信号。

还有一种方式,就是读和写的混合模式,在传输过程中改变读写方向时,启动信号和从机地址都会重复,R/W位会反转。如果主机接收器要发送重启信号,它就在重启之前发送不应答(NACK)。

总线

主机向从机读、写数据

大多数I2C总线的从机设备具有7位从机地址编码,所以理论上总线可以连接128个从机设备;为连接更多设备,I2C规范又增加了10位地址编码的从机设备,使从机设备可以扩展到1024个。

5.2 特殊保留地址

地址编码中除了用于表示每个芯片的目标地址,还有8个特殊地址编码,作为特殊保留地址。

总线

特殊保留地址

我们主要介绍下其中的广播地址,广播呼叫地址(0000 0000)用于主机同时寻址连接到I2C总线的所有从机。

主机启动I2C总线后,第一字节首先发送广播呼叫地址(0000 0000),如果某些从机不需要被呼叫寻址,它可以通过不应答(NACK)来忽略这个地址。如果某些设备确实需要传输数据,它就发送应答(ACK)信号来确认这个地址并作为一个从机接收器。如果一个或多个从机做出应答响应,主机实际上并不知道有多少从机进行了应答。第二个字节及以后的字节由每个能够处理该数据的从机接收器接收并确认。不能处理这些字节的从机可以通过不应答(NACK)来忽略它。

总线

广播呼叫地址格式

主机发送的第2个字节是控制地址,是表示呼叫目的和含义的字节,其具体含义如下

当第2字节第8位B=0时,常使用两种控制地址:

1.控制地址=0000 0110(06h):从机复位和写数据到从机内部存储空间。从机接收到第一字节和本字节后,被寻址的所有从机复位,并接收主机接下来发送的数据,存入自己内部存储空间。

2.控制地址=0000 0100(04h):写数据到从机内部存储空间。过程如上,但不会复位硬件。

当第2字节的第8位B=1时,前7位表示主机自己的地址,这中广播地址表示“硬件广播”。

总线

广播呼叫地址第2字节第8位B=1

从机接收到第1字节和控制地址后,被寻址的所有从机将第2字节的前7位标识备案为主机的地址。这个地址的作用就是向所有设备发送自身的设备地址。

6.小结

I2C是一种串行、高速的半双工通信总线,它只用SCL和SDA两根线就可以实现控制时钟信号和数据信号的传输。I2C虽然与SPI都是主从模式,但它可以允许多主模式,通过时钟同步、回读检测和仲裁可以防止总线错误和冲突!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分