近来查看一些电路硬件工程师的招聘要求&岗位职责,发现常常提及“熟悉USART SPI I2C等常用的通信协议”一项,最近抽空针对性学习,做了一些总结与比较,只抓出一些关键点呈现如下。属于自己的学习笔记,写的比较通俗,若有不严谨之处请包涵。
一、概念厘清
通信
直接理解为计算机与计算机之间或者计算机与外部设备之间进行数据传输(在理解这个概念的时候要把通信和通讯进行区分;通讯常特指采用电报、电话、网络等媒体传输系统实现上述媒体信息传输的过程,重在内容形式,所以通讯协议主要集中在ISO七层协议中的应用层;而数据通信传输的信息载体是二进制的数据,所以通信协议主要集中在ISO七层协议中的下面4层:物理层、数据链路层、网络层、传输层)【ISO七层协议从下往上依次是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层】
协议
也就是规则;双方交换信息,需要一个两者都认可的“约定/合同”,比如发送方要用5V代表一个高电位1,那么接收方收到5V的高电平的时候也把它翻译成1而不是其他的信息
串行&并行通信
并行通信一次性同时收发n个bit,需要n条通信数据线;串行通信在同一根通信数据线上依次一个bit一个bit地收发数据。很显然,串行通信数据线少,长距离传输成本低,并行通信数据线多,长距离传输成本高。
长距离传输用串行,成本更低,抗干扰能力强
距离短且追求高速率用并行
单工&半双工&全双工
单工理解为单向工作(显然工作时只需要一条通信线路即可,数据只能单方向传输)。半双工区别于单工,可以双向工作(可以双向传输数据,但它还不是“完全的双工”,在一个时刻还是只支持一个方向的数据传输,所以显然一条通信线路也够了)。全双工就是“地地道道的双工”啦(真正可以同时进行双向传输的一种方式,所以显然需要两条通信线路才能支持,要不两个方向的数据就要“撞车”啦)。
全双工案例:打电话,打视频,需要两边同时双向交换数据
半双工案例:对讲机
同步&异步
硬件上最大的区别在于是否有时钟线。同步是需要时钟信号线将通信双方的时钟信号统一频率的,而异步通信不需要同步的时钟,通信双方事先约定好bit的传输速率即可,发送的字符间隔时间也可以任意,允许误差相较于同步通信更大些。在同步通信中,数据所传输的内容绝大部分都是有效数据,而异步通信中会包含有帧的各种标识符。显然同步通信的效率和精确度更高,但是硬件成本也更高了。
码元&波特率&比特率
在数字通信中用时间间隔相同的信号来表示数字。码元可以理解为单位时间间隔内的信号,这个时间间隔称为码元的长度。波特率是每秒传输的码元个数,比特率是每秒传输的二进制代码位数(这两个是描述串口通信的通信速度的单位)。【当进行两相调制时,波特率等于比特率(比如在数字传输过程中,用0V表示数字0,5V表示数字1,那么码元就只有0或1一个二进制数字,每秒传输的码元数和每秒传输的二进制代码数相等,这就是两相调制;再比如数字传输过程中,0,2,4,6V分别表示00,01,10,11,每个码元代表两个二进制数字,此时每秒码元数就是每秒二进制代码数的一半,这就是四相调制,波特率等于比特率的一半)】
二、常用通信协议介绍
USART
(universal synchronous asychronous receiver and transmitter,通用同步异步收发器)
串行,全双工,同步or异步
UART在USART的基础上裁剪掉了同步通信功能,只有异步通信功能【区分同步异步通信主要看是否需要对外提供时钟输出】,平常的串口通信基本都是使用UART。USART在STM32应用最多的是打印程序信息,一般在硬件设计时会预留一个USART通信接口连接电路,用于在调试程序时把一些调试信息打印在电脑端的串口调试助手工具上,从而了解程序运行是否正确,指出运行出错位置等
常见的包括TTL/RS232/RS499/RS423/RS422/RS485等电平标准【电平标准后面(三)有详细介绍】
串口通信以帧格式传输数据,一个字符帧包含起始位+数据位+校验位+停止位。起始位是1个位周期的逻辑0,数据位(也称为有效数据位)可以为5/6/7/8位,校验位1位,停止位是0.5/1/1.5/2个位周期的逻辑1(只要由双方约定一致即可)。
校验:有奇校验、偶校验、0校验、1校验等,如果没有校验位,数据位可以增加至9位
奇校验:有效数据位和校验位中1的总个数为奇数
偶校验:有效数据位和校验位中1的总个数为偶数
0校验:校验位为0
1校验:校验位为1
异步串口通信的数据接收过程(接收过程的本质是数据采集,假设接收端的采样时钟是波特率的16倍为例)
接收过程由起始位的下降沿启动
接收端等待8个时钟周期,以便建立一个接近比特周期中间的采样点
接收端等待16个时钟周期,使其进入第一个数据位周期的中点
第一个数据位被采样并存储在接收寄存器中
串口模块在采样第二个数据位之前等待另外16个时钟周期
重复此过程,直到所有数据位都被采样和存储
由停止位的上升沿使数据线返回到空闲状态
I2C
(IIC,inter-integrated circuit,内部集成电路)
串行,半双工,同步
从原理上来看,半双工只需要一根数据信号线,同步需要一根时钟信号线,所以I2C有两条总线线路,SDA(serial data,串行数据线)&SCL(serial clock,串行时钟线),前者用于收发数据,后者用于通信双方数据收发同步。
I2C引脚少,硬件实现简单,可扩展性强,不需要USART/CAN等通信协议的外部收发设备,因此广泛用于系统内多个集成电路(IC)之间的通信。
两条总线一般通过上拉电阻接到电源。这是因为当I2C设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,需要由上拉电阻把总线拉成高电平。一般都需要接2千欧姆或者4.7千欧姆的上拉电阻(I2C总线内部使用开漏驱动,即漏极开路驱动器,因此SDA和SCL都可以被拉低成低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻以保证其默认情况下是高电平)。
I2C是一种多主机总线,但是同一时刻只能有一个主机,而且每个器件都可以作为主机也可以作为从机。当总线上有多个主机同时启用总线时,I2C会启用冲突检测和仲裁的功能来防止错误产生。
I2C是一个支持多设备/多从机的总线(总线是指多个设备共用的信号线),采用寻址机制,每个连接到总线的设备/从机都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。这个地址(可以是7bit或者10bit,实际中7bit应用比较广泛)和紧跟地址后的一个数据位(第8位或者第11位,用来表示数据传输的方向,称为数据方向位,R/W,read/write,读/写)构成了I2C总线数据传输时起始状态后的第一个字节,称为寻址字节。当主机发起通讯时,通过SDA信号线发送设备地址(slave_address)来查找从机,系统中的每个从机都在起始状态后把高7位与该主机的地址比较,如果与该主机地址一样,则该从机被主机选中,是接收数据还是发送数据则由R/W确定。【从机器件地址由固定位和可编程位组成,固定位由器件出厂时给定,用户不能自行设置,它是器件的标识码;当系统中使用了多个相同的器件时,可编程位可以使这些器件具有不同的地址;这些可编程位也规定了I2C总线上同类芯片的最大个数(比如一个从机的7位寻址位有4位是固定位,3位是可编程位,则仅能寻址8个同样的器件,也即只可以有8个同样的器件接入到该I2C总线系统中)】数据方向位为1时表示主机由从机读数据,为0表示主机向从机写数据。读数据时,主机会释放对SDA信号线的控制,由从机控制SDA信号线,写数据时,SDA信号线则由主机控制,从机仅接收信号。(即发送信号的一端具有对SDA信号的控制权)
I2C的响应机制:I2C的数据和地址传输都带响应。响应包括应答(ACK)和非应答(NACK)两种信号。作为数据接收端时,当接收到传输的一个字节数据或地址后,如果希望对方继续发送数据,则需要向对方发送ACK信号,此时发送方会继续发送下一个数据,若接收方希望停止数据传输,则需要向对方发送NACK信号
I2C是板级总线,连接线一般不超过2米
连接到相同总线的IC数量受到总线的最大电容400pF限制
数据传输速率
标准模式:100kb/s
快速模式:400kb/s
高速模式:3.4Mb/s
整个I2C通信过程:起始信号,地址位+读写位(寻址字节),有效数据信号,停止信号,响应信号
起始信号:SCL为高电平时,SDA由高电平向低电平跳变,此时开始传输数据
停止信号:SCL为高电平时,SDA由低电平向高电平跳变,此时结束传输数据
![](https://i-blog.csdnimg.cn/blog_migrate/db3424ca4fd57d51477a36140069a787.png)
(图源网络,侵删)
SDA在SCL的每个时钟周期传输一位数据,SCL为高电平时SDA表示的数据有效;SCL为低电平时SDA表示的数据无效【一般在这个时候SDA进行电平转换,为下一次表示数据做准备】
![](https://i-blog.csdnimg.cn/blog_migrate/fee16391d2d85b7d16446a290b822fca.png)
(图源网络,侵删)
I2C的复合格式
![](https://i-blog.csdnimg.cn/blog_migrate/6546f371f05c4bcab74eacef5ee3594d.png)
(图源网络,侵删)
以上图1和图2是I2C的基本读写过程,起始信号+寻址字节(地址位+方向位)+响应信号+数据信号+响应信号...依此重复,但是I2C还有一种更加常用的复合格式如图3。在该种复合格式中,存在两次传输开始信号,第一次传输开始信号之后先发送一段数据,这段数据表示从设备内部的寄存器或者存储器的地址(主义要区分于从机的地址slave_address);在第二次传输开始信号之后,才开始对该地址的内容进行读写。也即第一次传输是告诉从机读写地址,第二次才是告知读写的实际内容。
SPI
(serial peripheral interface,串行外设接口)
串行,全双工,同步
SPI是一种高速全双工通信总线,常用于ADC/LCD等设备与MCU间这类对通信速率要求比较高的场合。
SPI至少需要4根线【全双工需要两条数据信号传输线,同步需要一条时钟信号线,另外实际还需要一根片选信号线】。SPI是环形总线结构,可以看成在SCLK信号(时钟信号)的控制下,两个双向移位寄存器进行数据交换。
MISO(master input slave output):主设备数据输入,从设备数据输出
MOSI(master output slave input):主设备数据输出,从设备数据输入
SCLK(serial clock):时钟信号,主设备产生
CS(chip select):从设备使能信号,主设备控制
![](https://i-blog.csdnimg.cn/blog_migrate/51c8b12142ca758479e1c87f8b63e14a.bmp)
(图源网络,侵删)
不同于I2C,SPI没有寻址机制和响应机制。SPI依靠片选信号线选择从机设备,但是在点对点的通信中,由于SPI没有寻址操作,且为全双工通信,所以相对于IIC更加简单高效。不过SPI没有应答机制(ACK)确认从机是否接受到数据。
当主机选择从机时,将从机的片选信号置低电平,代表该从设备被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通信。所以SPI通信以片选信号线置低开始信号,置高为结束信号。
在实际使用中,SPI的4根信号线都可以串联10-50欧姆的小电阻以适当增加信号线阻抗,满足终端阻抗匹配以抑制信号终端反射。
当只有一个slave设备,且IO口资源紧张的条件下,可以直接将CS引脚接低,从而节省出一个IO口,下拉电阻阻值选择10千欧姆左右
在SPI操作中,有两项比较重要的设置:时钟极性(CPOL/UCCKPL)和时钟相位(CPHA/UCCKPH)。时钟极性设置时钟空闲时电平,时钟相位设置读取数据和发送数据的时钟沿。master设备和slave设备通信时,两者的时钟相位和极性应该保持一致。
SPI模式 | CPOL | CPHA | 空闲状态下的时钟极性 | 用于采样和移位数据的时钟相位 |
0 | 0 | 0 | 逻辑低电平 | 数据在上升沿采样,在下降沿发送 |
1 | 0 | 1 | 逻辑低电平 | 数据在下降沿采样,在上升沿发送 |
2 | 1 | 1 | 逻辑高电平 | 数据在下降沿采样,在上升沿发送 |
3 | 1 | 0 | 逻辑高电平 | 数据在上升沿采样,在下降沿发送 |
若master设备和slave设备电平存在差异,比如master设备1.8V,slave设备3.3V,则需要在master设备和slave设备之间增加一个支持SPI通信速率的电平转换器。
SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平时表示逻辑“1”,低电平时表示逻辑“0”;一个字节传送完成之后无需应答即可开始下一个字节的传送;SPI总线采用同步方式工作,时钟线在上升沿或者下降沿时发送器向数据线上发送数据,在紧接着的下降沿或者上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的发送。
SPI的多从机电路设计
常规SPI模式
![](https://i-blog.csdnimg.cn/blog_migrate/c18b29244917842829a44f50eccc0b1d.png)
(图源网络,侵删)
菊花链模式
![](https://i-blog.csdnimg.cn/blog_migrate/aabad6d10e63e6628eb7b6329982644d.png)
(图源网络,侵删)
常规SPI模式和菊花链模式的区别:常规SPI模式中,主机为每个从机分别提供片选信号,随着从机数量的增加,片选信号线的数量增加;菊花链模式中,所有从机的片选信号线连接在一起,数据从主机传送到第一个从机,在传送到下一个从机,依次直到目标从机。传送数据所需的时钟周期数与从机所在位置成比例,比如将数据传送给第三个从机,常规模式下只需要8个时钟脉冲,菊花链模式下则需要24个时钟脉冲。
三、电平标准介绍
标准TTL电平(transistor-transistor-logic,晶体管-晶体管逻辑电平)
逻辑电平的概念:比如0V代表逻辑低电平,5V代表逻辑高电平。像STM32单片机串口引脚输出的逻辑高电平就是3.3V。随着电子技术的快速发展,逻辑高电平的电压也越来越低,比如DDR5内存的供电电压才1.1V。
常用的数字电路通常都是5V或者3.3VTTL的电平标准,
5V TTL电平标准
输入电路:2.0V以上(包括2.0V)为逻辑1,1.2V以下为逻辑0
输出电路:2.4V以上为逻辑1,0.8V以下为逻辑0
可以看出,输出电路的要求会更加严格一些,与输入电平保持了0.4V电压差
CMOS电平
输入电路:0.7Vcc以上(包含0.7Vcc)为逻辑1,0.3Vcc以下为逻辑0
输出电路:0.9Vcc以上为逻辑1,0.1Vcc以下为逻辑0
可以看出,输出电路的电平要求更高些,与输入电平保持了0.2Vcc电压差
3.RS232
(简称232,全称EIA-RS-232,electronic industry association-recomend standrad-232,美国电子协会-推荐标准,232代表标识号)
RS232通常用于设备和设备之间的通信,广泛应用于工业控制领域,在一些比较老的电脑、打印机等设备上常见,一般用DB9或者两根信号线进行连接
RS232为负逻辑,最简单的RS232由三条数据线组成,TXD/RXD/GND(后面的电平均指TXD/RXD相对于GND的电压差)
RS232规定输出逻辑1的电平范围为-15~-5V,逻辑0的电平范围为+5~+15V,不过RS232协议有2V的噪声容限,也即在接收数据时,-15~-3V为逻辑1,+3~+15V为逻辑0
RS232传输距离15米
4.RS485
RS485在RS232基础上发展而来,目的是为了增加抗干扰能力以及提升信号传输距离【但是RS485传输距离最大可达到1200米,不过这个数据也和很多因素有关,参照实际情况,在某些情况下,RS485传输距离大概500米】
相较于RS232采用信号线相对于GND之间的电压差来表示逻辑电平,RS485采用差分电压,也就是两根信号线(信号线A和信号线B)之间的电压差来代表逻辑高低电平。
RS232支持全双工通信,而一般情况下RS485是二线制半双工通信,不过RS485也存在四线制全双工通信。
5.对比
1.传输距离比较:
TTL<RS484<RS232
2.位置比较:
TTL一般在板卡内部(同一块板卡上),比如用于芯片A的串口和芯片B的串口进行通信
RS485在工业产品中使用较多,可以多个设备连接在485总线上,传输距离更远,抗干扰能力也更强