SPI、UART、I2C通信的区别与应用
电子设备之间的通信就像人类之间的交流,双方都需要说相同的语言。在电子产品中,这些语言称为通信协议。下面开始先从一些简单的概念引入:串行 VS 并行电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。数据位可以通过并行或串行的形式进行传输。 在并行
一、SPI I2C UART通信速率比较:
SPI > I2C > UART
1、同步通信>异步通信;
2、同步通信时必须有一根时钟线连接传输的两端;
3、都是串行通信方式,并行通信用于内部存储间的通信,如flash;
4、适合传输的距离和通信速率成反比关系;
3-SPI:两条合一的数据线、1时钟线、1CS(设备片选线)
SPI:2数据线、1时钟线、1CS(设备片选线)/串行 同步 通信全双工
I2C:1数据线、1时钟线/串行 同步 通信半双工 传输距离比UART短
UART:2数据线、 1地线/串行 异步 通信全双工 传输距离比I2C长些
(I2C接口是“器件间”接口,是在一块板子之内传输数据)
(UART是 “设备间”接口,更多的是用于两台设备之间传输数据)
二、串行和并行、同步和异步的区别:
串行通信:利用一条数据线将数据一位一位的顺序传送,特点是通信线路简单,成本低,适合于长距离传送
并行通信:利用多条数据线将数据的各位同时传送,特点是传输速度快,适合于短距离传送
异步:在一个字符的传输时间范围内保持同步即可
同步:在数据传输过程中,需要一根时钟线同步,IIC总线,SPI总线
三、I2C接口与串行接口的区别:
I2C 两线式串行总线
UART 通用串行异步收发器串口,UART是串行异步通信接口,它包括RS232、RS499、RS423、RS422和RS485等接口规范和 标准规范,即UART是串行异步通信口的总称。
有很大方式的不同。譬如i2c是带地址的通讯,支持多方通讯,串口就搞不定;两者通讯的机制原理也不同;另外速度上I2C相对会快一些,好像i2c是philips发明的,目的就是解决速度的瓶颈。网上有很多资料,自己搜一下吧!
1、I2C接口是"器件间"接口,是在一块板子之内数据的,RS232串行接口是"设备间"接口,更多的是用于两台设备之间传 输数据。
2、从传输数据的距离来说,应该是RS232传输的距离较远,但二者具体差别多少,我没有做过专门的试验。
3、串口是一根线传送数据,一根线接收数据
I2C是一根线是时钟线,一根线是数据线,数据线是双向的,可以接收,也可以发送。
4、协议不同,波特率不同
串行接口,像单片机,时钟由内部MCU提供,而I2C接口要由器件来决定,不能太快。
5、I2C是同步串行传输,RS232(或称UART,通用异步收发器)是异步串行传输。
6、同步方式必须有一根时钟线连接传输的两端,i2c里的scl就是这根时钟线。因为同步方式不用花费额外的开销对其 数据,所以其传输速率一般比异步方式高。
四、总线接口 UART I2C SPI USB的异同点
1、UART 通用异步串行口,速率不快,可全双工,结构上一般由波特率产生器、UART发送器、UART接收器组成,硬件上两线,一收一发。
2、SPI 高速同步串行口,高速,可全双工,收发独立,同步接口,可实现多个SPI设备互联,硬件4条线。
3、I2C 双向、两线、串行、多主控接口标准。速率不快,半双工,同步接口,具有总线仲裁机制,非常适合器件间
近距离经常性数据通信,可实现设备组网。
4、USB 通用串行总线,高速,半双工,由主机、hub、设备组成。设备可以与下级hub相连构成星型结构。
五、串口通信:UART、SPI、I2C区别:
1、UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比
较严格,通信速度也不是很快。在多机通信上面用的最多。
2、SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不
严格不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品内部元件之间的高速数据通信上面,如大容
量存储器等。
3、I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输数据的,通信速度不高,程序写起来也比较复
杂。一般单片机系统里主要用来和24C02等小容易存储器连接。
SPI:高速同步串行口。3~4线接口,收发独立、可同步进行
UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢
SPI:一种串行传输方式,三线制,网上可找到其通信协议和用法的3根线实现数据双向传输串行外围接口
(Serial peripheral Interface)
UART:通用异步收发器
UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计
算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:
1、将由计算机内部传送过来的并行数据转换为输出的串行数据流。
2、将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。
3、在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。
4、在输出数据流中加入启停标记,并从接收数据流中删除启停标记。
5、处理由键盘或鼠标发出的中断信号(键盘和鼠票也是串行设备)。
6、处理由键盘或鼠标发出的中断信号(键盘和鼠票也是串行设备)。
7、可以处理计算机与外部串行设备的同步管理问题。
8、有一些比较高档的UART还提供输入输出数据的缓冲区,现在比较新的UART是16550,它可以在计算机需要处理
数据前在其缓冲区内存储16字节数据,而通常的UART是8250。
9、现在如果您购买一个内置的调制解调器,此调制解调器内部通常就会有16550 UART。
I2C:
能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像
主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作
为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存。
I2C总线:
I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了
电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率
支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都
可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
UART:
单端,远距离传输。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很
多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。串口通信的概念非
常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送
数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备
线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。具体的适用范
围就可多了,军用,医疗…到处到能用。
第一个区别当然是名字:
SPI(Serial Peripheral Interface:串行外设接口);
I2C(INTER IC BUS:意为IC之间总线)
UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)
第二,区别在电气信号线上:
SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个
SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主
从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。
如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而
定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。
I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在
器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:
I2C资料了解得比较少,这里的描述可能很不完备)
UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传
输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。
显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。
第三,从第二点明显可以看出,SPI和UART可以实现全双工,但I2C不行;
第四,看看牛人们的意见吧!
wudanyu:I2C线更少,我觉得比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支
持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI
实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协
议。
quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。
下面开始先从一些简单的概念引入:
串行 VS 并行
电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。
数据位可以通过并行或串行的形式进行传输。 在并行通信中,数据位在导线上同时传输。下图显示了二进制(01000011)中字母“C”的并行传输:
在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“C”的串行传输:
SPI通信
SPI是一种常见的设备通用通信协议。它有一个独特优势就是可以无中断传输数据,可以连续地发送或接收任意数量的位。而在I2C和UART中,数据以数据包的形式发送,有着限定位数。
在SPI设备中,设备分为主机与从机系统。主机是控制设备(通常是微控制器),而从机(通常是传感器,显示器或存储芯片)从主机那获取指令。
一套SPI通讯共包含四种信号线:MOSI(Master Output/Slave Input) – 信号线,主机输出,从机输入。MISO (Master Input/Slave Output) – 信号线,主机输入,从机输出。SCLK (Clock) – 时钟信号。SS/CS (Slave Select/Chip Select) – 片选信号。
SPI协议特点
实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。
工作原理
时钟信号
每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。
设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。 例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。
片选信号
主机通过拉低从机的CS/SS来使能通信。 在空闲/非传输状态下,片选线保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通讯。
如果主机只有一个片选引脚可用,则可以通过以下方式连接这些从器件:
MOSI和MISO
主机通过MOSI以串行方式将数据发送给从机,从机也可以通过MISO将数据发送给主机,两者可以同时进行。所以理论上,SPI是一种全双工的通讯协议。
传输步骤
1. 主机输出时钟信号
2. 主机拉低SS / CS引脚,激活从机
3. 主机通过MOSI将数据发送给从机
4. 如果需要响应,则从机通过MISO将数据返回给主机
使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。
优劣
优点
SPI通讯无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据。
缺点
SPI使用四根线(I2C和UART使用两根线),没有信号接收成功的确认(I2C拥有此功能),没有任何形式的错误检查(如UART中的奇偶校验位等)。
UART代表通用异步接收器/发送器也称为串口通讯,它不像SPI和I2C这样的通信协议,而是微控制器中的物理电路或独立的IC。
UART的主要目的是发送和接收串行数据,其最好的优点是它仅使用两条线在设备之间传输数据。UART的原理很容易理解,但是如果您还没有阅读SPI 通讯协议,那可能是一个不错的起点。
UART通信
在UART通信中,两个UART直接相互通信。 发送UART将控制设备(如CPU)的并行数据转换为串行形式,以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据,数据从发送UART的Tx引脚流到接收UART的Rx引脚:
UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。
当接收UART检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送和接收UART之间的波特率只能相差约10%。
工作原理
发送UART从数据总线获取并行数据后,它会添加一个起始位,一个奇偶校验位和一个停止位来组成数据包并从Tx引脚上逐位串行输出,接收UART在其Rx引脚上逐位读取数据包。
UART数据包含有1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位:
起始位:
UART数据传输线通常在不传输数据时保持在高电压电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。
数据帧:
数据帧内包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。
校验位:
奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。
停止位:
为了向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少持续两位时间。
传输步骤
发送UART从数据总线并行接收数据:
2.发送UART将起始位,奇偶校验位和停止位添加到数据帧:
3.整个数据包从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样:
4.接收UART丢弃数据帧中的起始位,奇偶校验位和停止位:
5.接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线:
优劣
没有任何通信协议是完美的,但是UART非常擅长于其工作。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:
优点
仅使用两根电线无需时钟信号具有奇偶校验位以允许进行错误检查只要双方都设置好数据包的结构有据可查并得到广泛使用的方法
缺点
数据帧的大小最大为9位不支持多个从属系统或多个主系统每个UART的波特率必须在彼此的10%之内
I2C通信
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可传送信息。它结合了 SPI 和 UART 的优点,您可以将多个从机连接到单个主机(如SPI那样),也可以使用多个主机控制一个或多个从机。当您想让多个微控制器将数据记录到单个存储卡或将文本显示到单个LCD时,这将非常有用。
SDA (Serial Data) – 数据线。
SCL (Serial Clock) – 时钟线。
I2C是串行通信协议,因此数据沿着SDA一点一点地传输。与SPI一样,I2C也需要时钟同步信号且时钟始终由主机控制。
工作原理
I2C的数据传输是以多个msg的形式进行,每个msg都包含从机的二进制地址帧,以及一个或多个数据帧,还包括开始条件和停止条件,读/写位和数据帧之间的ACK / NACK位:
启动条件:当SCL是高电平时,SDA从高电平向低电平切换。
停止条件:当SCL是高电平时,SDA由低电平向高电平切换。
地址帧:每个从属设备唯一的7位或10位序列,用于主从设备之间的地址识别。
读/写位:一位,如果主机是向从机发送数据则为低电平,请求数据则为高电平。
ACK/NACK:消息中的每个帧后均带有一个ACK/NACK位。如果成功接收到地址帧或数据帧,接收设备会返回一个ACK位用于表示确认。
寻址
由于I2C没有像SPI那样的片选线,因此它需要使用另一种方式来确认某一个从设备,而这个方式就是 —— 寻址 。
主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。
读/写位
地址帧的末尾包含一个读/写位。如果主机要向从机发送数据,则为低电平。如果是主机向从机请求数据,则为高电平。
数据帧
当主机检测到从机的ACK位后,就可以发送第一个数据帧了。数据帧始终为8位,每个数据帧后紧跟一个ACK / NACK位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。
传输步骤
1. 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。
2. 主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位:
3. 每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。
4. 主机发送或接收数据帧:
5. 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:
6. 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。
单个主机VS多个从机
由于I2C使用寻址功能,可以通过一个主机控制多个从机。使用7位地址时,最多可以使用128(27)个唯一地址。使用10位地址并不常见,但可以提供1,024(210)个唯一地址。如果要将多个从机连接到单个主机时,请使用4.7K欧的上拉电阻将它们连接,例如将SDA和SCL线连接到Vcc:
多个主机VS多个从机
I2C支持多个主机同时与多个从机相连,当两个主机试图通过SDA线路同时发送或接收数据时,就会出现问题。因此每个主机都需要在发送消息之前检测SDA线是低电平还是高电平。如果SDA线为低电平,则意味着另一个主机正在控制总线。如果SDA线高,则可以安全地发送数据。如果要将多个主机连接到多个从机,请使用4.7K欧的上拉电阻将SDA和SCL线连接到Vcc:
优劣
与其他协议相比,I2C可能听起来很复杂。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:
优点
仅使用两根电线支持多个主机和多个从机每个UART的波特率必须在彼此的10%之内硬件比UART更简单众所周知且被广泛使用的协议缺点
数据传输速率比SPI慢数据帧的大小限制为8位
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)