CAN通信抗干扰硬件设计实战 - 第1节
1.1 CAN协议概述
控制器局域网(Controller Area Network,简称CAN)是一种由德国Bosch公司于1986年开发的串行通信协议,最初专为汽车环境中的电子控制单元(ECU)之间的可靠通信而设计。经过数十年的发展,CAN协议已成为工业自动化、医疗设备、航空航天及轨道交通等领域中应用最广泛的现场总线之一。
CAN协议的核心设计理念包括:
- 多主总线结构:任何节点均可主动发起通信,无需主从仲裁。
- 基于优先级的非破坏性仲裁:通过标识符(ID)决定总线访问权,高优先级报文优先发送。
- 短帧结构:数据场最多8字节(CAN 2.0A/B),确保实时性与低延迟。
- 强大的错误检测与处理机制:包括CRC校验、位填充、格式检查、应答确认等。
- 差分信号传输:抗共模干扰能力强,适合恶劣电磁环境。
| 特性 | CAN 2.0A(标准帧) | CAN 2.0B(扩展帧) | CAN FD(灵活数据速率) |
|---|---|---|---|
| 标识符长度 | 11位 | 29位 | 11位或29位 |
| 最大数据场 | 8字节 | 8字节 | 64字节 |
| 最大波特率 | 1 Mbps | 1 Mbps | 8 Mbps(数据段) |
| 帧类型 | 数据帧、远程帧 | 数据帧、远程帧 | 数据帧、远程帧、扩展数据帧 |
1.2 差分信号原理
CAN总线采用差分信号传输方式,这是其具备卓越抗干扰能力的根本原因。差分信号使用两条物理线路——CAN_H(高电平线)和CAN_L(低电平线)——来传输一路逻辑信号。接收端通过检测两条线之间的电压差(Vdiff = CAN_H - CAN_L)来判别总线状态。
差分信号相比单端信号具有以下显著优势:
- 共模噪声抑制:外部电磁干扰在两条线上产生几乎相同的共模电压,差分接收器只响应差模分量,从而抵消共模噪声。
- 电磁辐射降低:两条线中的电流方向相反,产生的磁场相互抵消,减少对外辐射。
- 信号摆幅小:典型差分电压仅约1.5V~2.0V,功耗更低且开关速度更快。
- 地电位偏移容忍:允许收发器之间存在高达±12V的共模电压差(视具体收发器型号而定)。
| 总线状态 | 逻辑值 | CAN_H电压 | CAN_L电压 | 差分电压 Vdiff |
|---|---|---|---|---|
| 显性(Dominant) | 0 | 3.5V | 1.5V | 2.0V(典型) |
| 隐性(Recessive) | 1 | 2.5V | 2.5V | 0V(近似) |
1.3 CAN总线物理层特性
CAN总线的物理层定义了信号传输的电气特性、位时序、同步机制以及总线拓扑结构。根据ISO 11898-2标准,高速CAN(High-Speed CAN)是最常用的物理层实现,其关键特性如下:
1.3.1 总线电平与终端匹配
CAN总线两端必须各连接一个120Ω的终端电阻,用于匹配传输线阻抗、抑制信号反射。终端电阻的典型连接方式为:CAN_H与CAN_L之间跨接120Ω电阻。在低速或容错CAN中,终端电阻的配置方式有所不同。
1.3.2 位时序与同步
CAN总线采用非归零(NRZ)编码方式,并通过位填充(Bit Stuffing)机制保证时钟同步的连续性。每一位被划分为四个段:
- 同步段(Sync_Seg):用于同步总线上的各个节点,长度为1个时间量子(Tq)。
- 传播段(Prop_Seg):补偿网络中的物理延迟,包括收发器延迟和总线传播延迟。
- 相位缓冲段1(Phase_Seg1):用于补偿边沿相位误差,采样点位于此段末尾。
- 相位缓冲段2(Phase_Seg2):用于补偿边沿相位误差,控制下一个位周期的开始。
| 波特率 | 位时间 (Tbit) | 时间量子 (Tq) | Sync_Seg | Prop_Seg | Phase_Seg1 | Phase_Seg2 | 采样点位置 |
|---|---|---|---|---|---|---|---|
| 1 Mbps | 1 μs | 125 ns | 1 Tq | 2 Tq | 3 Tq | 2 Tq | 75% |
| 500 kbps | 2 μs | 200 ns | 1 Tq | 3 Tq | 3 Tq | 3 Tq | 70% |
| 250 kbps | 4 μs | 250 ns | 1 Tq | 4 Tq | 5 Tq | 6 Tq | 62.5% |
| 125 kbps | 8 μs | 500 ns | 1 Tq | 5 Tq | 5 Tq | 5 Tq | 68.75% |
1.3.3 总线拓扑与节点结构
CAN总线采用线性总线拓扑结构,所有节点通过双绞线并联在总线上。每个CAN节点通常包含以下组成部分:
- 微控制器(MCU):集成CAN控制器或通过SPI接口连接外部CAN控制器。
- CAN控制器:实现协议层功能,包括帧封装、仲裁、错误检测等。
- CAN收发器:将控制器的逻辑电平转换为总线差分信号,并提供电气隔离保护。
- 隔离器件(可选):如光耦或磁耦,用于实现节点间的电气隔离。
- 终端电阻:总线两端各一个120Ω电阻。
1.3.4 抗干扰设计要点
基于上述物理层特性,在实际硬件设计中需重点关注以下抗干扰措施:
- 双绞线选择:使用特性阻抗为120Ω的屏蔽或非屏蔽双绞线,绞距应均匀,每英寸至少3~5绞。
- 终端电阻精度:选用1%精度的120Ω电阻,功率不低于1/4W,确保阻抗匹配。
- 共模扼流圈:在总线入口处串联共模扼流圈,抑制共模干扰进入节点。
- ESD保护:在CAN_H和CAN_L对地之间放置TVS管,钳位电压选择±36V或±40V。
- 隔离设计:对于长距离或高电位差场景,使用带隔离的CAN收发器(如ISO1050、ADM3053)。
- 布线规则:总线走线远离高频开关电源、时钟线等强干扰源,避免90°直角拐弯。
/* CAN控制器初始化代码示例(基于STM32 HAL库) */
CAN_HandleTypeDef hcan1;
void MX_CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 6; // 时间量子分频
hcan1.Init.Mode = CAN_MODE_NORMAL; // 正常模式
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; // 同步跳转宽度
hcan1.Init.TimeSeg1 = CAN_BS1_8TQ; // 时间段1
hcan1.Init.TimeSeg2 = CAN_BS2_3TQ; // 时间段2
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = ENABLE; // 自动离线恢复
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = ENABLE; // 自动重发
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
}