首页 > 汽车技术 > 正文

UART与I2C、SPI总线有什么区别?

2024-07-08 10:12:19·  来源:汽车电控知识  
 

UART(Universal Asynchronous Receiver / Transmitter)通用异步收发器是一种常用的串行通信协议,在汽车嵌入式系统中常用于MCU与MCU,或MCU与外设之间的数据通信。


可用于线路板内部芯片间串行通信的还有SPI(Serial Peripheral Interface,串行外围设备接口)总线《为什么说SPI总线的数据传输与众不同?》和I2C(Inter-Integrated Circuit,集成电路互连)总线《I2C与SPI总线有什么区别?》。


UART是如何通信的?它与SPI和I2C通信协议有什么区别呢?


1.通信方式


1.1物理接口


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


图片

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


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


图片

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


UART总线也只需两条线就可以实现芯片之间的互连通信,这两根线分别为串行数据发送线TX和串行数据接收线RX。


图片

UART接口1对1原理框图


这里要注意的是,UART信号线必须交叉连接,也就是己方的发送TX与对方的接收RX相连,己方的接收RX与对方的发送TX相连。


通过三种通信接口对比可知,UART的物理接口最简单,不仅线少,而且不需要上拉电阻等外围电路。


1.2全双工与半双工


SPI共有4个线,其中有2个数据线MOSI和MISO;UART共有2个线,分别是数据线TX和RX;I2C共有2个线,只有1个数据线SDA。


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


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


SPI用4个线实现了全双工,I2C用2个线实现了半双工,而UART只用2个线就实现了全双工的通信方式,可以说性价比非常高!


1.3通信速率


SPI并没有规定最大传输速率,传输速率主要取决于SCK串行时钟频率,而SCK又取决于芯片的工作频率,通常可以达到20MHz甚至更高。


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


UART在外部物理接口上并没有SCK或SCL等时钟信号,它的通信速率,也就是波特率与MCU中的系统时钟有关,可根据MCU内部的分频器设置,常常见的波特率有2400、4800、9600、19200、38400、57600、115200。


在这三种通信协议中,SPI的通信速率最快,其次是I2C,UART的传输速度最慢!


1.4同步与异步


同步通信是指收发双方具有同频率和同相位的同步时钟信号,在传送报文开始时会通过特定的同步字符,使收发双方建立同步,此后在同步时钟的控制下逐位发送和接收。


SPI和I2C就是同步串行通信。SPI主设备负责产生时钟信号,从设备必须使用主设备的时钟信号,时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制两个SPI 设备间何时数据传输以及何时进行采样,通过相同的工作模式来保证数据在两个设备之间的同步传输。


图片

SPI Clock Format 1 (CPHA = 1)


I2C的时钟同步是通过SCL接口和SCL总线之间的“线与”连接来执行的。当有两个主机同时启动传输时,主机一的SCL接口检测到总线上由高电平到低电平的转换时,便拉低自己的SCL,并开始倒计时应有的SCL低电平保持时间,直到应有的低电平时间结束,会把SCL时钟拉到高电平状态。


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


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


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


图片

I2C总线时钟同步


UART没有时钟线,只有发送和接收数据线,是异步串行通信接口,UART异步通信是按帧(5-9位)发送,常用的为按字符(8位)发送。通信中两个帧之间的时间间隔是不固定的,而在一个帧内各位的时间间隔是固定的。


图片

UART帧发送时间不固定


异步通信发送端可以在任意时刻开始发送数据帧,接收端必须时刻做好接收的准备。异步通信在帧内是通过起始位和结束位来确定位时序的,这样就可以确保接收端能够完整准确地收到每一个数据帧。


由于异步通信没有主设备提供的时钟,通信双方必须预先设置相同的波特率才能正常收发数据。


1.5单点与多点通信


SPI和I2C总线都采用主从模式通信,通信网络中都会有1个主设备,1个以上的从设备,也就是可以实现多点通信。


主设备在查找从设备时,SPI为硬件寻址,通过SS硬线信号选择从设备。


图片

SPI总线1主3从原理框图


I2C为软件寻址,主设备通过数据线中的地址数据来实现片选功能。


图片

I2C总线2主2从原理框图


UART通信中并没有地址的概念,也没有主从的概念。每个设备在发送数据时,会拉低TX管脚,而接收数据时则依赖于对方设备的TX管脚被拉低。这种机制决定了UART通信在设备直连时只能实现一对一的通信,也就是单点通信。因为如果是多个设备连接TX,当一个设备发送数据时,其他设备的TX也会被拉低,导致电平逻辑混乱,无法正确接收数据。


所以SPI和I2C是多点连接,可以称为总线,但是UART只能单点连接,不能称为总线。


2.通信协议


UART的通信的基本原理是将并行数据转换为按位输出的串行数据,每个数据帧的位数不是固定的,范围是5-9个位。


图片

UART帧结构


2.1空闲位


通信空闲时,信号线上始终为高电平,表示无数据传输。


2.2起始位


起始位为低电平,当发送端发出起始位时,表示传输字符的开始;当接收端Rx收到起始位,也就是信号电平由高到低转换时,接收端就会以预先设定好的波特率接收数据。


2.3数据位


起始位后,发送端TX会开始发送数据,数据帧长度可以是5-9位。没有奇偶校验位时最大是9位,有奇偶校验位时最大是8位。


2.4校验位


数据传输完成后会有1个校验位,校验方法主要使用的是奇偶校验,奇偶校验位的值取决于数据帧中“1”的总数是奇数还是偶数。


除了奇偶校验,还有其它方式可以设置:


1)无校验:无校验就是不进行数据校验;没有校验位时,数据帧可以增加1位,所以最大是9位。


2)奇校验:确保包含校验位在内的数据帧中1的个数是奇数。


比如当数据中1的个数是4(偶数)时,校验位为1,确保总数4+1=5为奇数。


当个数是3(奇数)时,校验位为0,确保总数3+0=3仍为奇数。


3)偶校验:确保包含校验位在内的数据帧中1的个数是偶数。


比如当数据中1的个数是4(偶数)时,校验位为0,确保总数4+0=4为偶数。


当个数是3(奇数)时,校验位为1,确保总数3+1=4仍为偶数。


偶校验与奇校验的结果刚好相反。


图片

奇偶校验


4)固定1校验,校验位始终为1。


5)固定0校验,校验位始终为0。


2.4停止位


停止位为高电平,表示数据传输结束。停止位长度为1-2位,可以选择1、1.5或2位的时长。


与SPI和I2C相比,UART的协议要简单很多,不需要时钟同步信号。


图片

I2C总线数据传输格式


UART也不需要应答、仲裁等机制。


图片

SPI通讯时序图


3.通信实例


设置通信数据为8位,停止为1位,传输数据为0x25(00100101)时,数据传输时序如下图所示:


图片

0x25数据传输时序


这里要注意的是,UART的数据传输是低位LSB在前,所以时序图中的数据顺序是10100100。


4.小结


UART是异步串行通信,SPI和I2C总线是同步串行通信,UART和SPI是全双工,I2C是半双工。


与SPI和I2C相比,UART的接口简单,不需要复杂的同步机制,对时序的要求比较低。它的通信速率不高,传输效率也不高,适合用于数据量不大,实时性要求不高的点对点的应用场景,是一种简单、经济、有效的串行通信方式。

分享到:
 
反对 0 举报 0 收藏 0 评论 0
沪ICP备11026620号