常见的通信协议——UART(串口)、CAN、IIC、SPI、USB

 引言      

        不同的电子设备之间有发收信息的需求,所以就需要通信。而通信协议是为了在通讯过程中,对通讯对象之间的信息传输进行标准化定义和规范。这样可以保证通讯过程的所有参与者都遵守相同的协议,从而能够正确地接收和理解发送方发送的数据,同时也能保证通信过程的稳定性和可靠性。

        绝大多数电子设备之间的通信都是基于电平特性的(如:电平的高低,电平的变化过程),还有少数基于频率,占空比,周期性等电特性,亦或是基于温、声、磁、力、化、运动等非电量。

通信协议的分类  

        按照数据的传送方式,通信协议可分为以下2种。

串行通信

        串行(Serial)指的是逐个传输数据位,一次只传输一个位。

并行通信

        并行(Parallel)指的是同时传输多个数据位,一次可以传输多个位。

        按照消息传送的方向与时间关系,通信协议可分为以下3种。

单工通信

        单工通信(Simplex Communication)是指消息只能单方向传输的通信方式。

        在单工通信中,发送端与接收端是固定的,即发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。

        例如:遥控器与电视、广播站与收音机。

 半双工通信

        半双工通信(Half-duplex Communication)中的“双工”表示通信的双方都可以发送信息,而“半”表示双方不能同时发送或同时接收信息,即对于同一个设备,同一时刻只能发信息或者收信息,不能在发信息的时候又收信息。

        在这种工作方式下,发送端可以转变为接收端;接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种可以切换方向的单工通信。

        例如:对讲机。

全双工通信

        全双工通信(Full duplex Communication):通信的双方可以同时发送和接收数据。

例如:电话、网络。

         按照时钟特性,通信协议可分为以下2种。

 同步通信

        同步通信:双方使用频率一致的时钟。发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(如:在时钟信号的上升沿时,将数据发送出去),发送数据;接收端根据发送端提供的时钟信号,以及一定的约定(例如:在时钟信号为低电平时,读取数据),接收数据。

异步通信

        异步通信:收发双方可以有各自自己的时钟,接收方并不知道数据什么时候会到达,发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。

        按照电平特性,通信协议的电信号可分为以下2种。

 差分信号

        差分信号:两根信号线上的信号振幅相同,相位相反,那么它们的电势差就构成了差分信号。

单端信号

        单端信号:指信号有一个参考端和一个信号端构成,参考端一般为地端,信号端的电压就构成了单端信号。

        按照通信设备数量,通信协议的电信号可分为以下4种。

点对点

        一个发送端,一个接收端。

 点对多

        一个发送端,多个接收端。

多对点

        多个发送端,一个接收端。

多对多

        多个发送端,多个接收端。

UART(串口)

        UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器,即常说的“串口”。

        串口通信是一种异步、半双工、单端、点对点的通信协议。

串口参数

起始位

        位于数据帧开头,只占 1位,始终为逻辑“0”,必须有。起始位用于表示一个数据帧的开始,起到同步作用。

数据位

        紧跟在起始位之后,用于传送数据。用户可根据情况确定为 5、6、7、8 位,低位在前,高位在后。通常采用 8 位数据位,用于传送一字节的数据.

校验位

        位于数据位后,占1位,用于表示串行传输中采用的校验方式,该位由用户根据需要决定,有 3 种选择:无、奇校验、偶校验。选择“无”表示关闭校验功能;选择奇/偶时,该位逻辑值的确定是对数据位的各个位进行“异或”运算,再将结果与“0”或“1”进行“异或”运算所得,具体公式为:

        式中:Peven 为偶校验位值;Podd 为奇校验位值;dn 为数据的第n 位。

也常用以下方法快速判断:

奇校验码:

        数据位有奇数个1,奇校验码为0;数据位有偶数个1奇校验码为1。即:奇校验码的加入使得数据位和校验位整体保持奇数个1。

偶校验码:

        数据位有偶数个1,偶校验码为0;数据位有奇数个1偶校验码为1。即:偶校验码的加入使得数据位和校验位整体保持偶数个1。

停止位

        位于数据的最后,始终为逻辑“1”,必须有。停止位的长度由用户确定,可选择为1位、或 2 位。停止位表示一个数据的结束,也是为发送下一个数据帧做准备,同样也起到了同步的作用。

波特率

        是指单位时间内传送二进制数据的位数,单位用bps或b/s(位/秒)表示。

比特率

        是衡量异步串行通信的数据传输速率,即单位时间内传送二进制有效数据的位数,单位也用bps或b/s(位/秒)表示。

例如:在异步行传输系统中,设每秒传输120个数据帧,其字符格式规定包含1个起始位、7 个数据位、1个奇校验位、1 个终止位,那么其波特率为:(1 +7 +1 +1) x 120 =1200 bps ,其比特率为:7 x 120 =840 bps 或 7/(1 +7 +1 +1)x 1200=840bps。

