常见的通信协议——UART、SPI、IIC、CAN......(更新中)
引言
不同的电子设备之间有发收信息的需求,所以就需要通信。而通信协议是为了在通讯过程中,对通讯对象之间的信息传输进行标准化定义和规范。这样可以保证通讯过程的所有参与者都遵守相同的协议,从而能够正确地接收和理解发送方发送的数据,同时也能保证通信过程的稳定性和可靠性。
绝大多数电子设备之间的通信都是基于电平特性的(如:电平的高低,电平的变化过程),还有少数基于频率,占空比,周期性等电特性,亦或是基于温、声、磁、力、化、运动等非电量。
通信协议的分类
按照数据的传送方式,通信协议可分为以下2种。
串行通信
串行(Serial)指的是逐个传输数据位,一次只传输一个位。
并行通信
并行(Parallel)指的是同时传输多个数据位,一次可以传输多个位。
按照消息传送的方向与时间关系,通信协议可分为以下3种。
单工通信
单工通信(Simplex Communication)是指消息只能单方向传输的通信方式。
在单工通信中,发送端与接收端是固定的,即发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。
例如:遥控器与电视、广播站与收音机。
半双工通信
半双工通信(Half-duplex Communication)中的“双工”表示通信的双方都可以发送信息,而“半”表示双方不能同时发送或同时接收信息,即对于同一个设备,同一时刻只能发信息或者收信息,不能在发信息的时候又收信息,也不能在收信息的时候又发信息。
在这种工作方式下,发送端可以转变为接收端;接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种可以切换方向的单工通信。
例如:对讲机。
全双工通信
全双工通信(Full duplex Communication):通信的双方可以同时发送和接收数据。
例如:电话、网络。
按照时钟特性,通信协议可分为以下2种。
同步通信
同步通信:双方使用频率一致的时钟。发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(如:在时钟信号的上升沿时,将数据发送出去),发送数据;接收端根据发送端提供的时钟信号,以及一定的约定(例如:在时钟信号为低电平时,读取数据),接收数据。
异步通信
异步通信:收发双方各自有自己的时钟,接收方并不知道数据什么时候会到达,发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。
按照电平特性,通信协议的电信号可分为以下2种。
差分信号
差分信号:以两根信号线上的电压差作为判断逻辑“1”和逻辑“0”标准的信号称为差分信号。两根信号线上的信号振幅相同,相位相反,那么它们的电势差就构成了差分信号。
单端信号
单端信号:以一根信号线上的绝对电压值作为判断逻辑“1”和逻辑“0”标准的信号称为单端信号。信号由一个参考端和一个信号端构成,参考端一般为地端(且通常不同设备的参考端共地),信号端的电压就构成了单端信号。
按照通信设备数量,通信协议的电信号可分为以下4种。
点对点
一个发送端,一个接收端。
点对多
一个发送端,多个接收端。
多对点
多个发送端,一个接收端。
多对多
多个发送端,多个接收端。
UART(串口)
UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器,即常说的“串口”。
串口通信是一种串行、异步、全双工、单端、点对点的通信协议。
电路
TXD(Transmit Data):发送数据引脚,用于发送端发送数据。
RXD(Receive Data):接收端引脚,用于接收端接收数据。
GND:共用地
串口参数
起始位
位于数据帧开头,只占 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:偶校验位
SPI
SPI(Serial Peripheral Interface,外围设备接口)是由Motorola(摩托罗拉)公司开发的一种通用数据总线
SPI是一种串行、全双工、同步、单端、点对多的通信协议
电路
一主一从的SPI通信有四根通信线:
SCK/SCLK(Serial Clock):串行时钟信号线 。空闲时,电平恒定,没有电平跳变;工作时以时钟脉冲形式产生周期性的电平跳变。
MOSI(Master Output Slave Input):主机输出从机输入数据线。有时也可以是SIMO、DI(Data Input)(从机端)、SI(Slave Input)(主机端)
MISO(Master Input Slave Output):主机输入从机输出数据线。有时也可以是SOMI、DO(Data Output)(从机端)、SO(Slave Output)(主机端)
SS(Slave Select)/CS(Chip Select):从机选择线/片选线,低电平时与相连从机通信
此外,主从设备的参考电压要相同(共地)
对于主机:
输出引脚(SCK、MOSI、SS)配置为推挽输出
输入引脚(MISO)配置为浮空或上拉输入
对于从机:
通信时,输出引脚(MISO)配置为推挽输出,空闲时,输出引脚(MISO)配置为高阻态
输入引脚(SCK、MOSI、SS)配置为浮空或上拉输入
通信过程
1.主机选择从机:主机通过拉低对应从机的SS线选择开始与其通信。
2.主机启动时钟、从机切换MISO模式:主机开始产生SCLK信号,通常从空闲状态开始,并在数据传输期间持续提供时钟信号。从机将MISO由高阻态切换为推挽输出
3.数据交换:
对于主机:
主机将待发送的数据写入其发送数据缓存区后,先将一个字节的数据复制到移位寄存器。随后,移位寄存器中的数据从高位到低位一位一位地移出到MOSI线上。
同时,主机通过MISO线接收到从机发来的数据,半个时钟周期后,这些数据从高位到低位一位一位地被移入移位寄存器中的。
当移位寄存器移出一个字节的数据时,它同时(严格上讲,差了半个时钟周期)也移入了一个字节的数据,此时移位寄存器中存储的是接收到的数据,这些数据会被存入接收数据缓存区,之后主机发送数据缓存区中的下一个字节的数据会被复制到移位寄存器中,从而进行下一个字节的数据交换,如此循环,直至交换完所有的数据。
对于从机:
从机将待发送的数据写入其发送数据缓存区后,先将一个字节的数据复制到移位寄存器。随后,移位寄存器中的数据从高位到低位一位一位地移出到MISO线上。
同时,从机通过MOSI线接收到从机发来的数据,半个时钟周期后,这些数据从高位到低位一位一位地被移入移位寄存器中的。
当移位寄存器移出一个字节的数据时,它同时(严格上讲,差了半个时钟周期)也移入了一个字节的数据,此时移位寄存器中存储的是接收到的数据,这些数据会被存入接收数据缓存区,之后从机发送数据缓存区中的下一个字节的数据会被复制到移位寄存器中,从而进行下一个字节的数据交换,如此循环,直至交换完所有的数据。
数据交换过程如下:
将一个字节的数据复制到移位寄存器
移出第一个位(最高位)
移入第一个位(对方的最高位)
移出第二个位(次高位)
移入第二个位(对方的次高位)
如此往复,直至交换完一个字节的数据
4.完成通信:当所有需要交换的数据都传输完毕后,主机停止产生SCK信号,并将SS线拉高,以结束与当前从机的通信。从机将输出引脚(MISO)配置为高阻态,以避免干扰之后主机与其他从机的通信。
一些说明:
SPI只能进行数据交换,不能单独进行读或写数据。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节(通常为0x00和0xFF);反之,若主机要读取从机给的一个字节,就必须发送一个字节(通常为0x00和0xFF)来引发从机的传输。
SPI总线传送完一个字节后无需应答即可开始下一个字节的传送;SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送。
SPI模式未完待续
SPI有四种工作模式,通过CPOL(Clock Polarity,串行时钟极性)和 CPHA(Clock Phase,相位)的搭配来得到四种工作模式:
模式0:CPOL = 0,CPHA = 0
模式1:CPOL = 0,CPHA = 1
模式2:CPOL = 1,CPHA = 0
模式3:CPOL = 1,CPHA = 1
数据格式未完待续
SPI协议并未规定数据格式,不过一般是先发送指令,再发送数据
时序图未完待续
模式0:CPOL = 0,CPHA = 0
主机软件模拟有延时
一主多从未完待续
常规模式
菊花链模式
未完待续
IIC
IIC(Inter-Integrated Circuit,集成电路总线)是由Philips(飞利浦)公司开发的一种通用数据总线,常简称为I²C
IIC是一种串行、半双工、同步、单端、多对多的通信协议
硬件电路
IIC有两条通信线:
SDA(Serial data):串行数据线
SCL(Serial clock):串行时钟线
SCL和SDA各有一个上拉电阻,阻值一般为4.7KΩ左右
主从设备的SCL和SDA均要配置成开漏输出模式
开漏输出模式的规定是:置为低电平时,引脚接地,强下拉;置为高电平时,引脚浮空,弱上拉。但因为SCL和SDA各有一个上拉电阻,所以置为高电平时,电平为高,只不过该高电平是与上拉电阻连接的正极赋予的。
上拉电阻和开漏输出有以下3个好处:
1.防止短路,因为不会同时出现强上拉和强下拉
2.避免了引脚模式的频繁切换,当引脚要采集输入的电平时,可通过断开输出引脚的方式将引脚置高(因为在外接上拉电阻的情况下,开漏输出的置高就是断开输出引脚)。
3.使电路有了“线与”的特性,即所有的引脚置高,线上电压才会为高,只要有一个引脚置低,线上电压就会为低。IIC会利用这个特性,实现多主机模式下的时钟同步和总线仲裁(总线的控制权会交给最后一个输出低电平的主机,其它主机(输出高)通过检测总线上的电平状态(状态低),对比与自己输出状态不一致,则自动退出对总线的控制请求,从而防止了总线上的数据冲突。)。
时序基本单元
起始条件(START/S):SCL高电平期间,SDA从高电平切换到低电平
终止条件(STOP/P):SCL高电平期间,SDA从低电平切换到高电平
重复开始条件(ReSTART/Sr): 在结束时不给出STOP信号,而以一个时钟周期内再次给出开始信号作为替代。
主机发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
主机接收一个字节:主机在接收之前,要先释放SDA ,SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节
主机发送应答(SA):主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
主机接收应答(RA):主机在接收之前,要先释放SDA,主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答
一些说明:
SCL永远由主机控制,SDA只有在主机接收一个字节数据或接收应答时,才会由从机控制,并且在主机接收完毕后,从机会交出控制权。其余时刻SDA均由主机控制
控制是指引脚在此期间可以将开漏输出置1(在外接上拉电阻的情况下,断开输出引脚)或置0(可以不变但有变化的权力),而交出控制权是指引脚在此期间只能将开漏输出置1(不能变化)
数据格式
七位地址的从机的读写数据帧格式如下 :未完待续
通信过程
主机向从机写
主机:
以发出起始条件开始,之后通过发送从设备地址,寻找要进行通信的从设备,然后发送写指令(0为写),之后接收从机应答。然后发送要写入的寄存器地址并接收从机应答(如果地址为多个字节,则每发送一个字节就要接收一次从机应答),随后是根据需求发送要写入的字节数据和并且每发送完一个字节就要接收从机应答,当接收从机应答为1(非应答)或已发完全部待写入的数据时,发出停止条件。
从机:未完待续
主机从从机的当前地址读未完待续
主机从从机的指定地址读
主机:
以发出起始条件开始,之后通过发送从设备地址,寻找要进行通信的从设备,然后发送写指令(0为写),之后接收从机应答。然后发送要写入的寄存器地址并接收从机应答(如果地址为多个字节,则每发送一个字节就要接收一次从机应答)。之后发出停止和起始条件或重新起始条件,随后发送相同的从设备地址,然后发送读指令(1为读),之后接收从机应答。随后是根据需求接收从机发来的字节数据和并且每发接收一个字节就要向从机发出一次应答,当不再需要接收数据时,向从机发出的应答为1(非应答),最后发出停止条件。
从机:未完待续
一些说明:
当从机接收到主机发出的读命令(R/W=1)时,会立刻向主机传输当前指针下的数据,不会给主机发送指定读地址的指令的时间,这也是为何改变指针指向位置(要读写的地址)时要通过写指令去完成。又因为只是要改变指针指向的位置而不是真的要去写数据,所以在改变完指针指向的位置后就直接重新进入了读操作。
主机接收从机发送的应答信号时(在主机发送数据并且从机读取数据后),如果SDA仍然保持高电平,则主机可以直接产生STOP条件终止以后的传输或者继续ReSTART开始一个新的传输。
从机发送数据,主机读取数据时,应答信号由主机给出。主机将应答位置低电平表示还需要再接收数据,而当主机接收完想要的数据后,通过将应答位置高电平告诉从机读取数据结束了。随后主机发送STOP命令,将总线释放,结束读操作。
时序图
指定地址写
向0b1101000设备中0b00011001地址下写入0b10101010这一个字节的数据
RA=0均为从机向主机发送的应答位,表示从机收到了主机发来的数据
当前地址读
读取0b1101000设备中当前地址下的一个字节的数据,读到的数据为:0b00001111
RA=0为从机向主机发送的应答位,表示从机收到了主机发来的数据
SA=1为主机向从机发送的应答位,表示主机无应答(其实是收到了),从机在得知无应答后会停止发送后面的数据
指定地址读
读取0b1101000设备中0b00011001地址下的一个字节的数据,读到的数据为:0b10101010
多主多从未完待续
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 极限值较大时,可以吸收的误差加大,但通讯的速度会下降。
未完待续
USB
pwm
USART、4线制串口
one-wire单总线
电平标准ttl...
无线通信协议(WiFi、Bluetooth、红外)
modbus
参考
STM32入门教程-2023持续更新中_哔哩哔哩_bilibili
《AVR单片机嵌入式系统原理与应用(第3版)》马潮 编著 北京航空航天大学出版社 ISBN 978-7-5124-3266-6
SPI、I2C、UART(即串口)三种串行总线详解_串口总线_天糊土的博客-CSDN博客
几个串口通信协议的整理_串口协议_y673533511的博客-CSDN博客
更多推荐
所有评论(0)