☰
嵌入式CAN总线从协议到实战:硬件设计、位时序与调试避坑指南
2026/10/9 1:34:27 网站建设 项目流程

CAN 总线这东西,刚入行嵌入式的朋友十有八九都听过,但真正能把它讲明白、用利索的人并不多。我见过太多人面试时能把“CAN 是 Controller Area Network”背得滚瓜烂熟,一到实际项目里连终端电阻该接几个、波特率怎么算、报文为什么发不出去都搞不定。这篇内容就是写给那些准备入行汽车电子、工业控制,或者正在做嵌入式项目、需要把 CAN 通信跑通的工程师。我会从协议底层讲到实际调试,把那些教科书上不会写、但项目里一定会踩的坑一个个拆开说清楚。不管你是刚学完 STM32 想找个实战方向,还是已经在做嵌入式开发但对 CAN 总是一知半解,这篇内容都能让你少走至少半年的弯路。

1. 为什么嵌入式工程师绕不开 CAN 总线

1.1 CAN 总线在嵌入式领域的真实地位

很多人学嵌入式是从串口、I2C、SPI 开始的,这些协议在板内通信确实够用。但一旦你的设备要跟多个节点通信,而且通信距离超过几米、环境还有电机、继电器这类干扰源,串口就开始丢包,I2C 直接挂死。这时候 CAN 总线的价值就体现出来了。

CAN 最早是博世在 1980 年代为汽车电子开发的,核心诉求就一个:让车上几十个 ECU 能在一条总线上可靠地交换数据,而且成本要低。它采用差分信号传输,CAN_H 和 CAN_L 两根线之间的电压差来表示逻辑电平,共模干扰会被差分接收器直接抵消掉。这就是为什么 CAN 在汽车发动机舱那种电磁环境极其恶劣的地方还能稳定工作。

从应用场景看,CAN 总线主要覆盖三大领域。汽车电子是最主流的,动力总成、车身控制、诊断接口基本都跑 CAN。工业自动化里,PLC、伺服驱动器、传感器之间的通信也大量用 CANopen 协议。还有就是医疗设备、电梯控制、船舶电子这些对可靠性要求高的场景。你去看任何一个嵌入式招聘岗位,只要涉及汽车或工业方向,CAN 几乎是必考项。

1.2 CAN 与其他板间通信协议的对比

不少初学者会问:我直接用 RS485 不也能多节点通信吗?为什么非要学 CAN?这个问题问得好,我用一张表把几个常见协议拉出来对比,你一看就明白差异在哪。

特性CANRS485I2CSPI
拓扑结构总线型总线型总线型主从点对点
最大节点数理论上无限制,实际受收发器驱动能力限制32~256受地址空间限制取决于片选数量
通信速率最高 1Mbps(经典CAN)最高 10Mbps最高 3.4Mbps最高几十Mbps
仲裁机制非破坏性位仲裁无有仲裁但会丢数据无
错误检测CRC、位填充、应答、格式检查无无无
差分传输是是否否
典型应用汽车、工业工业仪表板内芯片间板内高速外设

关键差异在仲裁和错误处理。RS485 只是物理层标准,上面跑什么协议全靠你自己定,多节点同时发数据就会冲突。CAN 从协议层面就解决了这个问题,它的非破坏性位仲裁机制保证高优先级报文优先发送,低优先级报文自动退让并在下一轮重发,数据不会丢。再加上 CRC 校验、自动重传、错误计数和总线关闭恢复机制,CAN 的可靠性是 RS485 裸跑没法比的。

1.3 学习 CAN 的典型路径与常见误区

我带过不少新人,发现学 CAN 最容易走两个极端。一种是只背协议理论,帧格式、位时序背得一字不差,但从来没接过示波器看过波形,遇到通信失败完全不知道从哪查。另一种是直接抄例程把代码跑通就完事,问他为什么波特率要配这个值、采样点为什么设在 75%,一概不知。

正确的路径应该是理论加实操交替推进。先把帧结构和位时序搞懂,然后拿两块开发板加两个 CAN 收发器,亲手接上 120 欧姆终端电阻,用示波器看差分波形,再逐步调波特率、发不同 ID 的报文、故意制造错误观察错误帧。这个过程走一遍,比看十遍书都管用。后面我会按这个思路把每个环节展开讲。

2. CAN 协议帧结构里那些容易记混的细节

2.1 数据帧的七个字段逐个拆解