通信过程

        在异步通信中,发送和接收双方要实现正常的通信,需采用相同的传输波特率和相同格式的数据帧(起始、数据、校验和停止位)。

        首先.发送和接收的双方都必须采用相同的、一个约定好的串行通信波特率。框定波特率,其实就是规定数据帧中一个位的宽度(表示传输一位所花费的时间,等于波特率的倒数)。

        当异步通信的波特率和数据帧的格式确定后,发送方就按照规定的数据帧格式规定的位宽度发送数据帧。接收方则以传输线的空闲状态(逻辑“1”)作为起点,不地检测和扫描传输线,当检测到第一个逻辑“0”出现时(起始位到达),知道一个数据帧开始了(实现数据同步)。接下来以规定的位宽度,对已知格式的数据进行测试获得数据帧中各个位的逻辑值。测试到最后的停止位时,如果为规定的逻辑“1”,则说明该数据帧已经结束。

时序图

S:起始位

P:停止位

C:偶校验

CAN

        CAN(控制器局域网络)(Controller Area Network)是由德国博世公司(Bosch)开发的,主要用于汽车内部电子设备之间的通信。

        CAN是一种串行、异步、半双工、差分、多对多的通信协议。

CAN的物理电路构成

         注:这里的TX、RX都是针对(单片机中的)CAN控制器而言的,不需要像串口那样交叉连接

 CAN中使用差分信号表示逻辑0和1的规定

        CAN具有ISO11519(低速)、ISO11898(高速)(也被称为经典CAN)这两种国际标准。

        简单来说,对于高速CAN,CAN_High、CAN_Low这两根线都为2.5V,电压为0,表示逻辑1(隐性);CAN_High为3.5 V,CAN_Low为1.5 V,电压为2 V,表示逻辑0(显性)。对于底速CAN,CAN_High为1.75 V,CAN_Low为3.25 V,电压为-1.5 V表示逻辑1(隐性);CAN_High为4 V,CAN_Low为1 V,电压为3 V,表示逻辑0(显性)。

        在 CAN 总线中,必须使它处于隐性电平 (逻辑 1) 或显性电平 (逻辑 0) 中的其中一个状态。假如有多个 CAN 通讯节点,在同一时间,一些输出隐性电平,另一些输出显性电平,那么那么根据“线与逻辑”的规定,此时CAN 总线为显性电平 (逻辑 0),显性电平的名字就是这样来的,即可以认为显性具有优先的意味。

CAN 的数据帧结构 

        在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,。这些标签起到了协同传输的作用,当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“帧”。

        为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如下表 ,此节只说明数据帧的结构。

        数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。 

