尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

CAN练习

发布时间:2026/9/29 5:17:44

资讯中心
01
ARTICLE

CAN练习

CAN练习
疑惑问发 1 帧报文最多 TEC8吗答错报文传输过程中每检测到一个总线错误都会触发一次 TEC 累加。 一整帧 CAN 报文很长SOFIDDLC 数据 CRCACK只要总线波形畸变这一帧报文在传输途中会连续报好几个填充错误每检出 1 个错误TEC 就 8问为什么tec和rec最大只有128答硬件限制寄存器使用7bitf1/4有这个限制h7没有。所以f1/4不会进入BusOff注意重定向printf要打开Micro LIBCAN-1双节点基础通信参数sFilterConfig.SlaveStartFilterBank 14;含义(硬件基础要有两个CAN)CAN1主使用过滤器0 ~ 13一共 14 组CAN2从使用过滤器14 ~ 27一共 14 组启动CAN接收通知(开启接收中断)HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);CAN-2使用DBCDBC 全称Database CAN简单一句话DBC 是 CAN 总线的报文描述文件后缀.dbc是车载 CAN 的 “翻译字典”由 Vector 公司定义的文本格式。核心作用CAN 总线原始传输的只有十六进制字节流比如ID:0x123 Data: 08 00 40 1F ...单纯看这串数字你不知道哪几个字节代表发动机转速、水温、车速。 DBC 文件里面写好了一套规则用来把原始 CAN 数据翻译成工程值物理量。DBC 里面存了哪些信息Message报文报文 ID、报文名称、周期周期报文、数据长度 DLC例如EngineMsg : 0x0A0, DLC8Signal信号信号名称EngineRPM、VehicleSpeed起始位、信号长度、字节序 (Intel/Motorola)、数据类型 (有符号 / 无符号)缩放因子、偏移量物理值 原始值 × 缩放 偏移最小值、最大值、单位RPM、km/h、℃附加内容注释、节点NodeECU、值表枚举比如 0 关闭1 开启DBC 基础语法结构DBC Database CANCAN 总线数据库文件纯文本后缀.dbcZCANPRO 可以直接导入自动解析 CAN 报文、信号、缩放偏移。规则信号位序是 Motorola (大端)/Intel (小端)车载常用 MotorolaZCANPRO 里可以选择字节序1. 文件头部信息段必写VERSION demo_can NS_ : NS_DESC_ : CM_ : BA_DEF_ : BA_ : VAL_ :关键字英文全称作用VERSIONVersionDBC 版本名称字符串随便写ZCANPRO 仅展示NS_Namespace命名空间固定写NS_ :DBC 标准保留几乎不用改NS_DESC_Namespace Description命名空间描述一般空着CM_Comment注释给报文 / 信号加说明文字BA_DEF_Attribute Definition属性定义自定义 DBC 的属性如报文周期、ECU 名称BA_Attribute属性值给上面定义的属性赋值VAL_Value信号枚举值比如 0Off1OnZCANPRO 解析后显示文字而不是原始数字2. 节点定义BU_BU_Bus Unit总线单元代表总线上的 ECU节点 语法BU_: ECU1 CANAnalyzer含义总线上有 2 个节点ECU1STM32、CANAnalyzerZCANPRO 分析仪注意名字不能有空格BU_后面跟所有参与 CAN 收发的 ECU 名称。3. 报文定义BO_【核心BO Message / Board Message】BO_Board Object报文对象代表一帧 CAN 报文 语法模板BO_ 100 EngineMsg: 8 ECU1 SG_ EngineRPM : 0|160 (1,0) [0,8000] rpm CANAnalyzer SG_ Temp : 16|80 (1,-40) [-40,125] degC CANAnalyzerBO_ 行拆解BO_ 100 EngineMsg: 8 ECU1BO_Board Object报文起始标记100CAN ID十进制注意 DBC 里 ID 默认十进制不是十六进制CAN ID 0x100DBC 里要写 256ZCANPRO 导入这点很容易踩坑EngineMsg报文名称自定义8报文数据长度 DLC0~8CAN2.0 最多 8 字节ECU1发送该报文的节点发送方 ECUSG_ 信号行 SG SignalSG_ EngineRPM : 0|160 (1,0) [0,8000] rpm CANAnalyzerSG_Signal信号报文中提取的一个物理量表格片段含义EngineRPM信号名016 起始位信号长度 bit从 bit0 开始占 16bit0字节序0Motorola 大端1Intel 小端车载 CAN 大多 Motorola符号 无符号 unsigned- 有符号 signed(1,0)(缩放因子Factor,偏移Offset)物理值 原始整数 × Factor Offset[0,8000]物理值范围[最小值,最大值]ZCANPRO 用来校验rpm单位字符串CANAnalyzer接收这个信号的节点接收方 ECUMotorola (大端 0)高位放在低字节车载 ECU 最常用ZCANPRO 解析车载 DBC 默认这个。 Intel (1)小端低位放低字节单片机裸机代码常用。注释 CM_ CMCommentCM_ 发动机报文周期100ms;CM_ SG_ 100 EngineRPM 发动机转速;给报文或者信号写备注ZCANPRO 里可以看到说明。4. 属性定义 BA_DEF_ / BA_BAAttribute常用定义报文周期ZCANPRO 可以读取周期信息BA_DEF_ BO_ GenMsgCycleTime INT 0 5000; BA_ GenMsgCycleTime BO_ 100 100;BA_DEF_ BO_ GenMsgCycleTime INT 0 5000;BA_DEF_ Attribute Definition定义一个报文属性GenMsgCycleTime报文周期整数范围 0~5000msBA_ GenMsgCycleTime BO_ 100 100;BA_ Attribute给 ID100 报文赋值周期 100msZCANPRO 可以展示报文周期5. 枚举 VAL_ VALValue信号数值映射文字ZCANPRO 解析直接显示文本不用看原始数字VAL_ 100 Gear 0 N 1 D 2 R ;含义报文 ID100 里的信号 Gear0N 挡1D 挡2R 挡。6. 完整可直接导入 ZCANPRO 的最小 DBC 示例新建文本复制下面全部内容保存为demo.dbc直接拖进 ZCANPRO 即可VERSION DemoCAN NS_ : NS_DESC_ : CM_ : BA_DEF_ : BA_ : VAL_ : BU_: ECU1 CANAnalyzer BO_ 256 EngineMsg: 8 ECU1 SG_ EngineRPM : 0|160 (1,0) [0,8000] rpm CANAnalyzer SG_ EngineTemp : 16|80 (1,-40) [-40,125] degC CANAnalyzer CM_ BO_ 256 发动机周期报文100ms; CM_ SG_ 256 EngineRPM 发动机转速; BA_DEF_ BO_ GenMsgCycleTime INT 0 5000; BA_ GenMsgCycleTime BO_ 256 100;错误解析前置重要说明ZCANPRO 里的消极错误是软件中文翻译名词≠ CAN 协议的被动错误状态 (Error Passive)。CAN 协议规定两大类错误事件①仲裁丢失Arbitration Lost属于总线仲裁竞争失败独立一类不属于 “消极错误”②CAN 标准 5 类总线错误消极错误字段描述的就是这 5 种位错误、位填充错误、CRC 错误、ACK 错误、格式错误。 所以日志里会分成两组独立字段消极错误相关字段仲裁错误段表示分开记录两类不同故障。一、基础公共字段序号错误事件的流水编号0、1 代表第 0、1 条捕获到的总线错误源设备类型USBCAN-II代表这条错误是周立功 USBCAN-II 分析仪硬件采集上报源设备 / 源通道设备 0通道 0 → 使用分析仪的第 0 号 CAN 通道抓包时间ZCANPRO 本地时间戳捕获到这个错误的时刻节点状态CAN 节点错误状态机CAN 2.0A/B 协议标准主动状态 (Error Active)TEC128REC128。节点可以正常收发报文发送出错 TEC8。被动状态 (Error Passive)TEC≥128 或 REC≥128。节点不能主动发送报文只能接收发送失败 TEC 只 1。总线关闭 (BusOff)TEC≥256彻底脱离总线只能接收复位后恢复。你的日志TEC127 还在主动发生一次仲裁丢失TEC1 变成 128 → 切换被动状态。RECReceive Error Counter接收错误计数器收到报文出错时增加。你这里 REC 一直 0接收报文全部正常接收侧没有任何错误。TECTransmit Error Counter发送错误计数器节点发送报文失败时增加。你的错误全部来自发送侧所以 TEC 持续上涨REC 不变。二、【错误码】字段含义USBCAN-II 硬件寄存器原始错误值是 CAN 控制器 ESR错误状态寄存器读取出来的十六进制原始数据ZLG 硬件自定义编码。0x00000004仲裁丢失事件Arbitration Lost0x00000010发送错误标记TEC 计数达到被动阈值后上报作用底层原始编号用来区分错误大类软件根据这个值解析后面的文字描述。三、【消极错误代码类型】针对5 类标准 CAN 总线错误做分类编号位错误、位填充错误、CRC 错误、ACK 错误、格式错误。 编号1其它错误什么时候不是其它错误如果是位错误这里会显示【位错误】ACK 丢失就显示【ACK 错误】。本次场景错误是仲裁丢失仲裁丢失不属于这 5 类标准消极错误所以归类为「其它错误」。四、【消极错误属性】标记这个标准总线错误发生在发送流程还是接收流程0:发送错误错误发生在节点向外发送报文的过程对应 TEC 累加1:接收错误错误发生在接收报文对应 REC 累加你的日志全部是0:发送错误代表所有错误都是发送报文的时候产生。五、【消极错误段表示】含义仅针对 5 类标准 CAN 消极错误记录错误发生在报文哪一段 CAN 报文分段SOF 起始帧、仲裁段、控制段、数据段、CRC 段、ACK 段、EOF 帧结束。如果是 ACK 错误这里会标记在 ACK 段位错误发生在数据段就标记数据段。重点仲裁丢失不属于消极错误所以这个字段填充0 00000代表【无标准消极错误】这个字段无效。六、【仲裁错误段表示】独立字段和消极错误分开专门用来记录仲裁丢失的位置仲裁丢失是独立于消极错误的一类事件。 你的日志丢失在位位:1含义节点发送报文时在仲裁段第 1bit发生仲裁丢失。 原理 CAN 发送时发送节点一边发一边采样总线电平回读对比。 本节点发出隐性电平 1但是总线被其他节点拉成显性电平 0。 CAN 规则0 优先级高于 1本节点输掉仲裁立刻停止发送报文TEC 计数增加。 你这个场景STM32 和 USB-CAN 分析仪同一时刻同时发送报文ID 仲裁冲突在仲裁段第 1bit 输掉仲裁。CAN周期报文设计ID 分配ID 分配实际上是在进行通信优先级设计发送调度实质上管理“什么时候把哪些 CAN 报文交给 CAN 控制器发送”抖动控制(jitter)实际发送时间相对于理想时间存在变化为什么会产生抖动仲裁等等...rolling counter作用让接收方知道报文是否连续到达检测是否有丢帧、重复、乱序checksum含义根据报文中的数据计算一个校验值并把这个校验值也放进报文为什么需要Checksum不是 CRC 不好是看安全等级、成本、算力、规范继承。低安全等级场景Checksum 足够用而且更简单、更快、更容易标准化所以 AUTOSAR 专门保留了 E2E Profile1RollCntChecksum。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。