硬石社区

 找回密码
 立即注册
查看: 6322|回复: 4

[资料分享] I2C总线VS SPI总线,你更喜欢谁?

[复制链接]

370

主题

1323

帖子

15万

积分

传说中的管理员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
159774
QQ
发表于 2016-8-7 13:15:09 | 显示全部楼层 |阅读模式
在日常生活中,我们几乎每天都在用USB总线,但是在低端一些的数字通信应用领域,
I2C和SPI总线就像USB一样流行。今天我们就来介绍一下这两位大佬,谈谈它们之间
的区别及联系。
IIC总线
I2C--INTER-IC串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线。它以
1根串行数据线(SDA)和1根串行时钟线(SCL)实 现了双工的同步数据传输。具
有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。在主从通信
中,可以有多个I2C总线器件同时接到I2C总线 上,通过地址来识别通信对象。

IIC 接口的协议里面包括设备地址信息,可以同一总线上连接多个从设备,通过应
答来互通数据及命令。但是传输速率有限,标准模式下可达到100Kbps,快速模式
下可达到400Kbps(我们开发板一般在130Kbps),高速模式下达到4Mbps,不能
实现全双工,不适合传输很多的数据。

IIC总线是一个真正的多主机总线,总线上多个主机初始化传输,可以通过传输检
测和仲裁来防止数据被破坏 。

下来详细了解IIC总线时序:1.1 总线数据有效性
IIC总线是单工,因此同一时刻数据只有一个流向,因此采样有效时钟也是单一的,
是在SCL时钟的高电平采样数据。

IIC总线上SDA数据在SCL时钟低电平是可以发生变化,但是在时钟高电平时必须稳
定,以便主从设备根据时钟采样数据,如下图:
1.jpg

1.2 总线空闲条件IIC总线上设备都释放总线(发出传输停止)后,IIC总线根据上拉电阻变成高电平,
SDA SCL都是高电平。 1.3 总线数据传输起始和结束条件
IIC总线SCL高电平时SDA出现由高到低的跳变,标志总线上数据传输的开始条件

IIC总线SCL高电平时SDA出现由低到高的跳变,标志总线上数据传输的结束条件
2.png

1.4 总线数据传输顺序以及ACK应答
IIC总线上数据传输室MSB在前,LSB在后,从示波器上看,从左向右依次读出数据即可

IIC总线传输的数据不收限制,但是每次发到SDA上的必须是8位,并且主机发送8位后
释放总线,从机收到数据后必须拉低SDA一个时钟,回应ACK表示数据接收成功,我们
如果示波器上看到的波形就是每次9位数据,8bit+1bit ack。如下:
3.png

从机收到一字节数据后,如果需要一些时间处理,则会拉低SCL,让传输进入等待状
态,处理完成,释放SCL,继续传输,如下:
4.png

1.5 总线读写时序
数据的传输在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向
(R/ W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主
机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复
起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传
输中,可能有不同的读/写格式结合。

IIC总线主设备读写从设备,一般都是与从设备的寄存器打交道,这个可以通过
阅读从设备的datasheet获取。总线写时序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master data
+ slave ack + master restart。。master data + slave nack + master stop

总线读时序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master restart
+ master addr|r + slave ack + slave data + master nack + master stop

总线读时序与写的不同之处在于读需要2次传输才能完成一次读取,首先要写寄
存器地址到从设备,其实是写到了从设备的控制寄存器或者命令寄存器,从设备
内部会根据这个地址来寻址所要操作的寄存器。

我在读我们的bios和内核时发现,2者在总线读时序上的实现不太一样,在于第一次寄
存器地址写入后,一个发的是restart,一个发的是stop,然后再start开始读取数据,
示波器抓波形发现读取数据都正确,说明这2种时序都是正确的。

IIC总线的读写时序比较固定,设备通信严格遵循协议,因此iIC总线设备驱动程序的
编写也就相对简单一些。

主要应用的iIc总线设备有touchscreen rtc 外扩io等
SPI总线SPI--Serial Peripheral Interface,串行外围设备接口,是Motorola公司推出的一种同步
串行通讯方式,是一种三线同步总线,因其硬件功能很强,与SPI有关的软件就相当
简单,使CPU有更多的时间处理其他事务。
SPI通常有SCK时钟,STB片选,DATA数据信号三个信号。 I2C通常有 SDA数据和
SCL时钟两个信号。
SPI总线真正实现了全双工数据传输,SPI 有3线跟4线两种,4线的话,就是多了一
条叫SDC的线,用来告知从设备现在传输的是数据还是指令。这个接口较快,可以
传输较连续的数据。
SPI要想连接多个从设备,就需要给每个从设备配备一根片选信号。如果要可以实
现全双工,也是需要多加一根数据线(MOSI MISO)。
也就是说SPI总线是通过片选来选择从设备。
spi总线速度要比iic要快,我们开发板最快能达到30MHZ。 spi总线特点:1. 采用主-从模式(Master-Slave) 的控制方式
SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave).
一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select)
来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过
SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock
则 Slave 设备不能正常工作.