CAN 的数据帧是实际项目里用得最多的帧类型,它分成七个字段:帧起始、仲裁段、控制段、数据段、CRC 段、ACK 段、帧结束。很多人背是背下来了,但每个字段具体多少位、有什么作用,一到调试就模糊。

帧起始就一位,显性电平,用来告诉总线上所有节点“我要开始发了”,同时用于硬同步。仲裁段在标准帧里是 11 位标识符加 RTR 位,扩展帧则是 29 位标识符加 SRR、IDE、RTR 位。这里有个容易搞混的点:标准帧和扩展帧的仲裁段长度不同,但它们在总线上可以共存,靠 IDE 位区分。标识符数值越小优先级越高,因为显性电平覆盖隐性电平,ID 前面位为显性的节点会在仲裁中胜出。

控制段包含 IDE 位、保留位和数据长度码。数据长度码是 4 位,取值 0 到 8,表示数据段有多少字节。经典 CAN 一帧最多 8 字节数据,这是它的一个限制,后来 CAN FD 把这个限制放宽到了 64 字节。数据段就是实际载荷,0 到 8 字节。CRC 段是 15 位校验值加一位界定符,接收方算出来的 CRC 跟收到的对不上就会报错。ACK 段有两位,发送方发隐性电平,任何正确接收的节点都会拉成显性,所以发送方只要看到 ACK 位是显性就知道至少有一个节点收到了。帧结束是 7 位隐性电平。

2.2 标准帧与扩展帧的取舍逻辑

标准帧 11 位 ID,能表示 2048 个不同的标识符。扩展帧 29 位 ID,数量上完全够用。那实际项目里到底该用哪个?

这取决于你的系统规模和协议规范。如果是封闭系统,节点数量不多,用标准帧就够了,帧长度短、开销小、总线利用率高。但如果你要做 CANopen 或者 J1939 这类标准化协议,它们对 ID 的分配有严格规定,往往需要扩展帧来容纳源地址、目标地址、优先级等信息。汽车行业里,动力 CAN 通常用标准帧,诊断和标定用的 CAN 多用扩展帧。

还有一个实际考虑是兼容性。有些老旧的 CAN 控制器只支持标准帧,如果你的系统里混了这类设备,就得统一用标准帧。我个人的经验是,新项目如果没特殊要求,优先用标准帧,简单直接,调试时看 ID 也方便。等确实需要更多 ID 空间或者要兼容特定协议栈时再切扩展帧。

2.3 远程帧、错误帧、过载帧的实际用途

数据帧之外,CAN 还有远程帧、错误帧和过载帧。远程帧的 RTR 位是隐性的,它没有数据段,作用是请求某个 ID 的数据帧。比如节点 A 需要节点 B 的温度数据,A 可以发一个 ID 为温度数据 ID 的远程帧,B 收到后就会发对应的数据帧。

但远程帧在实际项目里用得越来越少。原因是它增加了总线负载,而且请求和响应之间的延迟不确定。现在更常见的做法是节点周期性主动广播数据,需要数据的节点自己过滤接收。错误帧是节点检测到错误时发出的,它由错误标志和错误界定符组成,作用是通知总线上所有节点刚才那帧有问题,大家丢弃。过载帧用来在数据帧或远程帧之间提供额外延迟,实际用得很少,大多数控制器不会主动发。

理解这三种帧的关键是明白 CAN 的错误处理是分布式的。每个节点都在监听总线,任何节点发现错误都会发错误帧,发送方检测到错误后会自动重传。这种机制让 CAN 不需要中央仲裁器就能保证数据一致性。

3. 位时序与波特率:CAN 通信稳定性的命门

3.1 位时序的四个时间段与采样点

CAN 总线没有独立的时钟线,所有节点靠位时序来同步。一个位时间被分成四个段:同步段、传播段、相位缓冲段 1、相位缓冲段 2。同步段固定 1 个时间份额,用于硬同步。传播段用来补偿总线上的物理延迟,包括收发器延迟和线缆延迟。相位缓冲段 1 和 2 用于重同步,采样点就在相位缓冲段 1 结束的位置。

采样点位置用百分比表示,计算公式是(同步段 + 传播段 + 相位缓冲段1)除以总位时间。CiA 推荐采样点在 75% 到 87.5% 之间。采样点太靠前,信号还没稳定就采样,容易误判;太靠后,留给重同步的余量不够,遇到时钟偏差大的节点容易出错。

我见过一个典型案例:两个节点都用 500kbps,但一个采样点设 75%,另一个设 87.5%,单独跑都没问题,一连上就频繁报错。原因就是采样点差异太大,重同步补偿不过来。所以同一总线上的所有节点,位时序参数必须协调一致,尤其是采样点位置。

