CAN与CANFD协议说明
在 CAN(Controller Area Network,控制器局域网)协议里,仲裁域波特率和数据域比特率有着不同的含义和作用,下面为你详细介绍并举例说明。
概念解释
仲裁域波特率
- 含义:仲裁域是 CAN 数据帧中的一部分,在数据帧开始传输时用于各个节点竞争总线的控制权。仲裁域波特率就是在仲裁过程中信号传输的速率,单位是比特每秒(bps)。它决定了仲裁过程的速度,各个节点通过仲裁域的信号来判断总线是否空闲以及竞争总线的优先级。
- 作用:在多节点的 CAN 网络中,当多个节点同时想要发送数据时,需要通过仲裁域来决定哪个节点能够优先占用总线进行数据传输。较高的仲裁域波特率可以加快仲裁过程,提高总线的使用效率。
数据域比特率
- 含义:数据域用于承载实际要传输的数据,数据域比特率则是数据域中数据传输的速率,同样以比特每秒(bps)为单位。它决定了数据传输的速度,较高的数据域比特率可以更快地将数据从发送节点传输到接收节点。
- 作用:在确定了总线的控制权后,数据域比特率影响着数据的传输效率。如果数据量较大,较高的数据域比特率可以减少数据传输的时间。
代码表示及举例
在实际应用中,CAN 控制器通常会提供相关的寄存器来配置仲裁域波特率和数据域比特率。以下以常见的 CAN 控制器为例进行说明,这里假设使用的是基于微控制器的 CAN 通信,并且使用 C 语言进行编程。
#include <stdio.h>
#include <stdint.h>// 假设这是 CAN 控制器的配置寄存器结构体
typedef struct {uint32_t BRP; // 波特率预分频器uint32_t SJW; // 同步跳转宽度uint32_t TSEG1; // 时间段 1uint32_t TSEG2; // 时间段 2
} CAN_BitTiming;// 配置仲裁域波特率
void configureArbitrationBitRate(CAN_BitTiming *timing, uint32_t clockFrequency, uint32_t desiredBitRate) {// 简单的波特率计算示例,实际可能需要更复杂的计算timing->BRP = clockFrequency / (desiredBitRate * (timing->TSEG1 + timing->TSEG2 + 1));
}// 配置数据域比特率
void configureDataBitRate(CAN_BitTiming *timing, uint32_t clockFrequency, uint32_t desiredBitRate) {// 简单的波特率计算示例,实际可能需要更复杂的计算timing->BRP = clockFrequency / (desiredBitRate * (timing->TSEG1 + timing->TSEG2 + 1));
}int main() {CAN_BitTiming arbitrationTiming;CAN_BitTiming dataTiming;// 假设系统时钟频率为 80MHzuint32_t systemClock = 80000000;// 配置仲裁域波特率为 500kbpsconfigureArbitrationBitRate(&arbitrationTiming, systemClock, 500000);printf("仲裁域波特率配置: BRP = %u\n", arbitrationTiming.BRP);// 配置数据域比特率为 1MbpsconfigureDataBitRate(&dataTiming, systemClock, 1000000);printf("数据域比特率配置: BRP = %u\n", dataTiming.BRP);return 0;
}
代码解释
- 结构体
CAN_BitTiming
:定义了 CAN 控制器中用于配置波特率的相关寄存器,包括波特率预分频器BRP
、同步跳转宽度SJW
、时间段 1TSEG1
和时间段 2TSEG2
。 - 函数
configureArbitrationBitRate
:用于配置仲裁域波特率,根据系统时钟频率和期望的波特率计算波特率预分频器的值。 - 函数
configureDataBitRate
:用于配置数据域比特率,同样根据系统时钟频率和期望的波特率计算波特率预分频器的值。 main
函数:演示了如何调用上述两个函数来分别配置仲裁域波特率为 500kbps 和数据域比特率为 1Mbps,并输出配置后的波特率预分频器的值。
举例说明
假设在一个汽车电子系统中,有多个节点需要通过 CAN 总线进行通信。发动机控制单元(ECU)、变速箱控制单元(TCU)和车身控制模块(BCM)都连接在 CAN 总线上。
- 仲裁域波特率:当多个节点同时想要发送数据时,仲裁域波特率决定了哪个节点能够优先占用总线。例如,发动机控制单元在检测到发动机故障时需要立即发送故障信息,此时较高的仲裁域波特率可以使发动机控制单元更快地竞争到总线控制权,及时将故障信息发送出去。
- 数据域比特率:一旦发动机控制单元获得了总线控制权,它需要将详细的故障数据发送到其他节点。较高的数据域比特率可以加快数据的传输速度,使其他节点能够更快地接收到故障信息,从而采取相应的措施。
波特率和采样点的基本概念
波特率
波特率是指单位时间内传输的码元个数,单位是波特(Baud)。在 CAN 总线通信里,波特率表示每秒传输的比特数(bps),它决定了数据传输的速度。较高的波特率意味着在相同时间内可以传输更多的数据,但同时也对信号的质量和稳定性要求更高。例如,波特率为 5Mbps 表示每秒可以传输 5000000 个比特的数据。
采样点
采样点是在一个比特时间内进行信号采样的位置。在 CAN 总线通信中,一个比特时间会被划分为多个时间段,而采样点就是在这个比特时间内进行信号检测的特定时刻。采样点的位置以比特时间的百分比来表示,例如采样点 75% 表示在一个比特时间的 75% 处进行信号采样。采样的目的是为了准确判断当前传输的是逻辑 0 还是逻辑 1。
“波特率 5Mbps 采样点 75%” 的含义
当波特率设置为 5Mbps 时,意味着数据以每秒 5000000 个比特的速度进行传输。而采样点 75% 表示在每个比特时间的 75% 这个时刻,CAN 控制器会对总线上的信号进行采样,以此来确定该比特是逻辑 0 还是逻辑 1。例如,一个比特时间为 1 / 5000000 秒(即 0.2 微秒),那么采样点就是在 0.2 微秒的 75% ,也就是 0.15 微秒这个时刻进行采样。
波特率越大,采样点比例越小的原因
信号传播和延迟影响
- 高速信号传播:波特率增大时,信号的上升沿和下降沿变得更陡峭,信号的变化速度更快。这是因为在单位时间内要传输更多的比特,每个比特的持续时间变短。例如,从 1Mbps 提高到 5Mbps,每个比特的时间从 1 微秒缩短到 0.2 微秒。
- 延迟问题:CAN 总线通信中存在信号传播延迟,包括线缆延迟、收发器延迟等。当波特率较低时,信号变化相对缓慢,在比特时间内有足够的时间让信号稳定下来,因此可以在较晚的位置(较高的采样点比例)进行采样。但当波特率增大时,信号变化迅速,如果采样点设置得太靠后,可能会因为信号还未稳定或者已经开始变化而导致采样错误。所以为了在信号相对稳定的时刻进行采样,需要将采样点提前,即采样点比例变小。
抗干扰能力考虑
- 噪声影响:高速信号更容易受到噪声的干扰。在波特率较高的情况下,噪声可能会使信号在短时间内出现波动。如果采样点设置得太靠后,就更有可能采集到受噪声干扰的信号,从而导致误判。将采样点提前到信号相对稳定的早期阶段,可以减少噪声对采样结果的影响,提高通信的可靠性。例如,在一个电磁干扰较强的工业环境中,较高波特率下提前采样可以有效降低误码率。
CAN(Controller Area Network,控制器局域网)总线要带终端电阻,主要有以下几个重要原因:
1. 防止信号反射
- 原理:CAN 总线是一种差分信号传输的串行通信总线,信号在总线上以电磁波的形式传播。当信号传播到总线的末端时,如果总线的阻抗不匹配,部分信号就会被反射回来,反射信号会与原信号相互干扰,导致信号失真。
- 影响:信号反射会使接收节点接收到错误的数据,增加通信错误率,甚至可能导致整个 CAN 网络通信失败。例如在汽车的 CAN 网络中,如果由于信号反射导致发动机控制单元接收到错误的传感器数据,可能会影响发动机的正常运行。
- 解决办法:在 CAN 总线的两端各连接一个终端电阻,且阻值等于总线的特性阻抗(通常为 120Ω),可以使信号能量被终端电阻吸收,避免信号反射。
2. 确保信号质量
- 稳定信号电平:终端电阻有助于稳定 CAN 总线上的信号电平。在 CAN 通信中,总线有显性(逻辑 0)和隐性(逻辑 1)两种状态。合适的终端电阻可以使总线在空闲状态下保持稳定的隐性状态,并且在发送显性位时,能够使信号快速上升和下降,减少信号的上升时间和下降时间,提高信号的边缘质量。
- 减少噪声干扰:稳定的信号电平可以降低噪声对信号的干扰。如果没有终端电阻,信号反射产生的杂波会增加噪声,使接收节点难以准确识别信号。通过使用终端电阻,能够提高信号的信噪比,增强通信的可靠性。
3. 保证总线正常工作
- 匹配总线特性:CAN 总线的设计是基于特定的电气特性,包括特性阻抗。终端电阻的作用是使总线的实际阻抗与设计的特性阻抗相匹配,确保信号能够按照预期的方式在总线上传播。
- 满足通信协议要求:CAN 通信协议规定了在总线两端必须连接终端电阻,以保证网络的正常运行。遵循协议要求使用终端电阻,才能使各个节点之间实现可靠的通信。