本文深入而全面地概述了嵌入式领域内七种经典串行通信协议:UART、RS232、RS485、I2C、SPI、CAN和I2S。这些协议能够适应不同的应用需求,包括通信速度、传输距离、系统复杂度和成本等多个方面。通过了解每种协议的核心特性和差异,可以为电子系统设计中选择最适宜的通信方式提供重要参考哦。
UART
通用异步收发器(Universal Asynchronous Receiver Transmitter),常见的串行、异步通信总线,两条数据线Tx、Rx,实现全双工通信,常用于主机与外设的通信,点对点。
UART帧格式:
关键点:
- 串行、异步
- 需要双方约定好传输的波特率(因为没有时钟线)
- 空闲位是高位
- 不能连续发数据,一次最多发5-8位(防止误差累计,因为没有时钟线)
TX接RX,RX接TX
一般串口监视器里面,设置好这几个参数就行,默认是这样,基本就改改波特率。
I2C
串行、半双工。两根线SDA(数据线)、SCL(时钟线)
近距离、低速,硬件结构简单,成本低。
最大特点:多主机!
主机有权发起和结束一次通信,从机只能被主机呼叫。
主线上有多个主机时,IIC具备冲突检测和仲裁功能。
每个IIC总线上的器件都有一个唯一的地址(7bit),每个器件可以作为主机也可以作为从机(同一时间只能有一个主机)
I2C通信过程
- 主机发送起始信号启用总线(其他主机收到后就知道现在总线被占用)
- 主机发送一个字节数据指明从机地址(7bit)和后续字节的传送方向(1bit,0:主到从,1:从到主)
- 被寻址的从机发送应答信号回应主机
- 发送器发送一个字节数据
- 接收器发送应答信号回应发送器 (循环步骤4、5)
- 通信完成后主机发送停止信号释放总线
寻址方式(主机给从机发的第一个字节数据):
一次通信时发送器可以发任意多个字节数据给接收器。上面第一个字节数据的最后一位决定了发送器是主机还是从机。
IIC具体通信过程
空闲时SCL和SDA都是高电平
规定每次传一个字节(8bit),先发高位,
发送器发完一个字节后,接收器必须发送1位应答位,所以一帧共有9位。应答位为低电平。
同步信号:
SCL为低电平时,发送器向数据线发一位数据,在此期间数据线上信号允许发送变化。
SCL为高电平时,接收器从数据线读取一位数据,在此期间数据线上信号要稳定。
典型I2C时序
A表示应答,A非表示非应答,S表示起始信号,P表示终止信号
SPI
Serial Peripheral Interface(SPI),串行外设接口高速、全双工、同步一个主机,若干个从机
至少4根线:
MISO(master in server out)
MOSI(master out server in)
SCLK(时钟)
CS (片选,通过使能它来选中不同的从机,有n个从机,主机就需要n条CS线)
SPI具体通信过程
先发高位 (MSB:most significant bit,LSB:least significant bit)
SPI传完一个字节后,不需要应答!可以直接发下一个字节。
没有起始信号,也没有终止信号!
CLK下降沿发数据,上升沿收数据,或者 CLK上升沿发数据,下降沿收数据(由极性和相位一起决定)
SPI极性和相位
SPI总线有四种不同的工作模式,取决于极性(CPOL) 和 相位(CPHL) 这两个因素。为了满足不同场合,不同芯片的需求。
CPOL表示SCLK空闲时的状态
CPOL=0,空闲时SCLK为低电平
CPOL=1,空闲时SCLK为高电平
CPHA表示采样时刻
CPHA=0,每个周期的第一个时钟沿采样
CPHA=1,每个周期的第二个时钟沿采样
I2C与SPI异同
相同点:
- 串行、同步
- TTL电平,传输距离不长
- 主从方式
不同点:
- I2C为半双工,SPI全双工
- I2C有应答,SPI无应答
- 寻址方式:I2C通过向总线广播从机地址寻址,SPI通过使能不同CS引脚寻址
- I2C时钟极性和相位固定,SPI有4种模式
因为SPI无应答、快速寻址等优势,所以SPI速率比I2C快很多,几M到几十Mbps。
I2C一般几百kbps,超高速模式下能5Mbps。
RS232、RS485
回顾一下UART串口通信,它其实在实际应用中存在很多问题:
UART的问题
1. 电气接口不统一
UART只是对信号的时序进行了定义,而未定义接口的电气特性;UART通信时一般直接使用处理器使用的电平,即TTL电平,但不同的处理器使用的电平存在差异, 高电平和低电平的具体定义不一样,所以不同的处理器使用UART通信时一般不能直接相连。
2. 抗干扰能力差,通信距离短
TTL信号表示0和1,数据传输的时候很容易出错,最多1、2m。
只能用于一个电路板上两个不同芯片之间的通信。
RS232
用于串行通讯的标准。
依赖UART串口协议,在电气层面做处理,统一了标准,能传得更远和更快。编程的话没有任何区别,就是串口通信。
采用一个标准的连接器,且对9个引脚的作用和电平都做了规定。主要是用RX、TX和GND这三个引脚。
高电平:-3到-15v
低电平:+3到+15v
抗干扰能力增加,通信距离大致15m。
MCU通过TTL发出来的信号要接一个电平转换芯片去转成RS232的信号,比如MAX232芯片。类似usb-ttl芯片(ch340,cp2302)。
RS232的问题:
RS485
与RS232类似,也是个基于串口的标准,但是是半双工。
与RS232相比最大特点:远距离(1500m),抗干扰强,速度更快(几百kbps到10 Mbps),允许接收多个收发器(可以组建设备网络)
使用差分信号进行数据传输,有效减少共模干扰,因为外部电磁干扰会同时影响到这两条线,而差分信号的接收方只关心两条线之间的电压差,从而有效抵消了干扰。(通信用双绞线,抗干扰强)
高电平(逻辑1):两线之间电压差为+2v到+6v
低电平(逻辑0):两线之间电压差为-2v到-6v
采用两线制,因为用的差分信号,所以两根线表示一个信号,只能半双工。是不是感觉和I2C很像?只是I2C规定好了主机怎么管理从机,在编程RS485时完全可以仿照I2C的主从逻辑,避免冲突。
一般也还是要在MCU后接一个TTL转485的芯片(单端传差分),比如MAX485
CAN
CAN(Controller Area Network,控制器局域网)总线协议是一种高度可靠的、多主机的消息广播系统,广泛用于汽车和工业自动化领域进行设备之间的通信。
汽车中最小的控制模块叫ECU,
CAN总线大大促进了ECU之间的高效通讯
CAN像RS485一样采用差分信号通信,双线制(CAN_High,CAN_Low)物理上用双绞线,抗干扰强
MCU与外界需要一个TTL转CAN信号的芯片(单端转差分)
CAN总线数据帧
有11位识别码,区分多达2048个设备;
RTR为了区分数据帧或远程请求帧;
控制码有6位,第一位区分标准帧和拓展帧(识别位有29位),第二位是空闲位,接下来4为是DLC,控制数据码的长度,0001表示数据有8位,1000表示数据有64位;
CRC是循环冗余校验码,检测到错误时会自动重传;
CRC界定符为了把后面信息隔开;
后面2位分别是ACK(接收1则发送0)和ACK界定符;
最后7位是结束位;
优先级控制: CAN协议通过识别码实现优先级控制。ID较低的消息具有较高的优先级,能够在网络忙时优先传输。
CAN总线的数据传输速率可根据网络长度和节点数进行调整,一般情况下,速率可以从几kbps到1Mbps不等
位定时
数据在CAN总线上的传输和采样过程涉及到位定时(Bit Timing),这是确保数据准确同步和传输的关键因素。
位定时包括若干部分,如同步段、传播时间段、相位缓冲段1和相位缓冲段2,其中采样点(Sample Point)是位时间内的一个特定点,用于决定何时对传输的位进行采样。
在CAN协议中,数据位的采样通常发生在位时间的某个固定点上,这个点被配置为尽可能靠近位时间结束前,以允许信号在总线上传播并稳定。这意味着数据的采样不直接依赖于时钟信号的上升沿或下降沿,而是依赖于位时间内预先配置的采样点。
由于CAN总线使用非归零(Non-Return to Zero, NRZ)编码,连续的位之间没有自动的同步点(例如,没有时钟信号的显式传输),因此,CAN总线协议通过硬件和位定时配置来确保所有节点在位时间内正确地同步和采样数据。
详细位定时知识建议参考这篇博客 《CAN通信位定时与同步》
CAN与RX485异同
他俩都是串行半双工,且基于差分信号和多设备,但有较大差异:
- CAN总线使用唯一标识符(ID)为每条消息指定优先级,具有自动仲裁功能。RS485总线是一种常规的通信总线,它不能够做总线的自动仲裁,也就是不能够同时发送数据以避免总线竞争。
- CAN支持复杂的网络拓扑,如星型、树型和总线型结构。RS485主要支持总线型拓扑,所有设备通过两条信号线相连。
- CAN内置复杂的错误检测、报告和恢复机制,包括位级错误检测、重传和错误限制等功能。RS485作为一种电气标准,本身不提供错误处理机制。需要通过高层协议来实现错误控制
- 数据传输时同步方式不同。
I2S
主要用于音频数据传输 串行,同步,半双工
三根线
SCK(时钟线)
WS(左右时钟线,选择左右声道)
SD(数据线,数据可以是单声道或立体声,格式通常是线性PCM编码)
时钟上升沿时发数据,下降沿时读数据
WS的高低表示不同的声道,在一个SCK时钟周期内,一半的时间用于传输左声道数据,另一半时间用于传输右声道数据。
WS跳转表示一字节数据传输的最后一位