3.2 波特率计算的完整推导过程

波特率计算的核心是:波特率等于时钟频率除以分频系数再除以每位的时钟数。假设你的 CAN 控制器时钟是 36MHz,想配 500kbps,那么每位的时间份额总数等于 36M 除以 500k 等于 72。这 72 个时间份额要分配到四个段里。

一个常见的分配方案是:同步段 1,传播段 14,相位缓冲段 1 和 2 各 28,加起来 1+14+28+28=71,不对,得凑够 72。调整一下:同步段 1,传播段 15,相位缓冲段 1 和 2 各 28,总和 72。采样点位置等于(1+15+28)除以 72,约等于 61%,偏低。再调:同步段 1,传播段 14,相位缓冲段 1 取 39,相位缓冲段 2 取 18,总和 72,采样点等于(1+14+39)除以 72,约等于 75%,符合推荐值。

实际配置时,大多数 CAN 控制器用 BRP(波特率预分频器)、TSEG1、TSEG2 这几个寄存器。TSEG1 等于传播段加相位缓冲段 1,TSEG2 就是相位缓冲段 2。上面的例子里 BRP 设为 1,TSEG1 设为 53,TSEG2 设为 18。不同厂商的控制器寄存器命名可能不同,但原理一样。

注意:计算波特率时一定要确认 CAN 控制器的时钟源频率。很多 STM32 项目里 CAN 挂在 APB1 总线上,APB1 频率又受系统时钟和分频系数影响,算错了整个通信就废了。

3.3 采样点设置不当引发的典型故障

采样点问题最典型的症状是:短距离通信正常,线缆一拉长就开始偶发错误;或者常温下正常,温度一高就通信中断。这是因为线缆延迟和收发器延迟会随距离和温度变化,采样点如果没留够余量,信号边沿就会落到采样窗口之外。

排查这类问题,示波器是必备工具。把探头接在 CAN_H 和 CAN_L 上,用差分探头最好,没有的话两个单端探头相减也能看。观察波形,找到显性到隐性的跳变沿,然后看采样点位置是否落在信号稳定区域。如果采样点离跳变沿太近,就要调整 TSEG1 和 TSEG2 的比例,把采样点往后挪。

还有一个隐蔽的坑是晶振精度。CAN 协议要求节点时钟容差在 0.5% 以内,如果用内部 RC 振荡器做 CAN 时钟源,温漂一大就容易超出容差,导致同步失败。所以做 CAN 通信,外部晶振是标配,别省这个钱。

4. 硬件电路设计:从收发器选型到终端电阻

4.1 CAN 收发器的选型要点

CAN 控制器负责协议处理,但真正把逻辑电平变成差分信号的是收发器。常见的收发器有 NXP 的 TJA1050、TI 的 SN65HVD230、Microchip 的 MCP2551 等。选型时主要看几个参数:速率、供电电压、隔离需求、总线故障保护。

TJA1050 是 5V 供电,最高 1Mbps,经典款,便宜好用,但抗干扰能力一般。SN65HVD230 是 3.3V 供电,适合跟 3.3V 的 MCU 直接对接,省掉电平转换。MCP2551 也是 5V,带过温保护和短路保护。如果项目环境干扰特别大,比如电机驱动旁边,建议用带隔离的收发器,像 ADM3053 这种集成隔离电源和隔离器的,虽然贵但省心。

选型时还要注意收发器的环路延迟。这个参数影响传播段的设置,延迟越大,传播段就要留越长,波特率就上不去。高速场合要选低延迟的型号。

4.2 终端电阻的正确接法与常见错误

CAN 总线两端各需要一个 120 欧姆的终端电阻,这是为了匹配线缆特性阻抗,消除信号反射。总线两端指的是物理上最远的两个节点,不是随便找两个节点接上就行。

我见过最常见的错误是每个节点都焊了一个 120 欧姆电阻。结果总线上挂了五六个节点,并联下来等效电阻只有二十几欧姆,收发器驱动能力不够,波形幅度直接掉下来,通信距离大幅缩短。正确的做法是只在总线两端各接一个,中间节点不接。

还有一种情况是节点数量少、距离短,比如两个开发板在桌面上通信,有人觉得不接终端电阻也能跑。短距离低速确实可能跑通,但波形已经有反射了,只是裕量够大没出错。一旦换到实际现场,线缆加长、干扰增加,问题就暴露了。所以调试阶段就养成正确接终端电阻的习惯。