2. 采用同步方式(Synchronous)传输数据
Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲
组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA)
控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数
据在两个设备之间是同步传输的.

3. 数据交换(Data Exchanges)
SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设
备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)".
也就是说是全双工的,在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大
小的数据, 相当于该设备有一个 bit 大小的数据被交换了.

一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被
Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave

设备进行片选, 把想要访问的 Slave 设备选上.

在数据传输的过程中,  每次接收到的数据必须在下一次数据传输之前被采样. 如果
之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃,  

导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取
SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的.

具体spi工作原理可以看博客另外一篇文章

SPI和IIC是2种不同的通信协议,现在已经广泛的应用在IC之间的通信中。
并且不少单片机已经整和了SPI和IIC的借口。但像51这种不支持SPI和IIC的单片
机,也可以用模拟时钟的工作方式进行SPI和IIC的通信的。

下面主要总结一下2种总线的异同点:
1 iic总线不是全双工,2根线SCL SDA。spi总线实现全双工,4根线SCK CS MOSI MISO

2 iic总线是多主机总线,通过SDA上的地址信息来锁定从设备。spi总线只有一个主
设备,主设备通过CS片选来确定从设备

3 iic总线传输速度在100kbps-4Mbps。spi总线传输速度更快,可以达到30MHZ以上。

4 iic总线空闲状态下SDA SCL都是高电平。spi总线空闲状态MOSI MISO也都是 SCK是
有CPOL决定的

5 iic总线scl高电平时sda下降沿标志传输开始,上升沿标志传输结束。spi总线cs拉低
标志传输开始,cs拉高标志传输结束

6 iic总线是SCL高电平采样。spi总线因为是全双工,因此是沿采样,具体要根据CPHA
决定。一般情况下master device是SCK的上升沿发送,下降沿采集
7 iic总线和spi总线数据传输都是MSB在前,LSB在后(串口是LSB在前)

8 iic总线和spi总线时钟都是由主设备产生,并且只在数据传输时发出时钟
9 iic总线读写时序比较固定统一,设备驱动编写方便。spi总线不同从设备读写时序差
别比较大,因此必须根据具体的设备datasheet来实现读写,相对复杂一些。

看看21ic论坛的高手们怎么说: 版主jjjyufan
UART: 由RX TX 组成收发
SPI:由CLK CS MOSI MISO(M代表主 S 代表从 O 代表out I 代表in)
IIC:由SCL SDA 组成
资深工程师gx_huang速度要信号的波形。
高速USB是差分类似模拟的信号,速度快。
SPI/I2C是数字信号,对于接口信号,数字的肯定比模拟的要慢。因为传输通道的频响
是有限制的。
所以要远距离快速通信,一般把数字信号调制到模拟的信号。
高级工程师linqing171I2C 的长处是超级低廉,而且是协议简单的总线。
spi是端口,不是总线。 USB协议复杂。

I2C因为跨电平的标准,所以是OC 上拉的,上拉高电平驱动能力很弱,所以决定了他跑
不快。但是不影响它在低速的场合应用。本来他面向的就是慢速,低廉成本的应用场合。
要快速怎么也要用intel总线。
高级技术员風神
I2C为了节省口线资源而做双向口=>为了防止接口电路烧掉而用上拉电阻=>上拉导致
电平变化慢=>传输速率低。
SPI中MISO和MOSI分开=>无需上拉,电平反转速度快一点=>传输速率比I2C高。
对于I2C,SPI,您有何见解呢?不妨在下方评论评论吧~


回复

使用道具 举报

0

主题

56

帖子

9576

积分

新世纪之星

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

积分
9576
发表于 2017-3-6 10:45:16 | 显示全部楼层
用SPI多一点,但I2C感觉也挺好!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

1550

积分

队长

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1550
发表于 2017-9-9 16:05:46 | 显示全部楼层
感觉SPI比IIC好使。
回复 支持 反对

使用道具 举报

3

主题

13

帖子

2538

积分

副船长

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

积分
2538
发表于 2020-3-10 16:38:46 | 显示全部楼层
我更喜欢IIC一点,两条线接设备就好。用spi 还需要一条cs,如果总线上设备接的多还需要一片锁存器来管理使能的设备,这样感觉让设计更复杂了。
回复 支持 反对

使用道具 举报

370

主题

1323

帖子

15万

积分

传说中的管理员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
159774
QQ
 楼主| 发表于 2020-3-10 19:27:40 | 显示全部楼层
SPI速度可以比I2C快很多的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc. ( 粤ICP备16080364号

GMT+8, 2021-11-29 11:10 , Processed in 0.065922 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表