/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
tags: [学习, 嵌入式, CAN, 排查手册, 速查表, 决策树, 位定时, 帧格式, 错误计数器, 高层协议, 功能安全, 全系列回顾, 总对照表] created: 2026-10-08 updated: 2026-10-08 status: 专题进行中 所属专题: “[[00-CAN技术系列总目录]]” 对应模块: 14 排查手册与速查表
14 · CAN 排查手册与速查表(CAN 收官)
本篇定位:CAN 系列收官篇。故障决策树 + 全系列速查表 + 功能安全审查清单 + 全系列要点回顾 + 总对照表。遇到 CAN 问题,翻这一篇。读完你有一本 CAN 工程师速查手册。
[!important] 这是 CAN 工程师的"急救手册" SPI 14 是 SPI 收官速查。CAN 14 是 CAN 收官速查——故障决策树(从现象到根因)+ 19 故障速查 + 位定时/帧格式/错误计数器/高层协议/AEGIX 功能安全清单 + 全系列 01-14 回顾 + CAN vs UART vs I2C vs SPI 总对照表。打印贴墙,排查不慌。对照 [[14-SPI排查手册与速查表]] 看,四总线速查手册齐了。
目录
故障决策树
常见故障速查表
位定时速查
帧格式速查
错误计数器与状态速查
高层协议速查
AEGIX 功能安全审查清单
全系列要点回顾
学习路径
CAN vs UART vs I2C vs SPI 总对照表
一、故障决策树
1.1 A 类:完全不通
CAN 完全不通
├─ A1 物理层
│ ├─ A1.1 终端电阻? → 万用表测 CAN_H-CAN_L = 60Ω?
│ │ ├─ 否 → 加/修终端(双端120Ω)
│ │ └─ 是 → 继续
│ ├─ A1.2 收发器? → 示波器看 CAN_H/CAN_L 波形?
│ │ ├─ 无波形 → 收发器供电/坏 → 换
│ │ └─ 有波形 → 继续
│ └─ A1.3 接线? → CAN_H/CAN_L 接反? 交叉?
│ └─ 修正接线
├─ A2 配置层
│ ├─ A2.1 时钟? → CAN 时钟开? 引脚复用?
│ │ └─ 开时钟 + 配引脚
│ ├─ A2.2 位定时? → 波特率全网一致? 采样点87.5%?
│ │ └─ 统一位定时
│ └─ A2.3 过滤器? → 过滤器配错(全屏蔽)?
│ └─ 修正过滤器
└─ A3 软件层
├─ A3.1 驱动初始化? → dmesg 看错误?
│ └─ 查初始化代码
└─ A3.2 can0 up? → ip link show can0?
└─ ip link set can0 up
1.2 B 类:偶发错
CAN 偶发错
├─ B1 信号完整性层
│ ├─ B1.1 终端? → 示波器看振铃?
│ │ └─ 双端终端 + 分裂终端
│ ├─ B1.2 EMI? → 附近干扰源(电机/开关电源)?
│ │ └─ 共模扼流圈 + TVS + 远离
│ └─ B1.3 stub? → stub 太长?
│ └─ 缩短 stub(1M<0.3m)
├─ B2 软件层
│ ├─ B2.1 FIFO 溢出? → 接收丢帧?
│ │ └─ 提高优先级/DMA/加深FIFO
│ └─ B2.2 负载高? → canbusload > 80%?
│ └─ 优化ID/限频/CAN FD
└─ B3 时钟层
├─ B3.1 采样点? → 全网87.5%?
│ └─ 统一
├─ B3.2 SJW? → 长帧错?
│ └─ SJW=2
└─ B3.3 晶振? → RC振荡器? 温漂?
└─ 换±50ppm晶振
1.3 C 类:错误状态
CAN 错误状态
├─ C1 总线关闭(BUS-OFF)
│ ├─ C1.1 波特率错? → 和全网不一致?
│ │ └─ 统一波特率
│ ├─ C1.2 收发器坏? → 换
│ ├─ C1.3 EMI 严重? → 抗扰
│ └─ C1.4 恢复? → ABOM + 次数限制 + 安全状态
├─ C2 错误被动(ERROR-PASSIVE)
│ ├─ C2.1 位定时? → 采样点?
│ ├─ C2.2 EMI? → 抗扰
│ └─ C2.3 目标节点? → ACK 错?
└─ C3 ACK 错误
├─ C3.1 单节点? → Loopback 测试
├─ C3.2 目标故障? → 查目标节点
└─ C3.3 波特率? → 统一
1.4 D 类:数据错
CAN 数据错
├─ D1 ID 解析错
│ ├─ D1.1 标准/扩展? → IDE 位识别
│ └─ D1.2 字节序? → MSB 先
├─ D2 长度错
│ ├─ D2.1 DLC>8? → 经典CAN视为8
│ └─ D2.2 FD DLC? → 9-15映射12/16/…/64
└─ D3 高层协议错
├─ D3.1 J1939? → PGN解析+SPN换算
├─ D3.2 UDS? → NRC分析
└─ D3.3 ISO-TP? → 分包重组
1.5 E 类:Linux 框架
Linux CAN 问题
├─ E1 can0 不 up
│ ├─ E1.1 设备树? → CAN节点配置?
│ ├─ E1.2 驱动? → dmesg 看加载?
│ └─ E1.3 时钟/引脚? → 设备树时钟
├─ E2 candump 无输出
│ ├─ E2.1 can0 down? → ip link set up
│ ├─ E2.2 物理层? → 终端/收发器
│ └─ E2.3 过滤器? → setsockopt
└─ E3 错误帧
├─ E3.1 ERR_FILTER? → 使能错误帧接收
└─ E3.2 状态? → ip -s 看统计
二、常见故障速查表
#故障现象原因解决
| 1 |
完全不通 |
candump 无帧 |
终端缺/收发器/位定时 |
万用表+示波器 |
| 2 |
终端缺 |
振铃,偶发错 |
单端/无终端 |
双端120Ω |
| 3 |
多终端 |
驱动不足 |
每节点都加 |
只两端加 |
| 4 |
波特率错 |
总线关闭 |
和全网不一致 |
统一波特率 |
| 5 |
采样点错 |
CRC 错 |
不一致 |
统一87.5% |
| 6 |
时钟偏差大 |
长帧错 |
RC/温漂 |
换晶振±50ppm |
| 7 |
SJW 小 |
长帧偶发错 |
补偿不足 |
SJW=2 |
| 8 |
ACK 错 |
单节点/目标故障 |
无应答 |
Loopback/查目标 |
| 9 |
CRC 错 |
错误帧 |
采样点/EMI |
统一+抗扰 |
| 10 |
位填充错 |
EMI |
位翻转 |
抗扰 |
| 11 |
格式错 |
EOF干扰 |
EMI |
抗扰 |
| 12 |
总线关闭 |
TEC≥128 |
持续错 |
查根因+ABOM |
| 13 |
错误被动 |
TEC/REC≥96 |
偶发错 |
排查 |
| 14 |
FIFO 溢出 |
丢帧 |
CPU慢 |
DMA/高优先级 |
| 15 |
负载高 |
偶发错 |
帧太多 |
优化/限频/FD |
| 16 |
stub 长 |
高速错 |
反射 |
缩短(1M<0.3m) |
| 17 |
FD 收发器慢 |
数据段CRC错 |
tr长 |
换FD收发器 |
| 18 |
过滤器错 |
收不到/收到多余 |
配置错 |
核对ID/MASK |
| 19 |
节点数多 |
边沿缓 |
电容大 |
降速/分段 |
三、位定时速查
3.1 位定时常用配置(f_CAN=48MHz)
速率BRPNBTTSEG1TSEG2SJWSP
| 1M |
3 |
16 |
13 |
2 |
2 |
87.5% |
| 500k |
6 |
16 |
13 |
2 |
2 |
87.5% |
| 250k |
12 |
16 |
13 |
2 |
2 |
87.5% |
| 125k |
24 |
16 |
13 |
2 |
2 |
87.5% |
| 50k |
60 |
16 |
13 |
2 |
2 |
87.5% |
3.2 CAN FD 双位定时(f_CAN=80MHz)
段速率BRPNBTTSEG1TSEG2SJWSP
| 仲裁段(NBTP) |
1M |
5 |
16 |
13 |
2 |
2 |
87.5% |
| 数据段(DBTP) |
5M |
2 |
8 |
5 |
2 |
1 |
75% |
| 数据段(DBTP) |
8M |
1 |
10 |
7 |
2 |
1 |
80% |
3.3 BTR 配置公式
1. NBT = f_CAN / (BRP × bit_rate), 选 BRP 让 NBT=16
2. TSEG1 = NBT × SP – 1 = 16 × 0.875 – 1 = 13
3. TSEG2 = NBT – 1 – TSEG1 = 16 – 1 – 13 = 2
4. SJW = 2(通常,1~4)
5. BTR = (SJW-1)<<24 | (TSEG2-1)<<16 | (TSEG1-1)<<8 | (BRP-1)
3.4 速率-距离-约束速查
速率总线长stub节点电容
| 1M |
40m |
0.3m |
30 |
100pF |
| 500k |
100m |
0.6m |
30 |
100pF |
| 250k |
250m |
1.2m |
30 |
200pF |
| 125k |
500m |
2.4m |
30 |
500pF |
| 50k |
1km |
6m |
30 |
1nF |
| FD 5M |
<10m |
0.15m |
<10 |
100pF |
四、帧格式速查
4.1 数据帧(标准帧 8 字节)
段位数内容
| SOF |
1 |
显性(帧起始) |
| ID |
11 |
标识符(优先级) |
| RTR |
1 |
0=数据,1=远程 |
| IDE |
1 |
0=标准,1=扩展 |
| r0 |
1 |
保留 |
| DLC |
4 |
数据长度(0~8经典) |
| 数据 |
0~64 |
数据 |
| CRC |
15/17/21 |
校验 |
| CRC DEL |
1 |
隐性 |
| ACK |
1 |
显性(接收方) |
| ACK DEL |
1 |
隐性 |
| EOF |
7 |
隐性 |
| IFS |
3 |
隐性 |
4.2 帧类型速查
帧RTRIDE数据用途
| 标准数据 |
0 |
0 |
0~8B |
主用 |
| 标准远程 |
1 |
0 |
无 |
请求 |
| 扩展数据 |
0 |
1 |
0~8B |
J1939 |
| 扩展远程 |
1 |
1 |
无 |
请求 |
| FD 数据 |
0 |
EDL=1 |
0~64B |
高速大块 |
| 错误帧 |
– |
– |
6显性/隐性+8隐性 |
报错 |
| 过载帧 |
– |
– |
6显性+7隐性 |
流控 |
4.3 CAN FD 新增位
位含义
| EDL |
FD帧标识(替代经典r0) |
| BRS |
切速(1=数据段高速) |
| ESI |
错误状态(1=被动错误) |
4.4 DLC 映射(CAN FD)
DLC经典FD
| 0-8 |
0-8B |
0-8B |
| 9 |
– |
12B |
| 10 |
– |
16B |
| 11 |
– |
20B |
| 12 |
– |
24B |
| 13 |
– |
32B |
| 14 |
– |
48B |
| 15 |
– |
64B |
五、错误计数器与状态速查
5.1 错误计数规则
事件TEC/REC 变化
| 发送错 |
TEC +8 |
| 发送成功 |
TEC -1 |
| 接收错 |
REC +8 |
| 接收成功 |
REC -1 |
| 主动错误标志期间检测显性 |
+1 |
5.2 状态转移
状态TEC/REC错误标志
| 主动错误 |
<96 |
6显性(破坏) |
| 错误警告 |
≥96 |
– |
| 被动错误 |
96~127 |
6隐性(不破坏) |
| 总线关闭 |
TEC≥128 |
不通信 |
5.3 恢复
恢复机制
| 主动→被动回主动 |
TEC/REC<96 |
| 总线关闭→主动 |
128×11=1408隐性(自动)/ 软件 |
5.4 错误码(LEC)
LEC错误
| 0 |
无错 |
| 1 |
位填充错 |
| 2 |
格式错 |
| 3 |
ACK 错 |
| 4 |
位1错(隐性位发显性读) |
| 5 |
位0错(显性位发隐性读) |
| 6 |
CRC 错 |
六、高层协议速查
6.1 CANopen ID 速查
对象ID用途
| NMT |
0x000 |
网络管理 |
| 紧急 |
0x080 |
紧急报文 |
| PDO |
0x181~0x57F |
过程数据(实时) |
| SDO |
0x581~0x67F |
服务数据(配置) |
| 心跳 |
0x700+ |
节点心跳 |
6.2 J1939 29bit ID 编码
优先级(3) | 保留(1) | 数据页(1) | PF(8) | PS(8) | 源地址(8)
PGN参数
| 61444 |
EEC1 发动机(转速0.125rpm/bit) |
| 65262 |
发动机温度(水温) |
| 65263 |
发动机仪表(油压) |
| 59904 |
请求 |
| 60416 |
应答 |
6.3 UDS 服务速查
SID服务请求正响应
| 0x10 |
会话控制 |
10 03 |
50 03 |
| 0x11 |
ECU 复位 |
11 01 |
51 01 |
| 0x22 |
读数据 |
22 F1 90 |
62 F1 90 data |
| 0x27 |
安全访问 |
27 01/02 key |
67 01 seed/67 02 |
| 0x2E |
写数据 |
2E F1 90 data |
6E F1 90 |
| 0x31 |
例程控制 |
31 01 FF 00 |
71 01 FF 00 |
| 0x34 |
请求下载 |
34 |
74 |
| 0x36 |
传输数据 |
36 |
76 |
| 0x37 |
退出传输 |
37 |
77 |
| 0x3E |
保活 |
3E 00 |
7E 00 |
6.4 UDS NRC(否定响应码)
NRC含义
| 0x13 |
格式错 |
| 0x22 |
条件不满足 |
| 0x24 |
请求序列错 |
| 0x31 |
超范围 |
| 0x33 |
安全拒绝(未解锁) |
| 0x78 |
响应待定(忙) |
| 0x7E |
子功能不支持 |
| 0x7F |
服务不支持 |
6.5 ISO-TP 帧速查
类型PCI用途
| SF |
0x0N |
≤7B 单帧 |
| FF |
0x1x |
多帧首帧(总长+6B) |
| CF |
0x2x |
续帧(序号+7B) |
| FC |
0x3x |
流控(FS/BS/STmin) |
6.6 诊断 ID 速查
ID用途
| 0x7DF |
广播诊断请求 |
| 0x7E0~0x7E7 |
ECU 请求 |
| 0x7E8~0x7EF |
ECU 响应 |
七、AEGIX 功能安全审查清单
7.1 物理层
- 双端 120Ω 终端(万用表测 60Ω)
- 双绞线(CAN_H/CAN_L)
- 共模扼流圈(汽车级)
- TVS 保护(ESD/EFT)
- 分裂终端(60Ω+60Ω+4.7nF,可选)
- 收发器汽车级(AEC-Q100)
- stub 长度合规(1M<0.3m)
- 节点数合规(<30)
- 完整地平面
7.2 协议层
- 位定时全网一致(BRP/TSEG1/TSEG2/SJW)
- 采样点 87.5%(主流)
- 晶振 ±50ppm(禁 RC)
- CAN FD 双位定时(NBTP+DBTP)
- 帧格式正确(SOF/ID/CRC/ACK/EOF)
- ID 分配合理(优先级)
7.3 传输层
- 错误中断处理(BOFF/EPVF/EWGF/LEC)
- 错误计数器监控(TEC/REC)
- 总线关闭恢复(ABOM + 次数限制)
- 恢复超限进安全状态
- 恢复后应用层重新同步
- 自动重发策略(NART 或软件超时)
- FIFO 溢出处理(覆盖/锁定)
7.4 数据层
- E2E 保护(CRC + 序列号 + 存活计数)
- 关键消息超时监控
- 关键控制回读校验
- 数据校验(端到端 CRC)
7.5 系统层
- 双通道冗余(ASIL D,关键消息双发)
- 安全状态(故障不执行危险动作)
- 看门狗(任务存活监控)
- 错误日志(可追溯)
- 故障注入测试
7.6 软件层
- ISR 最小化(只读推队列)
- RTOS 集成(消息队列/信号量/互斥锁)
- 互斥锁保护(多任务共享)
- 缓冲对齐(DMA/Cache)
- 驱动分层(应用→驱动→硬件)
八、全系列要点回顾
8.1 L1 硬件基础层(01-03)
- 01 物理层:差分信号(CAN_H/CAN_L),显性2V/隐性0V,线与,ISO 11898-2高速/-3低速/FD,收发器,120Ω双端终端,NRZ+位填充,CAN FD(5M/64B)
- 02 信号完整性:直线总线拓扑,stub长度(1M<0.3m),节点数30,总线电容<100pF,双端终端抑制反射,分裂终端抗EMI,共模扼流圈,FD 5M SI严,汽车EMI/EMS AEC-Q100
- 03 位定时同步:位时间四段(SYNC_SEG+TSEG1+TSEG2),采样点87.5%,硬同步(SOF)+重同步(帧中跳变),SJW 1~2Tq,时钟容差0.1-0.5%选±50ppm晶振,BTR配置,CAN FD双位定时(NBTP+DBTP)
8.2 L2 协议时序层(04-07)
- 04 帧格式:四种帧(数据/远程/错误/过载),数据帧七段(SOF+仲裁+控制+数据+CRC+ACK+EOF+IFS),仲裁段(ID+RTR+IDE),DLC,CRC15/17/21,ACK机制,标准11bit/扩展29bit,CAN FD(BRS/ESI/EDL)
- 05 仲裁优先级:CSMA/CD+AMP,线与(显性覆盖隐性),逐位仲裁(ID高位比较,发隐性读显性=输),ID越小优先级越高,仲裁无冲突(输的转接收),同ID数据帧>远程帧/标准帧>扩展帧,优先级设计,饿死问题,CAN FD仲裁段1M数据段不仲裁
- 06 错误处理:五种错误检测(位监控/位填充/CRC/格式/ACK),错误帧(主动6显性/被动6隐性+8隐性),错误计数器(TEC/REC,错+8成功-1),节点状态(主动<96/被动96-127/总线关闭≥128),自动重发,总线关闭恢复(1408隐性/软件)
- 07 高层协议:CANopen(对象字典+PDO+SDO+心跳),J1939(29bit ID编码PGN),UDS(诊断服务0x10/0x22/0x2E/0x27刷写),ISO-TP(SF/FF/CF/FC大报文分包),CAN FD适配(64B单帧)
8.3 L3 驱动实现层(08-11)
- 08 控制器寄存器:Bosch C_CAN/M_CAN IP,STM32 bxCAN/FDCAN寄存器(MCR/MSR/BTR/ESR/邮箱/FIFO/过滤器),发送邮箱3个,接收FIFO 2×3级,验收过滤器(列表/屏蔽),RISC-V N300 M_CAN(同FDCAN改基址)
- 09 传输模式:轮询(调试)/中断(主流)/DMA(FD大块),发送邮箱队列(3邮箱+软件队列),接收FIFO处理(覆盖/锁定),RTOS集成(消息队列+信号量+互斥锁),ISR最小化
- 10 错误恢复:错误计数器监控,状态转移处理,总线关闭恢复(ABOM/软件/混合),功能安全端到端保护(协议层CRC/ACK+应用层E2E+序列号+超时+回读+冗余+安全状态+看门狗),AEGIX CAN容错(双通道冗余+恢复次数限制)
- 11 Linux框架:SocketCAN(CAN当网络接口),PF_CAN协议族(RAW/BCM/ISO-TP/J1939),can-dev框架(c_can/m_can),设备树(bit-timing+can-fd),用户态socket API,can-utils(candump/cansend),ISO-TP/J1939内置
8.4 L4 应用实战层(12-14)
- 12 设备实战:裸机收发驱动,验收过滤器配置,环回测试,CANopen节点(对象字典/PDO/SDO/心跳),J1939解析(PGN/SPN),UDS诊断(0x10/0x22/0x27/0x2E),ISO-TP多帧(SF/FF/CF/FC),多CAN通道+RTOS,双通道冗余
- 13 调试排查:工具链分层(candump/逻辑分析仪/示波器/万用表/dmesg),candump抓包,逻辑分析仪差分解码,示波器看差分波形,万用表测终端60Ω,错误帧分析,位定时/终端问题排查,典型故障定位,降速调试法
- 14 排查手册:故障决策树(5大类),19故障速查,位定时/帧格式/错误计数器/高层协议速查,AEGIX功能安全审查清单(6层),全系列回顾,学习路径,四总线总对照表
九、学习路径
9.1 五阶段路径
阶段目标文章
| 入门 |
理解 CAN 是什么 |
01 → 04 → 05 |
| 硬件 |
会设计 CAN 硬件 |
02 → 03 → 06 |
| 驱动 |
会写裸机驱动 |
08 → 09 → 10 |
| 系统 |
会 Linux CAN |
11 → 12 |
| 专家 |
会调试 + 功能安全 |
07 → 13 → 14 |
9.2 对照学习法
- CAN vs SPI:差分 vs 单端,多主 vs 单主,有ACK vs 无ACK
- CAN vs I2C:差分 vs 开漏,优先级仲裁 vs 都退,汽车级 vs 板级
- CAN vs UART:总线 vs 点对点,同步 vs 异步,多主 vs 单主单从
9.3 实战建议
- 先用 candump/cansend 在 Linux 上玩(直观)
- 用逻辑分析仪看波形(理解物理层)
- 写裸机驱动(理解寄存器)
- 实现 UDS/ISO-TP(汽车实战)
- 做功能安全设计(AEGIX 级)
十、CAN vs UART vs I2C vs SPI 总对照表
10.1 物理层
维度UARTI2CSPICAN
| 线数 |
2(TX/RX) |
2(SDA/SCL) |
3+(SCK/MOSI/MISO/CS) |
2(CAN_H/L) |
| 电气 |
单端 |
开漏+上拉 |
单端/推挽 |
差分 |
| 电平 |
TTL/RS232 |
上拉到VCC |
TTL |
差分2V/0V |
| 同步 |
异步 |
同步(SCL) |
同步(SCK) |
同步(位填充) |
| 拓扑 |
点对点 |
总线 |
主从星型/总线 |
直线总线 |
| 终端 |
无 |
上拉 |
无 |
120Ω双端 |
| 速度 |
≤3M |
≤3.4M(高速) |
≤50M+ |
≤1M(经典)/8M(FD) |
| 距离 |
RS232 15m |
板级 |
板级 |
1M=40m,125k=500m |
| 抗扰 |
弱(单端) |
弱(开漏) |
弱(单端) |
强(差分) |
10.2 协议层
维度UARTI2CSPICAN
| 帧 |
START+数据+STOP |
START+地址+ACK+数据+STOP |
CS+时钟+数据 |
SOF+ID+控制+数据+CRC+ACK+EOF |
| 寻址 |
无(点对点) |
7/10bit地址 |
CS硬件选 |
ID(11/29bit) |
| 双工 |
全双工 |
半双工 |
全双工 |
半双工 |
| 应答 |
无 |
ACK/NACK |
无 |
ACK(多节点) |
| 多主 |
否 |
是(仲裁都退) |
否 |
是(优先级仲裁) |
| 仲裁 |
无 |
线与都退 |
无(单主) |
CSMA/CD+AMP优先级 |
| 错误检测 |
奇偶(可选) |
ACK/NACK |
无 |
5种(位监控/填充/CRC/格式/ACK) |
| 错误恢复 |
无 |
重试 |
无 |
错误帧+自动重发+总线关闭 |
| 流控 |
硬件/软件 |
无 |
无 |
过载帧(少用) |
| 数据长度 |
帧8/9bit |
任意(每帧8bit) |
任意 |
0-8经典/0-64 FD |
10.3 应用场景
场景总线原因
| 调试串口 |
UART |
简单点对点 |
| GPS/蓝牙模块 |
UART |
点对点 |
| 传感器(温湿度) |
I2C |
低速板级多设备 |
| EEPROM |
I2C |
板级存储 |
| OLED/Flash |
SPI |
高速 |
| ADC/DAC |
SPI |
高速 |
| 汽车ECU通信 |
CAN |
汽车级可靠+多主 |
| 工业自动化 |
CAN/CANopen |
可靠+实时 |
| 商用车 |
J1939(CAN) |
标准化 |
| 汽车诊断 |
UDS(CAN) |
诊断标准 |
10.4 调试
维度UARTI2CSPICAN
| 工具 |
串口工具 |
逻辑分析仪 |
逻辑分析仪+示波器 |
candump+逻辑分析仪+示波器+万用表 |
| 难度 |
低 |
中 |
中高 |
高 |
| 错误分析 |
简单 |
ACK/NACK |
无(软件) |
错误状态机(复杂) |
10.5 选型决策树
要传什么?
├─ 点对点调试/模块 → UART
├─ 板级多设备低速 → I2C
├─ 板级高速(Flash/OLED/ADC) → SPI
├─ 汽车/工业多主可靠 → CAN
│ ├─ 商用车 → J1939
│ ├─ 工业自动化 → CANopen
│ └─ 汽车诊断 → UDS
└─ 大数据高速 → CAN FD(64B/帧)
延伸阅读
CAN 全系列
- [[01-CAN物理层与差分电气]] / [[02-CAN信号完整性与拓扑]] / [[03-CAN位定时与同步]]
- [[04-CAN帧格式]] / [[05-CAN仲裁与优先级]] / [[06-CAN错误处理与错误帧]] / [[07-CAN高层协议]]
- [[08-CAN控制器寄存器与IP架构]] / [[09-CAN传输模式-轮询-中断-DMA]] / [[10-CAN错误恢复与总线关闭]] / [[11-CAN Linux驱动框架]]
- [[12-CAN设备驱动实战]] / [[13-CAN调试与排查]]
对照学习
- [[14-SPI排查手册与速查表]] —— SPI 收官 + 四总线对照
- [[14-I2C排查手册与速查表]] —— I2C 收官
- [[00-CAN技术系列总目录]] —— CAN 总目录
参考资料
- Bosch CAN Specification 2.0 / CAN FD
- ISO 11898-1(数据链路层)/ -2(物理层)
- CiA 301(CANopen)/ SAE J1939 / ISO 14229(UDS)/ ISO 15765(ISO-TP)
- ISO 26262 功能安全
- STM32 RM0090/RM0433
- Linux Documentation/networking/can.rst
[[00-CAN技术系列总目录]] · 上一篇:[[13-CAN调试与排查]] · CAN 系列完结
创建日期:2026-10-08
本篇定位:CAN 系列收官篇。故障决策树 + 全系列速查表 + 功能安全审查清单 + 全系列要点回顾 + 总对照表。遇到 CAN 问题,翻这一篇。读完你有一本 CAN 工程师速查手册。
这是 CAN 工程师的"急救手册" SPI 14 是 SPI 收官速查。CAN 14 是 CAN 收官速查——故障决策树(从现象到根因)+ 19 故障速查 + 位定时/帧格式/错误计数器/高层协议/AEGIX 功能安全清单 + 全系列 01-14 回顾 + CAN vs UART vs I2C vs SPI 总对照表。打印贴墙,排查不慌。对照 [[14-SPI排查手册与速查表]] 看,四总线速查手册齐了。
目录
-
- tags: [学习, 嵌入式, CAN, 排查手册, 速查表, 决策树, 位定时, 帧格式, 错误计数器, 高层协议, 功能安全, 全系列回顾, 总对照表] created: 2026-10-08 updated: 2026-10-08 status: 专题进行中 所属专题: "[[00-CAN技术系列总目录]]" 对应模块: 14 排查手册与速查表
- 14 · CAN 排查手册与速查表(CAN 收官)
-
- 目录
- 一、故障决策树
-
- 1.1 A 类:完全不通
- 1.2 B 类:偶发错
- 1.3 C 类:错误状态
- 1.4 D 类:数据错
- 1.5 E 类:Linux 框架
- 二、常见故障速查表
- 三、位定时速查
-
- 3.1 位定时常用配置(f_CAN=48MHz)
- 3.2 CAN FD 双位定时(f_CAN=80MHz)
- 3.3 BTR 配置公式
- 3.4 速率-距离-约束速查
- 四、帧格式速查
-
- 4.1 数据帧(标准帧 8 字节)
- 4.2 帧类型速查
- 4.3 CAN FD 新增位
- 4.4 DLC 映射(CAN FD)
- 五、错误计数器与状态速查
-
- 5.1 错误计数规则
- 5.2 状态转移
- 5.3 恢复
- 5.4 错误码(LEC)
- 六、高层协议速查
-
- 6.1 CANopen ID 速查
- 6.2 J1939 29bit ID 编码
- 6.3 UDS 服务速查
- 6.4 UDS NRC(否定响应码)
- 6.5 ISO-TP 帧速查
- 6.6 诊断 ID 速查
- 七、AEGIX 功能安全审查清单
-
- 7.1 物理层
- 7.2 协议层
- 7.3 传输层
- 7.4 数据层
- 7.5 系统层
- 7.6 软件层
- 八、全系列要点回顾
-
- 8.1 L1 硬件基础层(01-03)
- 8.2 L2 协议时序层(04-07)
- 8.3 L3 驱动实现层(08-11)
- 8.4 L4 应用实战层(12-14)
- 九、学习路径
-
- 9.1 五阶段路径
- 9.2 对照学习法
- 9.3 实战建议
- 十、CAN vs UART vs I2C vs SPI 总对照表
-
- 10.1 物理层
- 10.2 协议层
- 10.3 应用场景
- 10.4 调试
- 10.5 选型决策树
- 延伸阅读
-
- 参考资料
- 一、故障决策树
-
- 1.1 A 类:完全不通
- 1.2 B 类:偶发错
- 1.3 C 类:错误状态
- 1.4 D 类:数据错
- 1.5 E 类:Linux 框架
- 二、常见故障速查表
- 三、位定时速查
-
- 3.1 位定时常用配置(f_CAN=48MHz)
- 3.2 CAN FD 双位定时(f_CAN=80MHz)
- 3.3 BTR 配置公式
- 3.4 速率-距离-约束速查
- 四、帧格式速查
-
- 4.1 数据帧(标准帧 8 字节)
- 4.2 帧类型速查
- 4.3 CAN FD 新增位
- 4.4 DLC 映射(CAN FD)
- 五、错误计数器与状态速查
-
- 5.1 错误计数规则
- 5.2 状态转移
- 5.3 恢复
- 5.4 错误码(LEC)
- 六、高层协议速查
-
- 6.1 CANopen ID 速查
- 6.2 J1939 29bit ID 编码
- 6.3 UDS 服务速查
- 6.4 UDS NRC(否定响应码)
- 6.5 ISO-TP 帧速查
- 6.6 诊断 ID 速查
- 七、功能安全审查清单
-
- 7.1 物理层
- 7.2 协议层
- 7.3 传输层
- 7.4 数据层
- 7.5 系统层
- 7.6 软件层
- 八、全系列要点回顾
-
- 8.1 L1 硬件基础层(01-03)
- 8.2 L2 协议时序层(04-07)
- 8.3 L3 驱动实现层(08-11)
- 8.4 L4 应用实战层(12-14)
- 九、CAN vs UART vs I2C vs SPI 总对照表
-
- 9.1 物理层
- 9.2 协议层
- 9.3 应用场景
- 9.4 调试
- 9.5 选型决策树
- 延伸阅读
-
- 参考资料
一、故障决策树
1.1 A 类:完全不通
CAN 完全不通
├─ A1 物理层
│ ├─ A1.1 终端电阻? → 万用表测 CAN_H-CAN_L = 60Ω?
│ │ ├─ 否 → 加/修终端(双端120Ω)
│ │ └─ 是 → 继续
│ ├─ A1.2 收发器? → 示波器看 CAN_H/CAN_L 波形?
│ │ ├─ 无波形 → 收发器供电/坏 → 换
│ │ └─ 有波形 → 继续
│ └─ A1.3 接线? → CAN_H/CAN_L 接反? 交叉?
│ └─ 修正接线
├─ A2 配置层
│ ├─ A2.1 时钟? → CAN 时钟开? 引脚复用?
│ │ └─ 开时钟 + 配引脚
│ ├─ A2.2 位定时? → 波特率全网一致? 采样点87.5%?
│ │ └─ 统一位定时
│ └─ A2.3 过滤器? → 过滤器配错(全屏蔽)?
│ └─ 修正过滤器
└─ A3 软件层
├─ A3.1 驱动初始化? → dmesg 看错误?
│ └─ 查初始化代码
└─ A3.2 can0 up? → ip link show can0?
└─ ip link set can0 up
1.2 B 类:偶发错
CAN 偶发错
├─ B1 信号完整性层
│ ├─ B1.1 终端? → 示波器看振铃?
│ │ └─ 双端终端 + 分裂终端
│ ├─ B1.2 EMI? → 附近干扰源(电机/开关电源)?
│ │ └─ 共模扼流圈 + TVS + 远离
│ └─ B1.3 stub? → stub 太长?
│ └─ 缩短 stub(1M<0.3m)
├─ B2 软件层
│ ├─ B2.1 FIFO 溢出? → 接收丢帧?
│ │ └─ 提高优先级/DMA/加深FIFO
│ └─ B2.2 负载高? → canbusload > 80%?
│ └─ 优化ID/限频/CAN FD
└─ B3 时钟层
├─ B3.1 采样点? → 全网87.5%?
│ └─ 统一
├─ B3.2 SJW? → 长帧错?
│ └─ SJW=2
└─ B3.3 晶振? → RC振荡器? 温漂?
└─ 换±50ppm晶振
1.3 C 类:错误状态
CAN 错误状态
├─ C1 总线关闭(BUS-OFF)
│ ├─ C1.1 波特率错? → 和全网不一致?
│ │ └─ 统一波特率
│ ├─ C1.2 收发器坏? → 换
│ ├─ C1.3 EMI 严重? → 抗扰
│ └─ C1.4 恢复? → ABOM + 次数限制 + 安全状态
├─ C2 错误被动(ERROR-PASSIVE)
│ ├─ C2.1 位定时? → 采样点?
│ ├─ C2.2 EMI? → 抗扰
│ └─ C2.3 目标节点? → ACK 错?
└─ C3 ACK 错误
├─ C3.1 单节点? → Loopback 测试
├─ C3.2 目标故障? → 查目标节点
└─ C3.3 波特率? → 统一
1.4 D 类:数据错
CAN 数据错
├─ D1 ID 解析错
│ ├─ D1.1 标准/扩展? → IDE 位识别
│ └─ D1.2 字节序? → MSB 先
├─ D2 长度错
│ ├─ D2.1 DLC>8? → 经典CAN视为8
│ └─ D2.2 FD DLC? → 9-15映射12/16/…/64
└─ D3 高层协议错
├─ D3.1 J1939? → PGN解析+SPN换算
├─ D3.2 UDS? → NRC分析
└─ D3.3 ISO-TP? → 分包重组
1.5 E 类:Linux 框架
Linux CAN 问题
├─ E1 can0 不 up
│ ├─ E1.1 设备树? → CAN节点配置?
│ ├─ E1.2 驱动? → dmesg 看加载?
│ └─ E1.3 时钟/引脚? → 设备树时钟
├─ E2 candump 无输出
│ ├─ E2.1 can0 down? → ip link set up
│ ├─ E2.2 物理层? → 终端/收发器
│ └─ E2.3 过滤器? → setsockopt
└─ E3 错误帧
├─ E3.1 ERR_FILTER? → 使能错误帧接收
└─ E3.2 状态? → ip -s 看统计
二、常见故障速查表
#故障现象原因解决
| 1 |
完全不通 |
candump 无帧 |
终端缺/收发器/位定时 |
万用表+示波器 |
| 2 |
终端缺 |
振铃,偶发错 |
单端/无终端 |
双端120Ω |
| 3 |
多终端 |
驱动不足 |
每节点都加 |
只两端加 |
| 4 |
波特率错 |
总线关闭 |
和全网不一致 |
统一波特率 |
| 5 |
采样点错 |
CRC 错 |
不一致 |
统一87.5% |
| 6 |
时钟偏差大 |
长帧错 |
RC/温漂 |
换晶振±50ppm |
| 7 |
SJW 小 |
长帧偶发错 |
补偿不足 |
SJW=2 |
| 8 |
ACK 错 |
单节点/目标故障 |
无应答 |
Loopback/查目标 |
| 9 |
CRC 错 |
错误帧 |
采样点/EMI |
统一+抗扰 |
| 10 |
位填充错 |
EMI |
位翻转 |
抗扰 |
| 11 |
格式错 |
EOF干扰 |
EMI |
抗扰 |
| 12 |
总线关闭 |
TEC≥128 |
持续错 |
查根因+ABOM |
| 13 |
错误被动 |
TEC/REC≥96 |
偶发错 |
排查 |
| 14 |
FIFO 溢出 |
丢帧 |
CPU慢 |
DMA/高优先级 |
| 15 |
负载高 |
偶发错 |
帧太多 |
优化/限频/FD |
| 16 |
stub 长 |
高速错 |
反射 |
缩短(1M<0.3m) |
| 17 |
FD 收发器慢 |
数据段CRC错 |
tr长 |
换FD收发器 |
| 18 |
过滤器错 |
收不到/收到多余 |
配置错 |
核对ID/MASK |
| 19 |
节点数多 |
边沿缓 |
电容大 |
降速/分段 |
三、位定时速查
3.1 位定时常用配置(f_CAN=48MHz)
速率BRPNBTTSEG1TSEG2SJWSP
| 1M |
3 |
16 |
13 |
2 |
2 |
87.5% |
| 500k |
6 |
16 |
13 |
2 |
2 |
87.5% |
| 250k |
12 |
16 |
13 |
2 |
2 |
87.5% |
| 125k |
24 |
16 |
13 |
2 |
2 |
87.5% |
| 50k |
60 |
16 |
13 |
2 |
2 |
87.5% |
3.2 CAN FD 双位定时(f_CAN=80MHz)
段速率BRPNBTTSEG1TSEG2SJWSP
| 仲裁段(NBTP) |
1M |
5 |
16 |
13 |
2 |
2 |
87.5% |
| 数据段(DBTP) |
5M |
2 |
8 |
5 |
2 |
1 |
75% |
| 数据段(DBTP) |
8M |
1 |
10 |
7 |
2 |
1 |
80% |
3.3 BTR 配置公式
1. NBT = f_CAN / (BRP × bit_rate), 选 BRP 让 NBT=16
2. TSEG1 = NBT × SP – 1 = 16 × 0.875 – 1 = 13
3. TSEG2 = NBT – 1 – TSEG1 = 16 – 1 – 13 = 2
4. SJW = 2(通常,1~4)
5. BTR = (SJW-1)<<24 | (TSEG2-1)<<16 | (TSEG1-1)<<8 | (BRP-1)
3.4 速率-距离-约束速查
速率总线长stub节点电容
| 1M |
40m |
0.3m |
30 |
100pF |
| 500k |
100m |
0.6m |
30 |
100pF |
| 250k |
250m |
1.2m |
30 |
200pF |
| 125k |
500m |
2.4m |
30 |
500pF |
| 50k |
1km |
6m |
30 |
1nF |
| FD 5M |
<10m |
0.15m |
<10 |
100pF |
四、帧格式速查
4.1 数据帧(标准帧 8 字节)
段位数内容
| SOF |
1 |
显性(帧起始) |
| ID |
11 |
标识符(优先级) |
| RTR |
1 |
0=数据,1=远程 |
| IDE |
1 |
0=标准,1=扩展 |
| r0 |
1 |
保留 |
| DLC |
4 |
数据长度(0~8经典) |
| 数据 |
0~64 |
数据 |
| CRC |
15/17/21 |
校验 |
| CRC DEL |
1 |
隐性 |
| ACK |
1 |
显性(接收方) |
| ACK DEL |
1 |
隐性 |
| EOF |
7 |
隐性 |
| IFS |
3 |
隐性 |
4.2 帧类型速查
帧RTRIDE数据用途
| 标准数据 |
0 |
0 |
0~8B |
主用 |
| 标准远程 |
1 |
0 |
无 |
请求 |
| 扩展数据 |
0 |
1 |
0~8B |
J1939 |
| 扩展远程 |
1 |
1 |
无 |
请求 |
| FD 数据 |
0 |
EDL=1 |
0~64B |
高速大块 |
| 错误帧 |
– |
– |
6显性/隐性+8隐性 |
报错 |
| 过载帧 |
– |
– |
6显性+7隐性 |
流控 |
4.3 CAN FD 新增位
位含义
| EDL |
FD帧标识(替代经典r0) |
| BRS |
切速(1=数据段高速) |
| ESI |
错误状态(1=被动错误) |
4.4 DLC 映射(CAN FD)
DLC经典FD
| 0-8 |
0-8B |
0-8B |
| 9 |
– |
12B |
| 10 |
– |
16B |
| 11 |
– |
20B |
| 12 |
– |
24B |
| 13 |
– |
32B |
| 14 |
– |
48B |
| 15 |
– |
64B |
五、错误计数器与状态速查
5.1 错误计数规则
事件TEC/REC 变化
| 发送错 |
TEC +8 |
| 发送成功 |
TEC -1 |
| 接收错 |
REC +8 |
| 接收成功 |
REC -1 |
| 主动错误标志期间检测显性 |
+1 |
5.2 状态转移
状态TEC/REC错误标志
| 主动错误 |
<96 |
6显性(破坏) |
| 错误警告 |
≥96 |
– |
| 被动错误 |
96~127 |
6隐性(不破坏) |
| 总线关闭 |
TEC≥128 |
不通信 |
5.3 恢复
恢复机制
| 主动→被动回主动 |
TEC/REC<96 |
| 总线关闭→主动 |
128×11=1408隐性(自动)/ 软件 |
5.4 错误码(LEC)
LEC错误
| 0 |
无错 |
| 1 |
位填充错 |
| 2 |
格式错 |
| 3 |
ACK 错 |
| 4 |
位1错(隐性位发显性读) |
| 5 |
位0错(显性位发隐性读) |
| 6 |
CRC 错 |
六、高层协议速查
6.1 CANopen ID 速查
对象ID用途
| NMT |
0x000 |
网络管理 |
| 紧急 |
0x080 |
紧急报文 |
| PDO |
0x181~0x57F |
过程数据(实时) |
| SDO |
0x581~0x67F |
服务数据(配置) |
| 心跳 |
0x700+ |
节点心跳 |
6.2 J1939 29bit ID 编码
优先级(3) | 保留(1) | 数据页(1) | PF(8) | PS(8) | 源地址(8)
PGN参数
| 61444 |
EEC1 发动机(转速0.125rpm/bit) |
| 65262 |
发动机温度(水温) |
| 65263 |
发动机仪表(油压) |
| 59904 |
请求 |
| 60416 |
应答 |
6.3 UDS 服务速查
SID服务请求正响应
| 0x10 |
会话控制 |
10 03 |
50 03 |
| 0x11 |
ECU 复位 |
11 01 |
51 01 |
| 0x22 |
读数据 |
22 F1 90 |
62 F1 90 data |
| 0x27 |
安全访问 |
27 01/02 key |
67 01 seed/67 02 |
| 0x2E |
写数据 |
2E F1 90 data |
6E F1 90 |
| 0x31 |
例程控制 |
31 01 FF 00 |
71 01 FF 00 |
| 0x34 |
请求下载 |
34 |
74 |
| 0x36 |
传输数据 |
36 |
76 |
| 0x37 |
退出传输 |
37 |
77 |
| 0x3E |
保活 |
3E 00 |
7E 00 |
6.4 UDS NRC(否定响应码)
NRC含义
| 0x13 |
格式错 |
| 0x22 |
条件不满足 |
| 0x24 |
请求序列错 |
| 0x31 |
超范围 |
| 0x33 |
安全拒绝(未解锁) |
| 0x78 |
响应待定(忙) |
| 0x7E |
子功能不支持 |
| 0x7F |
服务不支持 |
6.5 ISO-TP 帧速查
类型PCI用途
| SF |
0x0N |
≤7B 单帧 |
| FF |
0x1x |
多帧首帧(总长+6B) |
| CF |
0x2x |
续帧(序号+7B) |
| FC |
0x3x |
流控(FS/BS/STmin) |
6.6 诊断 ID 速查
ID用途
| 0x7DF |
广播诊断请求 |
| 0x7E0~0x7E7 |
ECU 请求 |
| 0x7E8~0x7EF |
ECU 响应 |
七、功能安全审查清单
7.1 物理层
- 双端 120Ω 终端(万用表测 60Ω)
- 双绞线(CAN_H/CAN_L)
- 共模扼流圈(汽车级)
- TVS 保护(ESD/EFT)
- 分裂终端(60Ω+60Ω+4.7nF,可选)
- 收发器汽车级(AEC-Q100)
- stub 长度合规(1M<0.3m)
- 节点数合规(<30)
- 完整地平面
7.2 协议层
- 位定时全网一致(BRP/TSEG1/TSEG2/SJW)
- 采样点 87.5%(主流)
- 晶振 ±50ppm(禁 RC)
- CAN FD 双位定时(NBTP+DBTP)
- 帧格式正确(SOF/ID/CRC/ACK/EOF)
- ID 分配合理(优先级)
7.3 传输层
- 错误中断处理(BOFF/EPVF/EWGF/LEC)
- 错误计数器监控(TEC/REC)
- 总线关闭恢复(ABOM + 次数限制)
- 恢复超限进安全状态
- 恢复后应用层重新同步
- 自动重发策略(NART 或软件超时)
- FIFO 溢出处理(覆盖/锁定)
7.4 数据层
- E2E 保护(CRC + 序列号 + 存活计数)
- 关键消息超时监控
- 关键控制回读校验
- 数据校验(端到端 CRC)
7.5 系统层
- 双通道冗余(ASIL D,关键消息双发)
- 安全状态(故障不执行危险动作)
- 看门狗(任务存活监控)
- 错误日志(可追溯)
- 故障注入测试
7.6 软件层
- ISR 最小化(只读推队列)
- RTOS 集成(消息队列/信号量/互斥锁)
- 互斥锁保护(多任务共享)
- 缓冲对齐(DMA/Cache)
- 驱动分层(应用→驱动→硬件)
八、全系列要点回顾
8.1 L1 硬件基础层(01-03)
- 01 物理层:差分信号(CAN_H/CAN_L),显性2V/隐性0V,线与,ISO 11898-2高速/-3低速/FD,收发器,120Ω双端终端,NRZ+位填充,CAN FD(5M/64B)
- 02 信号完整性:直线总线拓扑,stub长度(1M<0.3m),节点数30,总线电容<100pF,双端终端抑制反射,分裂终端抗EMI,共模扼流圈,FD 5M SI严,汽车EMI/EMS AEC-Q100
- 03 位定时同步:位时间四段(SYNC_SEG+TSEG1+TSEG2),采样点87.5%,硬同步(SOF)+重同步(帧中跳变),SJW 1~2Tq,时钟容差0.1-0.5%选±50ppm晶振,BTR配置,CAN FD双位定时(NBTP+DBTP)
8.2 L2 协议时序层(04-07)
- 04 帧格式:四种帧(数据/远程/错误/过载),数据帧七段(SOF+仲裁+控制+数据+CRC+ACK+EOF+IFS),仲裁段(ID+RTR+IDE),DLC,CRC15/17/21,ACK机制,标准11bit/扩展29bit,CAN FD(BRS/ESI/EDL)
- 05 仲裁优先级:CSMA/CD+AMP,线与(显性覆盖隐性),逐位仲裁(ID高位比较,发隐性读显性=输),ID越小优先级越高,仲裁无冲突(输的转接收),同ID数据帧>远程帧/标准帧>扩展帧,优先级设计,饿死问题,CAN FD仲裁段1M数据段不仲裁
- 06 错误处理:五种错误检测(位监控/位填充/CRC/格式/ACK),错误帧(主动6显性/被动6隐性+8隐性),错误计数器(TEC/REC,错+8成功-1),节点状态(主动<96/被动96-127/总线关闭≥128),自动重发,总线关闭恢复(1408隐性/软件)
- 07 高层协议:CANopen(对象字典+PDO+SDO+心跳),J1939(29bit ID编码PGN),UDS(诊断服务0x10/0x22/0x2E/0x27刷写),ISO-TP(SF/FF/CF/FC大报文分包),CAN FD适配(64B单帧)
8.3 L3 驱动实现层(08-11)
- 08 控制器寄存器:Bosch C_CAN/M_CAN IP,STM32 bxCAN/FDCAN寄存器(MCR/MSR/BTR/ESR/邮箱/FIFO/过滤器),发送邮箱3个,接收FIFO 2×3级,验收过滤器(列表/屏蔽),RISC-V N300 M_CAN(同FDCAN改基址)
- 09 传输模式:轮询(调试)/中断(主流)/DMA(FD大块),发送邮箱队列(3邮箱+软件队列),接收FIFO处理(覆盖/锁定),RTOS集成(消息队列+信号量+互斥锁),ISR最小化
- 10 错误恢复:错误计数器监控,状态转移处理,总线关闭恢复(ABOM/软件/混合),功能安全端到端保护(协议层CRC/ACK+应用层E2E+序列号+超时+回读+冗余+安全状态+看门狗),AEGIX CAN容错(双通道冗余+恢复次数限制)
- 11 Linux框架:SocketCAN(CAN当网络接口),PF_CAN协议族(RAW/BCM/ISO-TP/J1939),can-dev框架(c_can/m_can),设备树(bit-timing+can-fd),用户态socket API,can-utils(candump/cansend),ISO-TP/J1939内置
8.4 L4 应用实战层(12-14)
- 12 设备实战:裸机收发驱动,验收过滤器配置,环回测试,CANopen节点(对象字典/PDO/SDO/心跳),J1939解析(PGN/SPN),UDS诊断(0x10/0x22/0x27/0x2E),ISO-TP多帧(SF/FF/CF/FC),多CAN通道+RTOS,双通道冗余
- 13 调试排查:工具链分层(candump/逻辑分析仪/示波器/万用表/dmesg),candump抓包,逻辑分析仪差分解码,示波器看差分波形,万用表测终端60Ω,错误帧分析,位定时/终端问题排查,典型故障定位,降速调试法
- 14 排查手册:故障决策树(5大类),19故障速查,位定时/帧格式/错误计数器/高层协议速查,功能安全审查清单(6层),全系列回顾,学习路径,四总线总对照表
九、CAN vs UART vs I2C vs SPI 总对照表
9.1 物理层
维度UARTI2CSPICAN
| 线数 |
2(TX/RX) |
2(SDA/SCL) |
3+(SCK/MOSI/MISO/CS) |
2(CAN_H/L) |
| 电气 |
单端 |
开漏+上拉 |
单端/推挽 |
差分 |
| 电平 |
TTL/RS232 |
上拉到VCC |
TTL |
差分2V/0V |
| 同步 |
异步 |
同步(SCL) |
同步(SCK) |
同步(位填充) |
| 拓扑 |
点对点 |
总线 |
主从星型/总线 |
直线总线 |
| 终端 |
无 |
上拉 |
无 |
120Ω双端 |
| 速度 |
≤3M |
≤3.4M(高速) |
≤50M+ |
≤1M(经典)/8M(FD) |
| 距离 |
RS232 15m |
板级 |
板级 |
1M=40m,125k=500m |
| 抗扰 |
弱(单端) |
弱(开漏) |
弱(单端) |
强(差分) |
9.2 协议层
维度UARTI2CSPICAN
| 帧 |
START+数据+STOP |
START+地址+ACK+数据+STOP |
CS+时钟+数据 |
SOF+ID+控制+数据+CRC+ACK+EOF |
| 寻址 |
无(点对点) |
7/10bit地址 |
CS硬件选 |
ID(11/29bit) |
| 双工 |
全双工 |
半双工 |
全双工 |
半双工 |
| 应答 |
无 |
ACK/NACK |
无 |
ACK(多节点) |
| 多主 |
否 |
是(仲裁都退) |
否 |
是(优先级仲裁) |
| 仲裁 |
无 |
线与都退 |
无(单主) |
CSMA/CD+AMP优先级 |
| 错误检测 |
奇偶(可选) |
ACK/NACK |
无 |
5种(位监控/填充/CRC/格式/ACK) |
| 错误恢复 |
无 |
重试 |
无 |
错误帧+自动重发+总线关闭 |
| 流控 |
硬件/软件 |
无 |
无 |
过载帧(少用) |
| 数据长度 |
帧8/9bit |
任意(每帧8bit) |
任意 |
0-8经典/0-64 FD |
9.3 应用场景
场景总线原因
| 调试串口 |
UART |
简单点对点 |
| GPS/蓝牙模块 |
UART |
点对点 |
| 传感器(温湿度) |
I2C |
低速板级多设备 |
| EEPROM |
I2C |
板级存储 |
| OLED/Flash |
SPI |
高速 |
| ADC/DAC |
SPI |
高速 |
| 汽车ECU通信 |
CAN |
汽车级可靠+多主 |
| 工业自动化 |
CAN/CANopen |
可靠+实时 |
| 商用车 |
J1939(CAN) |
标准化 |
| 汽车诊断 |
UDS(CAN) |
诊断标准 |
9.4 调试
维度UARTI2CSPICAN
| 工具 |
串口工具 |
逻辑分析仪 |
逻辑分析仪+示波器 |
candump+逻辑分析仪+示波器+万用表 |
| 难度 |
低 |
中 |
中高 |
高 |
| 错误分析 |
简单 |
ACK/NACK |
无(软件) |
错误状态机(复杂) |
9.5 选型决策树
要传什么?
├─ 点对点调试/模块 → UART
├─ 板级多设备低速 → I2C
├─ 板级高速(Flash/OLED/ADC) → SPI
├─ 汽车/工业多主可靠 → CAN
│ ├─ 商用车 → J1939
│ ├─ 工业自动化 → CANopen
│ └─ 汽车诊断 → UDS
└─ 大数据高速 → CAN FD(64B/帧)
延伸阅读
CAN 全系列
- [[01-CAN物理层与差分电气]] / [[02-CAN信号完整性与拓扑]] / [[03-CAN位定时与同步]]
- [[04-CAN帧格式]] / [[05-CAN仲裁与优先级]] / [[06-CAN错误处理与错误帧]] / [[07-CAN高层协议]]
- [[08-CAN控制器寄存器与IP架构]] / [[09-CAN传输模式-轮询-中断-DMA]] / [[10-CAN错误恢复与总线关闭]] / [[11-CAN Linux驱动框架]]
- [[12-CAN设备驱动实战]] / [[13-CAN调试与排查]]
对照学习
- [[14-SPI排查手册与速查表]] —— SPI 收官 + 四总线对照
- [[14-I2C排查手册与速查表]] —— I2C 收官
- [[00-CAN技术系列总目录]] —— CAN 总目录
参考资料
- Bosch CAN Specification 2.0 / CAN FD
- ISO 11898-1(数据链路层)/ -2(物理层)
- CiA 301(CANopen)/ SAE J1939 / ISO 14229(UDS)/ ISO 15765(ISO-TP)
- ISO 26262 功能安全
- STM32 RM0090/RM0433
- Linux Documentation/networking/can.rst
[[00-CAN技术系列总目录]] · 上一篇:[[13-CAN调试与排查]] · CAN 系列完结
✨ 感谢你的阅读 ✨
技术之路漫漫,分享是为了更好地交流。 如果本文的内容对你有启发,希望能得到你的支持:
👍 点赞 | ⭐ 收藏 | 👀 关注
如果你在调试过程中遇到了其他问题, 欢迎在 评论区 💬 留言,我们一起探讨。 关注我,一起交流底层开发的那些事儿!🚀
评论前必须登录!
注册