目录
常见通讯协议
一、UART
1. 通讯方式
点对点异步串行通信,逐位传输数据,使用两条线(TX 发送、RX 接收),无共同时钟信号,依靠波特率来约定数据传输速率。
接收过程的本质是数据采集,假设接收端的采样时钟是波特率的16倍。
① 接收过程由起始位的下降沿启动;
② 接收端等待8个时钟周期,以便建立一个接近比特周期中间的采样点;
③ 接收端等待16个时钟周期,使其进入第一个数据位周期的中点;
④ 第一个数据位被采样并存储在接收寄存器中;
⑤ 串口模块在采样第二个数据位之前等待另外16个时钟周期;
⑥ 重复此过程, 直到所有数据位都被采样和存储;
⑦ 由停止位的上升沿使数据线返回到空闲状态。
2. 物理层
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。
在目前的工业控制使用的串口通讯中,一般使用 RXD、 TXD 以及 GND 三条信号线,直接传输数据信号。
3. 协议层
串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成。
3.1 波特率
串口异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
波特率是指每秒钟传送二进制数码的位数,以bit/s(bps)为单位。常用的波特率有: 9600、 19200、 38400、 57600和115200;
波特率为115200, 表示每秒传输115200位,且每一位数据在数
据线上持续时间为Tbit = 1/115200 ≈ 8.68us。
3.2 起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。
3.3 有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 5、 6、 7 或 8 位长。
3.4 数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无校验(noparity)。
4. USART与UART
STM32 芯片具有多个 USART 外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter 的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于 USART,它还有具有 UART 外设(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。
USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
5. 优缺点
优点
- 简单易用:UART接口设计简单,不需要复杂的硬件支持或编程逻辑来实现基本的数据传输功能。
- 成本效益高:由于其简单的硬件需求,UART在成本上非常有竞争力,特别适合预算有限的应用场景。
- 无需时钟同步信号:UART采用异步传输方式,发送和接收双方通过预设的波特率进行通信,无需额外的时钟线来保持同步,减少了所需的物理连接数量。
- 广泛应用:几乎所有的微控制器和计算机都内置了UART接口,使其成为一种标准的通信方法。
- 全双工通信:UART支持同时进行数据的发送和接收,提高了通信效率。
缺点
- 传输速率较低:相比其他高速串行通信协议(如SPI、I2C等),UART的数据传输速度较慢,通常最高可达几百kbps到几Mbps,具体取决于所使用的设备和电缆长度。
- 距离限制:虽然UART可以用于较长距离的通信,但随着距离增加,信号衰减和噪声干扰也会加剧,影响通信质量。一般建议在几米范围内使用以确保可靠性。
- 帧大小固定:UART通常以字节为单位进行数据传输,这意味着如果需要传输的数据量不是8位的倍数,则可能需要额外的处理来适应这种格式。
- 错误检测能力有限:UART的标准配置中仅包含奇偶校验位作为基本的错误检测手段,缺乏更高级的纠错机制。对于要求高可靠性的应用,可能需要额外实现CRC等更强的错误检测和纠正算法。
- 占用较多引脚资源:尽管UART只需要两条数据线(RX和TX),但在多设备通信时,每个连接都需要一对独立的RX/TX线路,这可能导致引脚资源紧张,尤其是在引脚数量有限的微控制器上。
二、RS485
1. 通讯方式
RS - 485 是一种串口通信标准,采用差分传输方式,支持多点通信,适用于半双工或全双工通信。在半双工模式下,同一时间只能进行发送或接收操作;全双工模式则可同时进行收发。它通常使用一对(半双工)或两对(全双工)双绞线作为传输介质,通过 RS - 485 转换器将 RS - 232 接口转换为 RS - 485 接口,从而实现多个设备的连接,形成一主多从的总线型网络结构。
RS - 485 标准规定,接收器的接收灵敏度为 ±200mV,即接收端的差分电压大于、等于 + 200mV 时,接收器输出为高电平;
小于、等于 - 200mV 时,接收器输出为低电平;介于 ±200mV 之间时,接收器输出为不确定状态。
在一个工业自动化控制系统中,有多个传感器(从设备)需要将数据传输给一台中央控制器(主设备)。这些传感器通过 RS - 485 总线串联起来,再连接到 RS - 485 转换器,最后与中央控制器的串口相连。中央控制器可以依次向各个传感器发送查询命令,传感器接收到命令后返回相应的数据。
2. 物理层
RS-485 协议主要是把 RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性,它的通讯网络如下图:
每个节点都是由一个通讯控制器和一个收发器组成,在 RS-485 通讯网络中,节点中的串口控制器使用 RX 与 TX信号线连接到收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用 TTL 信号传输,收发器与总线则使用差分信号来传输。
发送数据时,串口控制器的 TX 信号经过收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信号转化成 TTL 信号通过 RX 引脚传输到串口控制器中。
RS-485 通讯网络的最大传输距离可达 1200 米,总线上可挂载 128 个通讯节点,而由于 RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当 AB 两线间的电压差为-6V——-2V 时表示逻辑 1,当电压差为+2V——+6V 表示逻辑 0,在同一时刻只能表达一个信号,所以它的通讯是半双工形式的。
RS-485数据链路示意图
拓扑结构
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构,在同一总线上最多可以挂接32个节点。
RS-485总线同I2C,也是主从模式,支持点对点单从机模式,也支持多从机模式,不支持多主机模式。
3. SP3485芯片
3.1 电路原理图
该原理图是一个基本的RS-485电路,采用的是Sipex公司的SP3485芯片,是一款低功耗的,工作电压为3.3V的芯片
微处理器的标准串行口通过RXD直接连接SP3485芯片的RO引脚,通过TXD直接连接SP485R芯片的DI引脚。
让该芯片处于发送模式还是接收模式的选择位是DE/!RE,一般情况下把这两个引脚接在一起,只用微处理器的一个引脚控制
U9是TVS管,环境恶劣时可加,做保护作用,平时实验可以不加
R25是上拉电阻,R27下拉,默认状态下将A拉高,B拉低,如果不加电阻,那默认情况下是不稳定的,会对单片机的引脚造成干扰
3.2 芯片内部图
收发器内部是一个接收器(上半部分)加一个发送器(下半部分),然后就是引脚功能
RO:接收器输出
RE:接收器输出使能(低电平有效)
DE:发送器输出使能(高电平有效)
DI:发送器输入
GND:接地连接
A:发送器输出/接收器输入反相
B:发送器输出/接收器输入反相
Vcc:正极电源(+3.3V<VCC<+3.60V)
发送功能真值表
如果微处理器输出的信号DE_nRE为高电平,则芯片处于发送模式(发送器/驱动器),差分输出A和B遵循数据输入DI处的逻辑状态;当DI为高电平时,导致A转为高,B转为低。在这种情况下,定义为VOD=VA-VB的差分输出电压为正,也就是逻辑1(AB间的电压差为+2V ~ +6V);
当DI为低电平时,输出状态反转,B变高,A变低,VOD为负 ,为逻辑0(AB间的电压差为 -6V ~ -2V);
当DE低时,两个输出都变成高阻抗。在这种情况下,与D处的逻辑状态是不相关的。
接收功能真值表
如果微处理器输出的信号DE_nRE为低电平,则芯片处于接收模式(接收器),如果为高电平,则关闭接收模式;
AB间的电平大于+200mv时,RO引脚输出逻辑1;
AB间的电平小于-200mv时,RO引脚输出逻辑0;
当AB间的电平处于-200mv ~ +200mv之间时,则表示不稳定
4. 优缺点
优点
- 半双工通信
- 差分信号传输,更加稳定
- RS485内部的物理结构,采用的是平衡驱动器和查分接收器的组合,抗干扰能力大大增加。
- 可以在总线上进行联网实现多机通信,总线上允许挂多个收发器,从现有的RS485芯片来看,有可以挂32、64、128、256等不同个设备的驱动器。
- 通信速度快,数据最高传输速率在10Mbps以上
- 传输速率最远可达到1200米左右,但是传输速率和传输距离是成反比的,只有在100KB/s以下的传输速率,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。
- 系统运行稳定。利用专用通信总线把集中器和主站安全、可靠的连接起来。除非设备接口硬件损坏,或者总线线路断开,总线抄表系统会一直保持很好的通信效果和抄收成功率。
- 通信速率高。由于是专用的有线通信线路连接,线路上除了通信信号外,再无其他信号。外来的干扰信号耦合到线路衰减很大,所以集中器可以以较高的速率与主站通信。
缺点
- 不支持全双工
- 敷设困难。比如总线抄表系统需要在集中器与主站之间敷设通信线路。尤其是电能表比较分散时,通信线路敷设的工程量很大,而且架设在外的通信线路影响美观。
- 维护成本高。比如通信线路的损伤直接影响总线抄表方式的通信效果。所以需要定时的检查线路,保证其正常运行。特别是架设在外面的线路,一旦断裂或被腐蚀,要重新敷线。对于新增加的用户,也要及时敷线,使其进入通信网内
三、I2C
1. 通讯方式
双线制同步通信,采用主从模式,使用 SDA(串行数据线)和 SCL(串行时钟线)传输数据,主设备负责生成时钟信号并控制总线,每个从设备有唯一地址。
2. 物理层
通讯设备连接方式
特点
- 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
- 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
- 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
- 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
- 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
- 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式400kbit/s ,高速模式下可达 1Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。
3. 协议层
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:起始信号、停止信号和应答信号。
3.1 通讯的起始和停止信号
起始信号
SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
//软件模拟 IIC 起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda 线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//钳住 I2C 总线,准备发送或接收数据
}
停止信号
SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
//产生 IIC 停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda 线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//发送 I2C 总线结束信号
delay_us(4);
}
3.2 数据有效性
I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。
SDA数据线在 SCL 的每个时钟周期传输一位数据。
传输时,
SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。
当 SCL为低电平时, SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。
每次数据传输都以字节为单位,每次传输的字节数不受限制。
3.3 地址及数据方向
I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地(SLAVE_ADDRESS)来查找从机。 I2C 协议规定设备地址可以是 7 位或 10 位,实际中 7 位的地址应用比较广泛。
紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/W),第 8 位或第 11 位。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号,写数据方向时, SDA 由主机控制,从机接收信号。
3.4 响应信号
I2C 的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。
作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。
传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
除了基本的读写, I2C 通讯更常用的是复合格式,即第三幅图的情况,该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过 SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS 的区别);在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。
四、SPI
1. 通讯方式
全双工同步通信,采用主从架构,使用时钟信号(SCK)和数据线(MOSI 主发从收、MISO 主收从发)传输数据,主设备控制时钟信号。
2. 物理层
连接方式
SPI 通讯使用 3 条总线及片选线, 3 条总线分别为 SCK、 MOSI、 MISO,片选线为SS,它们的作用介绍如下:
(1) SS( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、 CS,以下用 NSS 表示。 当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。 I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以SPI 通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。(2) SCK (Serial Clock): 时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
(3) MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
(4) MISO(Master Input,, Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
3. 协议层
五、CAN
CAN 是控制器局域网络(Controller Area Network)的简称, 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519) , 是国际上应用最广泛的现场总线之一。
CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来, 它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
1. 通讯方式
与 I2C、 SPI 等具有时钟信号的同步通讯方式不同, CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
2. 物理层
2.1 闭环总线网络
CAN 物理层的形式主要有两种,下图中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻。
2.2 开环总线网络
下图是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。
2.3 通讯节点
从 CAN 通讯网络图可了解到, CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。
CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及CAN_Low 是一对差分信号线,使用比较特别的差分信号,下一小节再详细说明。
当 CAN 节点需要发送数据时, 控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到控制器中。
2.4 差分信号
差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑 0 和逻辑 1。
相对于单信号线传输的方式,使用差分信号传输具有如下优点:
- 抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的共模噪声可以被完全抵消。
- 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。
- 时序定位精确, 由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。
由于差分信号线具有这些优点,所以在 USB 协议、 485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。
3. 波特率及位同步
3.1 波特率
由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地, CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
3.2 位同步
为了实现位同步, CAN 协议把每一个数据位的时序分解成如图所示的 SS 段、 PTS 段、PBS1 段、 PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。
分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。为方便表示, 下图中的高低电平直接代表信号逻辑 0 或逻辑 1(不是差分信号)。
该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq, PBS1段占 5Tq, PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。
3.2.1 数据位分解
1. SS 段 (SYNC SEG)
SS 译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示 节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。 SS 段的大小固定为 1Tq。
2. PTS 段 (PROP SEG)
PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。 PTS 段的大小可以为 1~8Tq。
3. PBS1 段 (PHASE SEG1),
PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。 PBS1 段的初始大小可以为 1~8Tq。
4. PBS2 段 (PHASE SEG2)
PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。 PBS2 段的初始大小可以为 2~8Tq。
3.2.2 波特率的确定
总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个 Tq,就可以确定 CAN 通讯的波特率。
例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit=19us,从而每秒可以传输的数据位个数为:1x10^6/19 = 52631.6 (bps)这个每秒可传输的数据位的个数即为通讯中的波特率。
波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就需要用到数据位内的 SS、 PTS、 PBS1 及 PBS2 段了。
3.2.3 硬同步和重新同步
根据对段的应用方式差异, 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 极限值较大时,可以吸收的误差加大,但通讯的速度会下降。
4. 报文种类及结构
4.1 报文种类
在 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线, I2C 协议包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。
而 CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?
CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。(在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。)
当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。
为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如表所示:
4.2 数据帧的结构
数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,如下图所示
数据帧以一个显性位 (逻辑 0)(帧起始) 开始,以 7 个连续的隐性位 (逻辑 1)(帧结束) 结束,在它们之间,分别有仲裁段、控制段、数据段、 CRC 段和 ACK 段。
或
仲裁段
当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。仲裁段的内容主要为本数据帧的 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 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。
帧结束
EOF 段 (End Of Frame),译为帧结束,帧结束段由发送节点发送连续 7 个隐性位表示结束。
4.3 遥控帧
遥控帧用途是接收设备主动请求数据,遥控帧其实和数据帧非常类似,只是它没有数据段有效载荷这部分。
4.4 其他帧结构
5. 优缺点
优点
1. 高可靠性:CAN总线采用差分电压信号传输,这使得它对电磁干扰具有较强的抵抗力,能够在恶劣的工业环境中稳定运行 。
2. 实时性强:CAN协议采用了非破坏性的仲裁机制,确保了在多个节点同时尝试发送数据时,优先级高的消息可以先被发送,从而保证了系统的实时响应能力 。
3. 多主结构:每个节点都可以成为主机,并且能够与其他节点进行通信,增加了系统的灵活性和扩展性 。
4. 高效的错误处理和检测机制:CAN总线拥有可靠的错误处理和检错机制,包括CRC校验、位填充等方法来确保数据传输的准确性 。
5. 灵活的数据帧格式:支持标准格式(11位ID)和扩展格式(29位ID),可以根据需要选择不同的标识符长度 。
6. 低成本:相较于其他现场总线技术,CAN的成本较低,适合大规模应用 。
7. 长距离通信:虽然速率会随着距离增加而下降,但CAN总线仍能在较远的距离上传输数据,理论上可达10公里 。
8. 易于集成:由于其广泛的应用和支持,许多微控制器都内置了CAN接口,简化了系统设计
缺点
1. 有限的带宽:尽管CAN总线可以达到1Mbps的最大理论速率,但在实际应用中,尤其是长距离通信时,速率通常会低于此值 。
2. 复杂性和资源需求:为了实现CAN的功能,控制系统需要更复杂的软件和硬件支持,这可能增加开发成本和时间 。
3. 不一致性问题:在特定情况下,可能会出现所谓的“倒数第二位”错误,导致部分节点接收到的信息与实际情况不符 。
4. 不可预测的行为:不同状态下的节点可能会有不同的延迟,这对于某些关键任务来说可能是不可接受的 。
5. 难以直接连接互联网:CAN总线本身并不直接支持与互联网的连接,因此要实现远程监控或控制,往往需要额外的网关或其他中间件 。
综上所述,CAN总线因其独特的设计特点,在汽车电子、工业自动化等领域得到了广泛应用,但也存在一定的限制。在具体应用场景下选择是否使用CAN总线时,应充分考虑这些优缺点以及项目需求。
总结
通信方式 | 特点 | 使用方式 | 通信距离 | 通信速率 | 应用场景 |
---|---|---|---|---|---|
UART | 点对点通信,简单易用,广泛应用 | 异步串行通信,逐位传输数据 | 短距离,通常在几米至数十米之间 | 常见的通信速率从几百 bps 到数 Mbps 不等 | 串行通信设备(例如传感器、调试串口、蓝牙模块等) |
SPI | 全双工通信,高速数据传输,支持多从设备 | 主从架构,使用时钟信号和数据线传输数据 | 较短距离,通常在几米之内 | 通常可以达到几百 Kbps 到几十 Mbps 的速率 | 存储器、传感器、显示屏等需要高速数据传输的设备 |
I2C | 双线制,支持多主从设备,简化电路设计 | SDA(串行数据线)和SCL(串行时钟线)传输数据 | 较短距离,通常在几米之内 | 通常可以达到几百 Kbps 的速率 | 传感器、存储器、温度传感器、实时时钟等 |
CAN | 高可靠性,抗干扰能力强,支持多主多从 | 差分信号传输数据和错误检测 | 较长距离,可达数百米至数千米 | 通常可以达到几百 Kbps 到数 Mbps 的速率 | 汽车电子、工业控制、航空航天等需要高可靠性和抗干扰能力的系统 |
RS485 | 差分信号传输,支持多主多从,抗干扰能力强 | 差分信号传输数据 | 较长距离,可达数百米至数千米 | 通常可以达到几百 bps 到数 Mbps 的速率 | 远距离通信、工业自动化、楼宇自动化等需要远距离传输和多设备通信的系统 |