帧起始段

        SOF 段 (Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

仲裁段

        当同时有两个数据被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。

        仲裁段的内容主要为本数据帧的 ID 信息 (标识符),数据帧具有标准格式和扩展格式两种,区别就在于 ID 信息的长度,标准格式的 ID 为 11 位,扩展格式的 ID 为 29 位,它在标准 ID 的基础上多出 18 位。在 CAN 协议中, ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的 ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得 CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。数据的优先级,是通过对 ID 的仲裁来确定的。如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁。

        若两个节点同时竞争 CAN 总线的占有权,当它们发送数据时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。见图 ,在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元 1 发送的为隐性电平,而此时节点单元 2 发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元 2 竞争总线成功,这个数据得以被继续发送出去。

        仲裁段 ID 的优先级也影响着接收设备对数据的反应。因为在 CAN 总线上数据是以广播的形式发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN控制器大多具有根据 ID 过滤数据的功能,它可以控制自己只接收某些 ID 的数据。回看数据帧格式,可看到仲裁段除了报文 ID 外,还有 RTR、IDE 和 SRR 位。

        (1) RTR 位 (Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。

        (2) IDE 位 (Identifier ExtensionBit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

        (3) SRR 位 (Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

控制段

        在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段 (Data Length Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8。

数据段

        数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成,MSB 先行。

CRC段

        为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。

ACK段

        ACK 段包括一个 ACK 槽位,和 ACK 界定符位。在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。若发送节点检测到ACK 槽位为显性,则说明有节点接收了数据。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。

帧结束

        EOF 段 (End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

CAN总线数据传输机制

以节点角度:

        当某个节点准备向总线发送数据时,它会首先判断总线是否处于空闲状态。如果总线已被占用(非空闲),此节点会暂时放弃发送,当总线变为空闲状态后,会再次尝试发送数据;当总线处于空闲状态(没有被占用)时,节点会判断此时是否还有其他节点也在尝试发送数据。如果没有,那它就可直接发送;如果有,就进行仲裁,编号低的那一个优先发送。

        简单来说,只有总线处于空闲状态,且自己为当下最高优先级的节点时,才能发送数据。

以总线的角度:

        当总线正在传输数据(被占用、非空闲)时,是不会去理会其他节点的发送请求的。只有当数据传完,总线处于空闲状态时,才会在那些等待发送的节点中选择一个编号最低的进行发送。

        CAN总线上有四个节点:Node_A、Node_B、Node_C、Node_D。发送的数据的ID号分别为5、7、3、6。这些数据出现的时间为此节点的第一次尝试在总线上发送此数据的时间。那么总线上最终发送数据的顺序如下图所示。

CAN 的波特率及位同步

位时序分解

        为了实现位同步,CAN 协议把每一个数据位(比特位)的时序分解成SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个 CAN 的数据位长度。分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。

        该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq, PBS1段占 5Tq, PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。实际上,电平并不是突变的,而是需要一个极短的时间。只有在此比特位的电平变化完毕后,且下一个比特位的电平还没有开始变化之前的这个时间段内进行采样,才能采到此比特位的稳定电平。

SS 段 (SYNC SEG)

        SS 译为同步段,在CAN协议中被设计用于电平跳变的时间段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的。当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS 段的大小固定为 1Tq。

PTS 段 (PROP SEG)

        PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小可以为 1~8Tq。

PBS1 段 (PHASE SEG1)

        PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1 段的初始大小可以为 1~8Tq。

PBS2 段 (PHASE SEG2)

        PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2 段的初始大小可以为 2~8Tq。

通讯的波特率

        总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个 Tq,就可以确定 CAN 通讯的波特率。

        例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit=19us,从而每秒可以传输的数据位个数为:1x10次方/19 = 52631.6 (bps)

        这个每秒可传输的数据位的个数即为通讯中的波特率。

同步过程分析

        波特率只是约定了每个数据位的长度,数据同步还涉起始时间以及相位的细节,(波特率只规定了传输的数据的速度,但没有说明到底什么时候开始传数据,以及如果速度有误差怎么办)这个时候就需要用到数据位内的 SS、PTS、PBS1 及 PBS2 段了。需要说明的是,对于异步通信来说,要进行时钟同步,只能依据电平的变化。如果长时间内电平没没有变化,则不能进行时钟同步。但不必担心,CAN总线的帧协议已经避免了这种情况的发生。

        根据对段的应用方式差异, CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:

硬同步

        若某个 CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号 (即上一小节介绍的帧起始段),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。见图 ,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 SS 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

重新同步

        前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步 (帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。重新同步的方式分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。

        第一种相位超前的情况如图 ,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步。

        第二种相位滞后的情况如图 ,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步。

        在重新同步的时候,PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度SJW* (reSynchronization Jump Width)”。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了最大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加大,但通讯的速度会下降。

未完待续

IIC

SPI

USB

参考

STM32入门教程-2023持续更新中_哔哩哔哩_bilibili

《AVR单片机嵌入式系统原理与应用(第3版)》马潮 编著 北京航空航天大学出版社 ISBN 978-7-5124-3266-6

SPI、I2C、UART(即串口)三种串行总线详解_串口总线_天糊土的博客-CSDN博客

几个串口通信协议的整理_串口协议_y673533511的博客-CSDN博客

CAN总线个人知识总结_哔哩哔哩_bilibili

秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_can通信协议简单理解-CSDN博客

CAN总线【2】--CAN协议数据帧与遥控帧-CSDN博客

  • 24
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UARTIICSPI,CAN都是常见的串行通信协议,它们有以下区别: 1. 通信方式:UART(Universal Asynchronous Receiver/Transmitter)是异步串口通信,只有一对数据线(TX和RX)。IIC(Inter-Integrated Circuit)是双线制的串行总线,包括SCL(时钟线)和SDA(数据线)。SPI(Serial Peripheral Interface)是四线制的串行总线,包括SCK(时钟线)、MISO(Master In Slave Out)、MOSI(Master Out Slave In)和CS(片选线)。CAN(Controller Area Network)是CAN总线通信,一般是在电气层面上实现的。 2. 数据传输速率:UART通信速率较低,一般在1Mbps以下,而IICSPI和CAN的通信速率较高,可以达到几Mbps甚至更高。 3. 通信距离:UART通信距离较短,一般在数米以内,而IICSPI通信距离也比较短,一般在几十厘米以内。CAN可以实现较远的通信距离,达到数百米甚至几千米。 4. 设备连接数量:UART通信是一对一的通信方式,即一个发送器连接一个接收器。IICSPI可以实现多个设备的连接,通过地址或片选信号进行选择通信对象。CAN总线可以连接多台设备,形成一个网络结构。 5. 硬件复杂度:UART通信硬件简单,适用于简单的串行通信IICSPI通信需要更复杂的硬件支持,例如时钟同步和数据线的动态切换等。CAN通信硬件较为复杂,需要专用的CAN控制器和收发器。 总的来说,UART适用于短距离低速率的通信IIC适用于简单的多设备通信SPI适用于高速数据传输,CAN适用于远距离和高可靠性的通信。不同的应用场景下,可以选择合适的串行通信协议

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值