用万用表测总线电阻是个快速判断方法:断电情况下,测 CAN_H 和 CAN_L 之间的电阻,正常应该是 60 欧姆左右,也就是两个 120 欧姆并联。如果测出来是 120 欧姆,说明只接了一个;如果是 40 欧姆,说明接了三个;如果是无穷大,说明一个都没接。

4.3 隔离与保护电路的设计经验

工业现场和汽车环境里,地电位差和浪涌是 CAN 总线的两大杀手。地电位差会导致共模电压超出收发器的共模范围,轻则通信错误,重则烧收发器。浪涌则可能来自电机启停、继电器动作或雷击感应。

隔离方案分两种:光耦隔离和数字隔离器。光耦便宜但速度慢、功耗大、寿命有限。数字隔离器像 ADuM1201 这类,速度快、体积小、可靠性高,现在用得越来越多。隔离的话,收发器的总线侧和控制器侧要用独立的电源,通常用隔离 DC-DC 模块或者变压器加 LDO 来供电。

保护电路方面,总线入口处可以加共模电感抑制共模干扰,加 TVS 管钳位浪涌电压。TVS 要选响应速度快、结电容小的型号,否则会影响信号边沿。还有一点容易被忽略:CAN_H 和 CAN_L 对地也要加保护,防止单线对地短路。

5. 软件配置与报文收发的实战细节

5.1 CAN 控制器的初始化流程

以 STM32 的 bxCAN 为例,初始化流程大致是:使能 CAN 时钟和 GPIO 时钟,配置 GPIO 为复用推挽输出,配置 CAN 工作模式、位时序、滤波器,然后使能 CAN。

关键步骤是进入初始化模式。bxCAN 上电后处于睡眠模式,要先请求进入初始化模式,等硬件确认后才能写位时序寄存器。位时序配好后,再请求进入正常模式。这个顺序不能乱,否则寄存器写不进去。

滤波器配置是另一个重点。STM32 的 CAN 滤波器有标识符屏蔽模式和标识符列表模式两种。屏蔽模式是“ID 加掩码”,掩码位为 1 表示该位必须匹配,为 0 表示不关心。列表模式则是精确匹配几个 ID。实际项目里,如果只需要接收少数几个 ID,用列表模式简单;如果要接收一组连续 ID,用屏蔽模式更灵活。

5.2 发送报文的优先级与邮箱机制

CAN 控制器通常有多个发送邮箱,比如 STM32 有三个。发送时把报文写入空邮箱,置位发送请求,硬件就会在总线空闲时按 ID 优先级仲裁发送。如果多个邮箱都有待发报文,ID 数值小的先发。

这里有个容易踩的坑:邮箱满的时候再写会失败。所以发送前要检查邮箱是否为空,或者用中断方式,在发送完成中断里填充下一个报文。轮询方式简单但效率低,高负载场景下容易丢帧。中断方式复杂一点,但能保证不丢。

还有一个细节是自动重传。CAN 控制器默认开启自动重传,发送失败会一直重试直到成功。但在某些场景下,比如报文已经过时了,一直重传反而占用总线。这时候可以关闭自动重传,发送失败就丢弃,由上层决定是否重新构造报文。

5.3 接收过滤与中断处理的最佳实践

接收方面,FIFO 机制很关键。STM32 有两个接收 FIFO,每个能存三帧。如果 FIFO 满了还有新报文进来,就会溢出,旧报文可能被覆盖。所以中断服务函数要尽量短,尽快把报文读走。

我的做法是在中断里只做两件事:读报文存到环形缓冲区,清中断标志。报文的解析和处理放到主循环里做。这样中断响应快,不会因为处理逻辑复杂而阻塞其他中断。

过滤器配置要尽量精确,不要把总线上所有报文都收进来。总线负载高的时候,收一堆无关报文会浪费 CPU 和内存。根据实际需要的 ID 范围配置过滤器,能大幅降低软件负担。

6. 调试工具与故障排查的完整链路

6.1 从物理层开始排查:示波器与万用表

CAN 通信出问题,排查顺序一定是从物理层往上。第一步用万用表测总线电阻,确认终端电阻正确。第二步用示波器看波形,确认差分信号幅度、边沿质量、有没有明显反射或干扰。

正常 CAN 波形,显性电平差分电压在 1.5V 到 3V 之间,隐性电平接近 0V。如果显性电平幅度不够,可能是终端电阻不对或者收发器驱动能力不足。如果波形上有振铃,说明阻抗不匹配或者线缆太长。如果波形毛刺很多,说明干扰大,需要加共模电感或屏蔽线。

示波器还能用来测波特率。找一个报文,量它一个位的宽度,取倒数就是波特率。比如量出来 2 微秒,那就是 500kbps。这个方法在不知道对方波特率的时候特别有用。

6.2 用 CAN 分析仪抓包定位协议层问题

物理层没问题,就上 CAN 分析仪。常见的工具有周立功的 USBCAN、Peak 的 PCAN、开源的 CANable 等。分析仪能显示总线上所有报文,包括 ID、数据、时间戳、错误帧。

抓包时重点看几个东西:有没有错误帧,错误帧多不多;报文周期是否稳定;有没有节点一直发不出数据。如果看到大量错误帧,结合错误计数器的值能判断是发送错误还是接收错误。错误计数器超过 127 进入错误被动状态,超过 255 进入总线关闭状态。

我遇到过一个案例:总线上有个节点偶尔发错误帧,其他节点通信正常。用分析仪抓包发现,错误帧总是在某个特定 ID 的报文之后出现。后来查出来是那个节点的波特率配置有微小偏差,大部分时候能同步,偶尔同步失败就报错。把它的位时序参数重新算了一遍,问题解决。

6.3 常见通信故障的排查清单

下面这张表是我这些年攒下来的 CAN 故障排查清单,按出现频率排序,遇到问题可以逐条对照。

故障现象可能原因排查方法
完全无通信终端电阻缺失或过多、收发器损坏、电源未接万用表测电阻、示波器看波形、检查供电
偶发错误帧采样点设置不当、晶振精度不够、干扰大调整位时序、换外部晶振、加屏蔽和滤波
通信距离短波特率过高、线缆阻抗不匹配、终端电阻不对降波特率、换双绞线、检查终端电阻
某个节点收不到过滤器配置错误、ID 不匹配、节点未初始化检查过滤器、用分析仪确认报文在总线上
总线关闭错误计数器溢出、硬件故障读错误计数器、检查收发器和线缆
数据偶尔出错CRC 校验失败、位填充错误抓包看错误类型、检查信号完整性

排查时记住一个原则:先确认物理层,再查协议层,最后看应用层。很多问题看起来是软件 bug,实际是硬件没弄好。

7. 从经典 CAN 到 CAN FD 的升级考量

7.1 CAN FD 解决了哪些实际问题

经典 CAN 最大的瓶颈是速率和载荷。1Mbps 的速率在现在来看不算快,8 字节的数据段对于诊断和标定来说也偏小。CAN FD 把数据段速率提升到最高 8Mbps,数据长度扩展到 64 字节,同时保持仲裁段与经典 CAN 兼容。

这意味着什么?刷写 ECU 固件时,经典 CAN 可能要几十分钟,CAN FD 能缩短到几分钟。传输大块标定数据时,64 字节的载荷减少了帧数量,总线负载大幅下降。而且 CAN FD 改进了 CRC 校验,用更长的多项式,检错能力更强。

7.2 升级 CAN FD 需要改动的硬件与软件

硬件上,经典 CAN 收发器大多不支持 CAN FD 的高速数据段。虽然仲裁段速率一样,但数据段速率上去后,收发器的环路延迟和压摆率就成了瓶颈。所以升级 CAN FD 通常要换收发器,比如 TJA1044、TJA1057 这类支持 FD 的型号。

软件上,CAN 控制器要支持 FD 模式。STM32 的 FDCAN 外设支持 CAN FD,但老的 bxCAN 不支持。配置时要注意仲裁段位时序和数据段位时序是分开设置的,数据段的采样点也要单独算。还有一点,CAN FD 帧格式跟经典 CAN 不同,FDF 位和 BRS 位用来标识 FD 帧和速率切换,分析仪也要支持 FD 才能正确解析。

7.3 经典 CAN 与 CAN FD 的共存策略

实际项目里,不可能一夜之间把所有节点都换成 CAN FD。常见的做法是网关方案:CAN FD 节点和经典 CAN 节点分别挂在不同的总线段上,用一个网关设备做协议转换。网关收到经典 CAN 报文后,打包成 CAN FD 转发到高速段;反过来也一样。

这种方案的好处是保护现有投资,逐步升级。缺点是网关增加了延迟和成本,而且网关本身可能成为瓶颈。所以设计时要评估总线负载,确保网关的处理能力跟得上。

8. 嵌入式面试中 CAN 相关的高频问题

8.1 协议原理类问题的回答思路

面试官问 CAN 协议,通常从帧结构开始。回答时不要只背字段,要讲清楚每个字段的作用和设计意图。比如问“为什么 CAN 用非破坏性仲裁”,你要能说出:因为显性电平覆盖隐性电平,ID 小的节点在仲裁中胜出,同时不影响总线上其他节点的数据,仲裁失败节点自动转为接收并在下一轮重发,这样既保证了优先级又不浪费带宽。

问到位时序,要能画出四个段,解释采样点为什么设在 75% 左右,传播段和相位缓冲段各自补偿什么延迟。如果能结合实际调试经验,比如“我遇到过采样点设置不当导致长线通信偶发错误,后来把 TSEG1 调大解决了”,面试官会明显加分。

8.2 硬件设计类问题的考察重点

硬件方面常问终端电阻的作用和接法。标准答案是:匹配线缆特性阻抗,消除信号反射,接在总线两端各一个 120 欧姆。但光答这个不够,最好补充“如果节点多、距离短,不接也能跑,但裕量小,实际项目建议规范接”。

还可能问收发器选型,这时候要能说出 3.3V 和 5V 收发器的区别、隔离收发器的应用场景、共模电感和 TVS 的作用。如果面试的是汽车电子岗位,还会问 CAN 总线的唤醒机制、网络管理这些。

8.3 调试与故障排查类问题的实战回答

这类问题最能区分候选人的实际经验。比如“CAN 通信时好时坏,你怎么排查”,按物理层到协议层的顺序答:先测终端电阻,再看波形,然后用分析仪抓包看错误帧,最后查软件配置。每一步都要说清楚用什么工具、看什么指标、怎么判断。

如果问“总线关闭怎么恢复”,要答出:读错误计数器确认状态,排查硬件故障,然后通过软件重新初始化 CAN 控制器。有些控制器支持自动恢复,有些需要手动清除初始化请求位。能答到这一层,说明是真做过项目的。

9. 个人实操心得与避坑建议

9.1 调试阶段一定要留测试点

我在画 CAN 相关板子的时候,一定会把 CAN_H、CAN_L 和地引到测试点上,最好再用丝印标清楚。调试的时候直接夹探头,不用在密集的引脚上找。这个习惯帮我省了大量时间,尤其是板子已经装进外壳、不好拆的时候。

测试点旁边还可以预留终端电阻的焊盘,用跳线帽或者 0 欧姆电阻选择是否接入。这样一块板子既能当中间节点,也能当末端节点,灵活很多。

9.2 波特率不是越高越好

新手容易觉得波特率越高越厉害,实际项目里要综合考虑。波特率越高,对线缆质量、终端电阻、节点数量越敏感。500kbps 在大多数工业场景够用,1Mbps 对线缆和拓扑要求就高了。如果通信数据量不大,用 250kbps 甚至 125kbps 反而更稳。

我做过一个电梯控制项目,最初用 500kbps,现场干扰大,偶发错误。降到 250kbps 后,错误率直接归零。所以波特率选择要匹配实际需求,别盲目追高。

9.3 软件上要做好错误处理和状态监控

CAN 控制器有错误计数器,软件要定期读出来监控。如果发送错误计数器持续增长,说明总线或对方节点有问题,要报警或降级处理。总线关闭后要有恢复机制,不能一关了之。

还有一点,报文接收要做好超时判断。如果某个节点应该周期性发数据,但超过预期时间没收到,要能检测到并采取动作。这在安全相关的系统里尤其重要。

9.4 文档和协议表要随代码一起维护

CAN 通信的核心是 ID 和数据含义的约定。项目里一定要有一份协议表,写清楚每个 ID 的发送节点、周期、数据格式、字节序。这份表要跟代码一起版本管理,改了就更新。我见过太多项目,代码改了好几版,协议表还是最初的,新来的人对着代码猜数据含义,效率极低。

协议表里还可以记录每个报文的物理量换算公式,比如“字节 0-1 表示转速,单位 0.1rpm,大端序”。这样上层应用开发不用去翻底层代码,直接查表就行。

CAN 总线看着简单,两根线而已,但要把稳定性做到位,物理层、协议层、软件层每一层都有讲究。我这些年踩过的坑,大部分不是协议不懂,而是细节没做到位。终端电阻少接一个、采样点偏了几个百分点、滤波器配宽了,都可能让项目卡住好几天。希望这篇内容能帮你把这些细节提前想到,少走些弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询