AUTOSAR CAN State Manager(CanSM)R25-11 详解
依据:AUTOSAR Classic Platform R25-11《Specification of CAN State Manager》
文档 ID 253。本文用于工程理解、配置评审和问题定位;示例代码是实现骨架,不是某一家供应商的可编译源码。
目录
- [1. 概述](#1. 概述)
- [2. 模块架构](#2. 模块架构)
- [3. 状态机设计](#3. 状态机设计)
- [4. 操作序列](#4. 操作序列)
- [5. 配置模型](#5. 配置模型)
- [6. 总结](#6. 总结)
1. 概述
CanSM(CAN State Manager)为每个 CAN 网络维护独立的通信状态,负责把 ComM 的抽象通信请求转换成 CanIf 可执行的控制器、收发器和 PDU 模式操作。它的核心工作是保证底层动作按顺序完成,并把异步确认重新汇聚成稳定的网络状态。
1.1 解决的问题
| 问题 | CanSM 的处理方式 |
|---|---|
| 网络从休眠进入通信 | 按收发器、控制器、PDU 的顺序启动,并等待确认 |
| 网络需要静默 | 保持控制器接收能力,按配置关闭发送 |
| 控制器 Bus-Off | 进入恢复子状态、执行延时和重启策略 |
| 收发器被唤醒 | 清除/检查唤醒标志,执行唤醒验证 |
| 运行中切换速率 | 停止控制器后改变波特率,再重新建立通信 |
| 多模块状态不一致 | 通过 BswM 和 ComM 通知统一对外状态 |
1.2 端到端交互总览
BswM CAN驱动/收发器 CanIf CanSM ComM 应用/诊断 BswM CAN驱动/收发器 CanIf CanSM ComM 应用/诊断 #mermaid-svg-tACtLDWehlypMxYJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tACtLDWehlypMxYJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tACtLDWehlypMxYJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tACtLDWehlypMxYJ .error-icon{fill:#552222;}#mermaid-svg-tACtLDWehlypMxYJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tACtLDWehlypMxYJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tACtLDWehlypMxYJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tACtLDWehlypMxYJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tACtLDWehlypMxYJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tACtLDWehlypMxYJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tACtLDWehlypMxYJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tACtLDWehlypMxYJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tACtLDWehlypMxYJ .marker.cross{stroke:#333333;}#mermaid-svg-tACtLDWehlypMxYJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tACtLDWehlypMxYJ p{margin:0;}#mermaid-svg-tACtLDWehlypMxYJ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tACtLDWehlypMxYJ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-tACtLDWehlypMxYJ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-tACtLDWehlypMxYJ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-tACtLDWehlypMxYJ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-tACtLDWehlypMxYJ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-tACtLDWehlypMxYJ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-tACtLDWehlypMxYJ .sequenceNumber{fill:white;}#mermaid-svg-tACtLDWehlypMxYJ #sequencenumber{fill:#333;}#mermaid-svg-tACtLDWehlypMxYJ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-tACtLDWehlypMxYJ .messageText{fill:#333;stroke:none;}#mermaid-svg-tACtLDWehlypMxYJ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tACtLDWehlypMxYJ .labelText,#mermaid-svg-tACtLDWehlypMxYJ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-tACtLDWehlypMxYJ .loopText,#mermaid-svg-tACtLDWehlypMxYJ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-tACtLDWehlypMxYJ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-tACtLDWehlypMxYJ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-tACtLDWehlypMxYJ .noteText,#mermaid-svg-tACtLDWehlypMxYJ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-tACtLDWehlypMxYJ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tACtLDWehlypMxYJ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tACtLDWehlypMxYJ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tACtLDWehlypMxYJ .actorPopupMenu{position:absolute;}#mermaid-svg-tACtLDWehlypMxYJ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-tACtLDWehlypMxYJ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tACtLDWehlypMxYJ .actor-man circle,#mermaid-svg-tACtLDWehlypMxYJ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-tACtLDWehlypMxYJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 请求网络通信 1 RequestComMode(FULL/SILENT/NO) 2 控制器/收发器/PDU 操作 3 执行硬件动作 4 硬件完成 5 异步模式确认 6 更新网络状态机 7 GetCurrentComMode 可读取 8 CurrentState 通知 9
这条链路中,RequestComMode 只是请求入口,不代表硬件已经完成;只有对应的 CanIf 确认回调被消费后,CanSM 才能提交新状态。
2. 模块架构
CanSM 位于 ComM、CanIf、CanNm 与 BswM 之间,按 CAN 网络管理通信模式,顺序控制 CAN 控制器、收发器、PduR/CanIf 通信路径和 Bus-Off 恢复。它不直接处理报文内容,也不替代 CanIf 的底层驱动。
#mermaid-svg-C826JJkMV0J2jWB3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-C826JJkMV0J2jWB3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-C826JJkMV0J2jWB3 .error-icon{fill:#552222;}#mermaid-svg-C826JJkMV0J2jWB3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-C826JJkMV0J2jWB3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-C826JJkMV0J2jWB3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-C826JJkMV0J2jWB3 .marker.cross{stroke:#333333;}#mermaid-svg-C826JJkMV0J2jWB3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-C826JJkMV0J2jWB3 p{margin:0;}#mermaid-svg-C826JJkMV0J2jWB3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-C826JJkMV0J2jWB3 .cluster-label text{fill:#333;}#mermaid-svg-C826JJkMV0J2jWB3 .cluster-label span{color:#333;}#mermaid-svg-C826JJkMV0J2jWB3 .cluster-label span p{background-color:transparent;}#mermaid-svg-C826JJkMV0J2jWB3 .label text,#mermaid-svg-C826JJkMV0J2jWB3 span{fill:#333;color:#333;}#mermaid-svg-C826JJkMV0J2jWB3 .node rect,#mermaid-svg-C826JJkMV0J2jWB3 .node circle,#mermaid-svg-C826JJkMV0J2jWB3 .node ellipse,#mermaid-svg-C826JJkMV0J2jWB3 .node polygon,#mermaid-svg-C826JJkMV0J2jWB3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-C826JJkMV0J2jWB3 .rough-node .label text,#mermaid-svg-C826JJkMV0J2jWB3 .node .label text,#mermaid-svg-C826JJkMV0J2jWB3 .image-shape .label,#mermaid-svg-C826JJkMV0J2jWB3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-C826JJkMV0J2jWB3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-C826JJkMV0J2jWB3 .rough-node .label,#mermaid-svg-C826JJkMV0J2jWB3 .node .label,#mermaid-svg-C826JJkMV0J2jWB3 .image-shape .label,#mermaid-svg-C826JJkMV0J2jWB3 .icon-shape .label{text-align:center;}#mermaid-svg-C826JJkMV0J2jWB3 .node.clickable{cursor:pointer;}#mermaid-svg-C826JJkMV0J2jWB3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-C826JJkMV0J2jWB3 .arrowheadPath{fill:#333333;}#mermaid-svg-C826JJkMV0J2jWB3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-C826JJkMV0J2jWB3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-C826JJkMV0J2jWB3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C826JJkMV0J2jWB3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-C826JJkMV0J2jWB3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C826JJkMV0J2jWB3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-C826JJkMV0J2jWB3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-C826JJkMV0J2jWB3 .cluster text{fill:#333;}#mermaid-svg-C826JJkMV0J2jWB3 .cluster span{color:#333;}#mermaid-svg-C826JJkMV0J2jWB3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-C826JJkMV0J2jWB3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-C826JJkMV0J2jWB3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-C826JJkMV0J2jWB3 .icon-shape,#mermaid-svg-C826JJkMV0J2jWB3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C826JJkMV0J2jWB3 .icon-shape p,#mermaid-svg-C826JJkMV0J2jWB3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-C826JJkMV0J2jWB3 .icon-shape .label rect,#mermaid-svg-C826JJkMV0J2jWB3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C826JJkMV0J2jWB3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-C826JJkMV0J2jWB3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-C826JJkMV0J2jWB3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RequestComMode
Controller/Transceiver mode
mode indication / BusOff
CurrentState
ComM
CanSM
CanIf
BswM
CanNm
Dem
Det
SchM
2.1 参与模块与责任
| 模块 | CanSM 依赖或通知 | 工程检查点 |
|---|---|---|
| ComM | 请求 NO-COM、SILENT-COM、FULL-COM | 网络句柄必须与 CanSM 配置一一对应 |
| CanIf | 控制器/收发器模式、Bus-Off、PDU 模式 | 异步确认必须最终到达 CanSM |
| CanNm | 网络管理报文及唤醒配合 | Nm 网络类型与 CanSM 网络类型一致 |
| BswM | 通知当前通信状态 | 状态通知不能阻塞 CanSM 主函数 |
| Dem/Det | 生产错误、Bus-Off 事件、开发错误 | 事件映射和去抖由配置决定 |
| SchM | 临界区与主函数调度 | 周期必须覆盖最坏动作时延 |
3. 状态机设计
每个配置的 CAN 网络有独立状态机。顶层通常从 PRE-NOCOM 开始,经 PRE-FULLCOM 进入 FULLCOM;请求 SILENT-COM 或发生 Bus-Off 时进入对应分支。
#mermaid-svg-Jd0YeFIcIo62YZdd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Jd0YeFIcIo62YZdd .error-icon{fill:#552222;}#mermaid-svg-Jd0YeFIcIo62YZdd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Jd0YeFIcIo62YZdd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Jd0YeFIcIo62YZdd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Jd0YeFIcIo62YZdd .marker.cross{stroke:#333333;}#mermaid-svg-Jd0YeFIcIo62YZdd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Jd0YeFIcIo62YZdd p{margin:0;}#mermaid-svg-Jd0YeFIcIo62YZdd defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-Jd0YeFIcIo62YZdd g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-Jd0YeFIcIo62YZdd g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-Jd0YeFIcIo62YZdd g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-Jd0YeFIcIo62YZdd g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Jd0YeFIcIo62YZdd g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-Jd0YeFIcIo62YZdd .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Jd0YeFIcIo62YZdd .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-Jd0YeFIcIo62YZdd .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-Jd0YeFIcIo62YZdd .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Jd0YeFIcIo62YZdd .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-Jd0YeFIcIo62YZdd .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-Jd0YeFIcIo62YZdd .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-Jd0YeFIcIo62YZdd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Jd0YeFIcIo62YZdd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Jd0YeFIcIo62YZdd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Jd0YeFIcIo62YZdd .edgeLabel .label text{fill:#333;}#mermaid-svg-Jd0YeFIcIo62YZdd .label div .edgeLabel{color:#333;}#mermaid-svg-Jd0YeFIcIo62YZdd .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-Jd0YeFIcIo62YZdd .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-Jd0YeFIcIo62YZdd .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-Jd0YeFIcIo62YZdd .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-Jd0YeFIcIo62YZdd .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-Jd0YeFIcIo62YZdd .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Jd0YeFIcIo62YZdd .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Jd0YeFIcIo62YZdd #statediagram-barbEnd{fill:#333333;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Jd0YeFIcIo62YZdd .cluster-label,#mermaid-svg-Jd0YeFIcIo62YZdd .nodeLabel{color:#131300;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-Jd0YeFIcIo62YZdd .note-edge{stroke-dasharray:5;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-note text{fill:black;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram-note .nodeLabel{color:black;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagram .edgeLabel{color:red;}#mermaid-svg-Jd0YeFIcIo62YZdd #dependencyStart,#mermaid-svg-Jd0YeFIcIo62YZdd #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-Jd0YeFIcIo62YZdd .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Jd0YeFIcIo62YZdd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComM FULL_COM
控制器/收发器确认
ComM SILENT_COM
ComM FULL_COM
ControllerBusOff
恢复策略完成
恢复失败/请求 NO_COM
ComM NO_COM
ComM NO_COM
ComM NO_COM
PRE_NOCOM
PRE_FULLCOM
FULLCOM
SILENTCOM
SILENTCOM_BOR
3.1 状态含义
| 状态 | 进入条件 | 主要动作 | 离开条件 |
|---|---|---|---|
| PRE-NOCOM | 初始化、NO-COM 或停网 | 停止控制器、收发器置低功耗/静默、关闭 PDU | 收到 FULL-COM 或唤醒触发 |
| PRE-FULLCOM | 请求 FULL-COM | 清唤醒标志、启动收发器和控制器、设置默认波特率 | 所有异步确认成功或超时 |
| FULLCOM | 启动动作完成 | 允许 Tx/Rx,通知 BswM/ComM | SILENT-COM、NO-COM、Bus-Off |
| SILENTCOM | 请求 SILENT-COM | 保持接收,禁止发送或按配置切换 PDU 模式 | FULL-COM 或 NO-COM |
| SILENTCOM-BOR | Bus-Off 恢复 | 停止/重启控制器,等待 Bus-Off 延时,执行恢复次数策略 | 恢复成功、达到限制或 NO-COM |
| CHANGE-BAUDRATE | 配置或恢复时改波特率 | 关闭通信、调用 CanIf 设置速率、重新启动 | 设置确认成功/失败 |
| WAKEUP VALIDATION | 低功耗唤醒 | 检查收发器唤醒标志并验证网络 | 验证成功、失败或超时 |
3.2 状态动作分解
| 状态/子状态 | 进入时一次性动作 | 主函数周期动作 | 成功出口 | 失败出口 |
|---|---|---|---|---|
| PRE-NOCOM | 清空挂起事件,关闭 PDU | 等待新通信请求或唤醒事件 | PRE-FULLCOM/唤醒验证 | 保持 PRE-NOCOM |
| PRE-FULLCOM | 清 WUF,准备收发器 | 轮询异步确认和超时 | FULLCOM | PRE-NOCOM 或 Dem 错误 |
| FULLCOM | 置 PDU ONLINE | 处理 Bus-Off、模式请求 | SILENTCOM/ PRE-NOCOM | SILENTCOM-BOR |
| SILENTCOM | 置发送路径关闭 | 允许接收和模式切换 | FULLCOM | PRE-NOCOM |
| SILENTCOM-BOR | 置 Bus-Off 标志、停止发送 | 延时、重启、计数恢复次数 | FULLCOM | PRE-NOCOM/错误锁定 |
| CHANGE-BAUDRATE | PDU OFFLINE、控制器停止 | 等待速率设置结果 | 原目标通信状态 | 回退到 PRE-NOCOM |
| WAKEUP VALIDATION | 启动验证定时器 | 等待唤醒确认/PN 确认 | PRE-FULLCOM | 低功耗或失败 |
3.3 状态转换判定顺序
#mermaid-svg-suxSdVYbVoxHktLQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-suxSdVYbVoxHktLQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-suxSdVYbVoxHktLQ .error-icon{fill:#552222;}#mermaid-svg-suxSdVYbVoxHktLQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-suxSdVYbVoxHktLQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-suxSdVYbVoxHktLQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-suxSdVYbVoxHktLQ .marker.cross{stroke:#333333;}#mermaid-svg-suxSdVYbVoxHktLQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-suxSdVYbVoxHktLQ p{margin:0;}#mermaid-svg-suxSdVYbVoxHktLQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-suxSdVYbVoxHktLQ .cluster-label text{fill:#333;}#mermaid-svg-suxSdVYbVoxHktLQ .cluster-label span{color:#333;}#mermaid-svg-suxSdVYbVoxHktLQ .cluster-label span p{background-color:transparent;}#mermaid-svg-suxSdVYbVoxHktLQ .label text,#mermaid-svg-suxSdVYbVoxHktLQ span{fill:#333;color:#333;}#mermaid-svg-suxSdVYbVoxHktLQ .node rect,#mermaid-svg-suxSdVYbVoxHktLQ .node circle,#mermaid-svg-suxSdVYbVoxHktLQ .node ellipse,#mermaid-svg-suxSdVYbVoxHktLQ .node polygon,#mermaid-svg-suxSdVYbVoxHktLQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-suxSdVYbVoxHktLQ .rough-node .label text,#mermaid-svg-suxSdVYbVoxHktLQ .node .label text,#mermaid-svg-suxSdVYbVoxHktLQ .image-shape .label,#mermaid-svg-suxSdVYbVoxHktLQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-suxSdVYbVoxHktLQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-suxSdVYbVoxHktLQ .rough-node .label,#mermaid-svg-suxSdVYbVoxHktLQ .node .label,#mermaid-svg-suxSdVYbVoxHktLQ .image-shape .label,#mermaid-svg-suxSdVYbVoxHktLQ .icon-shape .label{text-align:center;}#mermaid-svg-suxSdVYbVoxHktLQ .node.clickable{cursor:pointer;}#mermaid-svg-suxSdVYbVoxHktLQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-suxSdVYbVoxHktLQ .arrowheadPath{fill:#333333;}#mermaid-svg-suxSdVYbVoxHktLQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-suxSdVYbVoxHktLQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-suxSdVYbVoxHktLQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-suxSdVYbVoxHktLQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-suxSdVYbVoxHktLQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-suxSdVYbVoxHktLQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-suxSdVYbVoxHktLQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-suxSdVYbVoxHktLQ .cluster text{fill:#333;}#mermaid-svg-suxSdVYbVoxHktLQ .cluster span{color:#333;}#mermaid-svg-suxSdVYbVoxHktLQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-suxSdVYbVoxHktLQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-suxSdVYbVoxHktLQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-suxSdVYbVoxHktLQ .icon-shape,#mermaid-svg-suxSdVYbVoxHktLQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-suxSdVYbVoxHktLQ .icon-shape p,#mermaid-svg-suxSdVYbVoxHktLQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-suxSdVYbVoxHktLQ .icon-shape .label rect,#mermaid-svg-suxSdVYbVoxHktLQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-suxSdVYbVoxHktLQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-suxSdVYbVoxHktLQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-suxSdVYbVoxHktLQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
是
否
CanSM_MainFunction
是否有 NO_COM 请求?
优先执行停网动作
是否有 Bus-Off 事件?
进入 SILENTCOM_BOR
是否有唤醒/PN事件?
执行唤醒验证
是否有 FULL/SILENT 请求?
执行目标模式动作
维持当前状态并检查超时
NO-COM 的优先级高于启动请求,Bus-Off 事件高于普通稳定态处理;具体优先级应以生成代码和有效配置为准,不能只看上层请求日志判断最终状态。
4. 操作序列
4.1 初始化与首次通信
BswM CanIf CanSM EcuM/BswM BswM CanIf CanSM EcuM/BswM #mermaid-svg-SMCt3GOUOtfo3JNo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SMCt3GOUOtfo3JNo .error-icon{fill:#552222;}#mermaid-svg-SMCt3GOUOtfo3JNo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SMCt3GOUOtfo3JNo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SMCt3GOUOtfo3JNo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SMCt3GOUOtfo3JNo .marker.cross{stroke:#333333;}#mermaid-svg-SMCt3GOUOtfo3JNo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SMCt3GOUOtfo3JNo p{margin:0;}#mermaid-svg-SMCt3GOUOtfo3JNo .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SMCt3GOUOtfo3JNo text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SMCt3GOUOtfo3JNo .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-SMCt3GOUOtfo3JNo .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-SMCt3GOUOtfo3JNo #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-SMCt3GOUOtfo3JNo .sequenceNumber{fill:white;}#mermaid-svg-SMCt3GOUOtfo3JNo #sequencenumber{fill:#333;}#mermaid-svg-SMCt3GOUOtfo3JNo #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-SMCt3GOUOtfo3JNo .messageText{fill:#333;stroke:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SMCt3GOUOtfo3JNo .labelText,#mermaid-svg-SMCt3GOUOtfo3JNo .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .loopText,#mermaid-svg-SMCt3GOUOtfo3JNo .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SMCt3GOUOtfo3JNo .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-SMCt3GOUOtfo3JNo .noteText,#mermaid-svg-SMCt3GOUOtfo3JNo .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-SMCt3GOUOtfo3JNo .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SMCt3GOUOtfo3JNo .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SMCt3GOUOtfo3JNo .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SMCt3GOUOtfo3JNo .actorPopupMenu{position:absolute;}#mermaid-svg-SMCt3GOUOtfo3JNo .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-SMCt3GOUOtfo3JNo .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SMCt3GOUOtfo3JNo .actor-man circle,#mermaid-svg-SMCt3GOUOtfo3JNo line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-SMCt3GOUOtfo3JNo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CanSM_Init(ConfigPtr) 建立每网络上下文,置 PRE-NOCOM 设置控制器/收发器低功耗或静默 CanSM_RequestComMode(net,FULL_COM) 清唤醒标志/启动收发器 TransceiverModeIndication ControllerMode(STARTED) ControllerModeIndication 设置 PDU ONLINE BswM_CanSM_CurrentState(FULLCOM)
初始化必须在依赖模块完成初始化后执行;ConfigPtr 的网络数量、控制器映射、收发器映射和 Bus-Off 参数必须来自同一套生成配置。未初始化状态调用服务 API 时,应按规范分类为开发错误并返回失败。
4.2 通信请求处理
#mermaid-svg-LIDOCUKtzKf147Zo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LIDOCUKtzKf147Zo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LIDOCUKtzKf147Zo .error-icon{fill:#552222;}#mermaid-svg-LIDOCUKtzKf147Zo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LIDOCUKtzKf147Zo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LIDOCUKtzKf147Zo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LIDOCUKtzKf147Zo .marker.cross{stroke:#333333;}#mermaid-svg-LIDOCUKtzKf147Zo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LIDOCUKtzKf147Zo p{margin:0;}#mermaid-svg-LIDOCUKtzKf147Zo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LIDOCUKtzKf147Zo .cluster-label text{fill:#333;}#mermaid-svg-LIDOCUKtzKf147Zo .cluster-label span{color:#333;}#mermaid-svg-LIDOCUKtzKf147Zo .cluster-label span p{background-color:transparent;}#mermaid-svg-LIDOCUKtzKf147Zo .label text,#mermaid-svg-LIDOCUKtzKf147Zo span{fill:#333;color:#333;}#mermaid-svg-LIDOCUKtzKf147Zo .node rect,#mermaid-svg-LIDOCUKtzKf147Zo .node circle,#mermaid-svg-LIDOCUKtzKf147Zo .node ellipse,#mermaid-svg-LIDOCUKtzKf147Zo .node polygon,#mermaid-svg-LIDOCUKtzKf147Zo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LIDOCUKtzKf147Zo .rough-node .label text,#mermaid-svg-LIDOCUKtzKf147Zo .node .label text,#mermaid-svg-LIDOCUKtzKf147Zo .image-shape .label,#mermaid-svg-LIDOCUKtzKf147Zo .icon-shape .label{text-anchor:middle;}#mermaid-svg-LIDOCUKtzKf147Zo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LIDOCUKtzKf147Zo .rough-node .label,#mermaid-svg-LIDOCUKtzKf147Zo .node .label,#mermaid-svg-LIDOCUKtzKf147Zo .image-shape .label,#mermaid-svg-LIDOCUKtzKf147Zo .icon-shape .label{text-align:center;}#mermaid-svg-LIDOCUKtzKf147Zo .node.clickable{cursor:pointer;}#mermaid-svg-LIDOCUKtzKf147Zo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LIDOCUKtzKf147Zo .arrowheadPath{fill:#333333;}#mermaid-svg-LIDOCUKtzKf147Zo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LIDOCUKtzKf147Zo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LIDOCUKtzKf147Zo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LIDOCUKtzKf147Zo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LIDOCUKtzKf147Zo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LIDOCUKtzKf147Zo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LIDOCUKtzKf147Zo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LIDOCUKtzKf147Zo .cluster text{fill:#333;}#mermaid-svg-LIDOCUKtzKf147Zo .cluster span{color:#333;}#mermaid-svg-LIDOCUKtzKf147Zo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LIDOCUKtzKf147Zo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LIDOCUKtzKf147Zo rect.text{fill:none;stroke-width:0;}#mermaid-svg-LIDOCUKtzKf147Zo .icon-shape,#mermaid-svg-LIDOCUKtzKf147Zo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LIDOCUKtzKf147Zo .icon-shape p,#mermaid-svg-LIDOCUKtzKf147Zo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LIDOCUKtzKf147Zo .icon-shape .label rect,#mermaid-svg-LIDOCUKtzKf147Zo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LIDOCUKtzKf147Zo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LIDOCUKtzKf147Zo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LIDOCUKtzKf147Zo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} NO_COM
SILENT_COM
FULL_COM
是
否/超时
收到 ComM 请求
请求模式
关闭 Tx/Rx
控制器运行但禁止发送
启动控制器和收发器
等待异步确认
确认成功?
更新状态并通知 BswM
错误处理、Dem/Det、重试或回退
同一网络的新请求应覆盖旧请求,但不能打断一个必须成对完成的底层操作。实现中应保存 requestedComMode 与 currentComMode,把模式确认作为事件驱动输入,由 CanSM_MainFunction 消化,避免在回调中执行长流程。
4.3 NO-COM 停网交互
BswM CanIf CanSM ComM BswM CanIf CanSM ComM #mermaid-svg-Jzju0nCtA077BuiE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Jzju0nCtA077BuiE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Jzju0nCtA077BuiE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Jzju0nCtA077BuiE .error-icon{fill:#552222;}#mermaid-svg-Jzju0nCtA077BuiE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Jzju0nCtA077BuiE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Jzju0nCtA077BuiE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Jzju0nCtA077BuiE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Jzju0nCtA077BuiE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Jzju0nCtA077BuiE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Jzju0nCtA077BuiE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Jzju0nCtA077BuiE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Jzju0nCtA077BuiE .marker.cross{stroke:#333333;}#mermaid-svg-Jzju0nCtA077BuiE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Jzju0nCtA077BuiE p{margin:0;}#mermaid-svg-Jzju0nCtA077BuiE .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Jzju0nCtA077BuiE text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Jzju0nCtA077BuiE .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Jzju0nCtA077BuiE .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Jzju0nCtA077BuiE .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Jzju0nCtA077BuiE .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Jzju0nCtA077BuiE #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Jzju0nCtA077BuiE .sequenceNumber{fill:white;}#mermaid-svg-Jzju0nCtA077BuiE #sequencenumber{fill:#333;}#mermaid-svg-Jzju0nCtA077BuiE #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Jzju0nCtA077BuiE .messageText{fill:#333;stroke:none;}#mermaid-svg-Jzju0nCtA077BuiE .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Jzju0nCtA077BuiE .labelText,#mermaid-svg-Jzju0nCtA077BuiE .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Jzju0nCtA077BuiE .loopText,#mermaid-svg-Jzju0nCtA077BuiE .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Jzju0nCtA077BuiE .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Jzju0nCtA077BuiE .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Jzju0nCtA077BuiE .noteText,#mermaid-svg-Jzju0nCtA077BuiE .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Jzju0nCtA077BuiE .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Jzju0nCtA077BuiE .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Jzju0nCtA077BuiE .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Jzju0nCtA077BuiE .actorPopupMenu{position:absolute;}#mermaid-svg-Jzju0nCtA077BuiE .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Jzju0nCtA077BuiE .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Jzju0nCtA077BuiE .actor-man circle,#mermaid-svg-Jzju0nCtA077BuiE line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Jzju0nCtA077BuiE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RequestComMode(NO_COM) PDU OFFLINE Controller STOPPED ControllerModeIndication(STOPPED) Transceiver STANDBY/SLEEP TransceiverModeIndication 通知 PRE_NOCOM 当前模式 NO_COM
4.4 SILENT-COM 与 FULL-COM 切换
BswM CanIf CanSM ComM BswM CanIf CanSM ComM #mermaid-svg-FhxdwvDvj0itZ1OV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FhxdwvDvj0itZ1OV .error-icon{fill:#552222;}#mermaid-svg-FhxdwvDvj0itZ1OV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FhxdwvDvj0itZ1OV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FhxdwvDvj0itZ1OV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FhxdwvDvj0itZ1OV .marker.cross{stroke:#333333;}#mermaid-svg-FhxdwvDvj0itZ1OV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FhxdwvDvj0itZ1OV p{margin:0;}#mermaid-svg-FhxdwvDvj0itZ1OV .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FhxdwvDvj0itZ1OV text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FhxdwvDvj0itZ1OV .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-FhxdwvDvj0itZ1OV .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-FhxdwvDvj0itZ1OV #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-FhxdwvDvj0itZ1OV .sequenceNumber{fill:white;}#mermaid-svg-FhxdwvDvj0itZ1OV #sequencenumber{fill:#333;}#mermaid-svg-FhxdwvDvj0itZ1OV #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-FhxdwvDvj0itZ1OV .messageText{fill:#333;stroke:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FhxdwvDvj0itZ1OV .labelText,#mermaid-svg-FhxdwvDvj0itZ1OV .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .loopText,#mermaid-svg-FhxdwvDvj0itZ1OV .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FhxdwvDvj0itZ1OV .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-FhxdwvDvj0itZ1OV .noteText,#mermaid-svg-FhxdwvDvj0itZ1OV .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-FhxdwvDvj0itZ1OV .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FhxdwvDvj0itZ1OV .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FhxdwvDvj0itZ1OV .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FhxdwvDvj0itZ1OV .actorPopupMenu{position:absolute;}#mermaid-svg-FhxdwvDvj0itZ1OV .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-FhxdwvDvj0itZ1OV .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FhxdwvDvj0itZ1OV .actor-man circle,#mermaid-svg-FhxdwvDvj0itZ1OV line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-FhxdwvDvj0itZ1OV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RequestComMode(SILENT_COM) PDU mode = OFFLINE/RECEIVE_ONLY PDU mode confirmation SILENTCOM RequestComMode(FULL_COM) PDU mode = ONLINE PDU mode confirmation FULLCOM
4.5 Bus-Off 恢复交互
Bus-Off 由 CanIf 回调 CanSM_ControllerBusOff 报告。CanSM 根据配置进入恢复状态,禁止继续发送,等待 Bus-Off 延时,然后重启控制器并等待模式确认。R25-11 支持按 SAE 等要求进行 Bus-Off 延时适配,实际延时仍以有效配置和底层能力为准。
Dem CanSM CanIf Dem CanSM CanIf #mermaid-svg-2sHae0NDHvmE8SaM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2sHae0NDHvmE8SaM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2sHae0NDHvmE8SaM .error-icon{fill:#552222;}#mermaid-svg-2sHae0NDHvmE8SaM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2sHae0NDHvmE8SaM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2sHae0NDHvmE8SaM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2sHae0NDHvmE8SaM .marker.cross{stroke:#333333;}#mermaid-svg-2sHae0NDHvmE8SaM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2sHae0NDHvmE8SaM p{margin:0;}#mermaid-svg-2sHae0NDHvmE8SaM .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2sHae0NDHvmE8SaM text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-2sHae0NDHvmE8SaM .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2sHae0NDHvmE8SaM .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-2sHae0NDHvmE8SaM .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-2sHae0NDHvmE8SaM .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-2sHae0NDHvmE8SaM #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-2sHae0NDHvmE8SaM .sequenceNumber{fill:white;}#mermaid-svg-2sHae0NDHvmE8SaM #sequencenumber{fill:#333;}#mermaid-svg-2sHae0NDHvmE8SaM #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-2sHae0NDHvmE8SaM .messageText{fill:#333;stroke:none;}#mermaid-svg-2sHae0NDHvmE8SaM .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2sHae0NDHvmE8SaM .labelText,#mermaid-svg-2sHae0NDHvmE8SaM .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-2sHae0NDHvmE8SaM .loopText,#mermaid-svg-2sHae0NDHvmE8SaM .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-2sHae0NDHvmE8SaM .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2sHae0NDHvmE8SaM .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-2sHae0NDHvmE8SaM .noteText,#mermaid-svg-2sHae0NDHvmE8SaM .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-2sHae0NDHvmE8SaM .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2sHae0NDHvmE8SaM .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2sHae0NDHvmE8SaM .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2sHae0NDHvmE8SaM .actorPopupMenu{position:absolute;}#mermaid-svg-2sHae0NDHvmE8SaM .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-2sHae0NDHvmE8SaM .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2sHae0NDHvmE8SaM .actor-man circle,#mermaid-svg-2sHae0NDHvmE8SaM line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-2sHae0NDHvmE8SaM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CanSM_ControllerBusOff(ctrl) 标记 BusOff,进入 SILENTCOM_BOR Controller STOPPED ControllerModeIndication(STOPPED) 等待 BorTime / 计数器到期 Controller STARTED ControllerModeIndication(STARTED) PDU ONLINE(若恢复成功) 报告恢复成功或达到恢复限制
Bus-Off 排查表
| 现象 | 首先检查 | 常见根因 |
|---|---|---|
| 回调未进入 CanSM | CanIf 控制器到网络映射、回调注册 | 回调函数名或控制器索引错误 |
| 进入恢复但不重启 | CanIf 模式确认、主函数周期 | 异步确认丢失、SchM 未调度 |
| 反复 Bus-Off | CAN 物理层、终端电阻、波特率 | 采样点/时钟/布线不匹配 |
| 恢复后无报文 | PDU 模式和 ComM 状态 | PDU 未切 ONLINE 或仍是 SILENT |
| 过早判定失败 | BorTime、恢复次数配置 | 配置单位或计数溢出错误 |
4.6 唤醒流程
唤醒分为启动唤醒源、收发器唤醒标志清除、唤醒标志检查和唤醒验证。CanSM_StartWakeupSource 与 CanSM_StopWakeupSource 只改变请求,实际底层动作由状态机执行。
#mermaid-svg-wB4XwElozS4jXurp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wB4XwElozS4jXurp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wB4XwElozS4jXurp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wB4XwElozS4jXurp .error-icon{fill:#552222;}#mermaid-svg-wB4XwElozS4jXurp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wB4XwElozS4jXurp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wB4XwElozS4jXurp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wB4XwElozS4jXurp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wB4XwElozS4jXurp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wB4XwElozS4jXurp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wB4XwElozS4jXurp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wB4XwElozS4jXurp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wB4XwElozS4jXurp .marker.cross{stroke:#333333;}#mermaid-svg-wB4XwElozS4jXurp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wB4XwElozS4jXurp p{margin:0;}#mermaid-svg-wB4XwElozS4jXurp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wB4XwElozS4jXurp .cluster-label text{fill:#333;}#mermaid-svg-wB4XwElozS4jXurp .cluster-label span{color:#333;}#mermaid-svg-wB4XwElozS4jXurp .cluster-label span p{background-color:transparent;}#mermaid-svg-wB4XwElozS4jXurp .label text,#mermaid-svg-wB4XwElozS4jXurp span{fill:#333;color:#333;}#mermaid-svg-wB4XwElozS4jXurp .node rect,#mermaid-svg-wB4XwElozS4jXurp .node circle,#mermaid-svg-wB4XwElozS4jXurp .node ellipse,#mermaid-svg-wB4XwElozS4jXurp .node polygon,#mermaid-svg-wB4XwElozS4jXurp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wB4XwElozS4jXurp .rough-node .label text,#mermaid-svg-wB4XwElozS4jXurp .node .label text,#mermaid-svg-wB4XwElozS4jXurp .image-shape .label,#mermaid-svg-wB4XwElozS4jXurp .icon-shape .label{text-anchor:middle;}#mermaid-svg-wB4XwElozS4jXurp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wB4XwElozS4jXurp .rough-node .label,#mermaid-svg-wB4XwElozS4jXurp .node .label,#mermaid-svg-wB4XwElozS4jXurp .image-shape .label,#mermaid-svg-wB4XwElozS4jXurp .icon-shape .label{text-align:center;}#mermaid-svg-wB4XwElozS4jXurp .node.clickable{cursor:pointer;}#mermaid-svg-wB4XwElozS4jXurp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wB4XwElozS4jXurp .arrowheadPath{fill:#333333;}#mermaid-svg-wB4XwElozS4jXurp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wB4XwElozS4jXurp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wB4XwElozS4jXurp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wB4XwElozS4jXurp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wB4XwElozS4jXurp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wB4XwElozS4jXurp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wB4XwElozS4jXurp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wB4XwElozS4jXurp .cluster text{fill:#333;}#mermaid-svg-wB4XwElozS4jXurp .cluster span{color:#333;}#mermaid-svg-wB4XwElozS4jXurp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wB4XwElozS4jXurp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wB4XwElozS4jXurp rect.text{fill:none;stroke-width:0;}#mermaid-svg-wB4XwElozS4jXurp .icon-shape,#mermaid-svg-wB4XwElozS4jXurp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wB4XwElozS4jXurp .icon-shape p,#mermaid-svg-wB4XwElozS4jXurp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wB4XwElozS4jXurp .icon-shape .label rect,#mermaid-svg-wB4XwElozS4jXurp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wB4XwElozS4jXurp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wB4XwElozS4jXurp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wB4XwElozS4jXurp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
检测唤醒请求
StartWakeupSource
清除 WUF 标志
检查收发器唤醒标志
唤醒有效?
回到低功耗/报告失败
启动控制器
等待 Controller STARTED
进入 PRE/FULLCOM 并通知上层
唤醒验证期间不能把"检测到引脚变化"直接当成网络有效唤醒;应结合收发器确认、验证定时器和配置的唤醒源。PN(Partial Networking)启用时还要等待 CanSM_ConfirmPnAvailability 或 CanSM_ConfirmCtrlPnAvailability 对应确认。
4.7 波特率切换
波特率切换属于受控停机和重新启动流程:先停止通信并确认控制器已停止,再调用 CanIf 设置目标速率,最后重新启动并恢复 PDU 模式。切换中收到 NO-COM 时应优先回退到 PRE-NOCOM。
CanIf CanSM CanIf CanSM #mermaid-svg-XF9xtkT1SOVQnpb5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XF9xtkT1SOVQnpb5 .error-icon{fill:#552222;}#mermaid-svg-XF9xtkT1SOVQnpb5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XF9xtkT1SOVQnpb5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XF9xtkT1SOVQnpb5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XF9xtkT1SOVQnpb5 .marker.cross{stroke:#333333;}#mermaid-svg-XF9xtkT1SOVQnpb5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XF9xtkT1SOVQnpb5 p{margin:0;}#mermaid-svg-XF9xtkT1SOVQnpb5 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-XF9xtkT1SOVQnpb5 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-XF9xtkT1SOVQnpb5 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-XF9xtkT1SOVQnpb5 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-XF9xtkT1SOVQnpb5 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-XF9xtkT1SOVQnpb5 .sequenceNumber{fill:white;}#mermaid-svg-XF9xtkT1SOVQnpb5 #sequencenumber{fill:#333;}#mermaid-svg-XF9xtkT1SOVQnpb5 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-XF9xtkT1SOVQnpb5 .messageText{fill:#333;stroke:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-XF9xtkT1SOVQnpb5 .labelText,#mermaid-svg-XF9xtkT1SOVQnpb5 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .loopText,#mermaid-svg-XF9xtkT1SOVQnpb5 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-XF9xtkT1SOVQnpb5 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-XF9xtkT1SOVQnpb5 .noteText,#mermaid-svg-XF9xtkT1SOVQnpb5 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-XF9xtkT1SOVQnpb5 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-XF9xtkT1SOVQnpb5 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-XF9xtkT1SOVQnpb5 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-XF9xtkT1SOVQnpb5 .actorPopupMenu{position:absolute;}#mermaid-svg-XF9xtkT1SOVQnpb5 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-XF9xtkT1SOVQnpb5 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-XF9xtkT1SOVQnpb5 .actor-man circle,#mermaid-svg-XF9xtkT1SOVQnpb5 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-XF9xtkT1SOVQnpb5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} alt 成功 失败 PDU OFFLINE Controller STOPPED STOPPED indication SetBaudrate / ChangeBaudrate 设置结果 Controller STARTED STARTED indication PDU ONLINE 错误处理并回退
4.8 Tx 超时异常交互
ComM Dem CanSM CanIf ComM Dem CanSM CanIf #mermaid-svg-jZoZMArGCfGshU2M{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jZoZMArGCfGshU2M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jZoZMArGCfGshU2M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jZoZMArGCfGshU2M .error-icon{fill:#552222;}#mermaid-svg-jZoZMArGCfGshU2M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jZoZMArGCfGshU2M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jZoZMArGCfGshU2M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jZoZMArGCfGshU2M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jZoZMArGCfGshU2M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jZoZMArGCfGshU2M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jZoZMArGCfGshU2M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jZoZMArGCfGshU2M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jZoZMArGCfGshU2M .marker.cross{stroke:#333333;}#mermaid-svg-jZoZMArGCfGshU2M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jZoZMArGCfGshU2M p{margin:0;}#mermaid-svg-jZoZMArGCfGshU2M .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-jZoZMArGCfGshU2M text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-jZoZMArGCfGshU2M .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-jZoZMArGCfGshU2M .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-jZoZMArGCfGshU2M .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-jZoZMArGCfGshU2M .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-jZoZMArGCfGshU2M #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-jZoZMArGCfGshU2M .sequenceNumber{fill:white;}#mermaid-svg-jZoZMArGCfGshU2M #sequencenumber{fill:#333;}#mermaid-svg-jZoZMArGCfGshU2M #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-jZoZMArGCfGshU2M .messageText{fill:#333;stroke:none;}#mermaid-svg-jZoZMArGCfGshU2M .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-jZoZMArGCfGshU2M .labelText,#mermaid-svg-jZoZMArGCfGshU2M .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-jZoZMArGCfGshU2M .loopText,#mermaid-svg-jZoZMArGCfGshU2M .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-jZoZMArGCfGshU2M .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-jZoZMArGCfGshU2M .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-jZoZMArGCfGshU2M .noteText,#mermaid-svg-jZoZMArGCfGshU2M .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-jZoZMArGCfGshU2M .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-jZoZMArGCfGshU2M .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-jZoZMArGCfGshU2M .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-jZoZMArGCfGshU2M .actorPopupMenu{position:absolute;}#mermaid-svg-jZoZMArGCfGshU2M .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-jZoZMArGCfGshU2M .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-jZoZMArGCfGshU2M .actor-man circle,#mermaid-svg-jZoZMArGCfGshU2M line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-jZoZMArGCfGshU2M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} alt 配置为恢复触发 仅诊断记录 CanSM_TxTimeoutException(ctrl) 记录异常并关联网络 报告 Tx timeout 事件 进入恢复子状态 保持当前通信模式
4.9 多网络并行调度
Network_2 Network_1 CanSM SchM Network_2 Network_1 CanSM SchM #mermaid-svg-nm9ltTb44fshLXcc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nm9ltTb44fshLXcc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nm9ltTb44fshLXcc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nm9ltTb44fshLXcc .error-icon{fill:#552222;}#mermaid-svg-nm9ltTb44fshLXcc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nm9ltTb44fshLXcc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nm9ltTb44fshLXcc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nm9ltTb44fshLXcc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nm9ltTb44fshLXcc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nm9ltTb44fshLXcc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nm9ltTb44fshLXcc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nm9ltTb44fshLXcc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nm9ltTb44fshLXcc .marker.cross{stroke:#333333;}#mermaid-svg-nm9ltTb44fshLXcc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nm9ltTb44fshLXcc p{margin:0;}#mermaid-svg-nm9ltTb44fshLXcc .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nm9ltTb44fshLXcc text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-nm9ltTb44fshLXcc .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nm9ltTb44fshLXcc .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-nm9ltTb44fshLXcc .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nm9ltTb44fshLXcc .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nm9ltTb44fshLXcc #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nm9ltTb44fshLXcc .sequenceNumber{fill:white;}#mermaid-svg-nm9ltTb44fshLXcc #sequencenumber{fill:#333;}#mermaid-svg-nm9ltTb44fshLXcc #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nm9ltTb44fshLXcc .messageText{fill:#333;stroke:none;}#mermaid-svg-nm9ltTb44fshLXcc .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nm9ltTb44fshLXcc .labelText,#mermaid-svg-nm9ltTb44fshLXcc .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-nm9ltTb44fshLXcc .loopText,#mermaid-svg-nm9ltTb44fshLXcc .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-nm9ltTb44fshLXcc .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nm9ltTb44fshLXcc .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nm9ltTb44fshLXcc .noteText,#mermaid-svg-nm9ltTb44fshLXcc .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-nm9ltTb44fshLXcc .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nm9ltTb44fshLXcc .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nm9ltTb44fshLXcc .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nm9ltTb44fshLXcc .actorPopupMenu{position:absolute;}#mermaid-svg-nm9ltTb44fshLXcc .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nm9ltTb44fshLXcc .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nm9ltTb44fshLXcc .actor-man circle,#mermaid-svg-nm9ltTb44fshLXcc line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nm9ltTb44fshLXcc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CanSM_MainFunction() 处理请求/超时/回调事件 提交状态或等待确认 处理请求/超时/回调事件 提交状态或等待确认 返回
主函数每周期遍历所有网络;一个网络等待底层确认时,不能阻塞其他网络的状态推进。
4.10 操作序列检查点
| 操作 | 请求入口 | 必须等待的确认 | 状态提交点 | 超时后的处理 |
|---|---|---|---|---|
| 启动 FULL-COM | CanSM_RequestComMode |
收发器、控制器、PDU 模式 | FULLCOM |
回退并报告错误 |
| 进入 SILENT-COM | CanSM_RequestComMode |
PDU 接收/发送模式 | SILENTCOM |
保持旧状态或回退 |
| 停止 NO-COM | CanSM_RequestComMode |
控制器 STOPPED、收发器确认 | PRE_NOCOM |
重试或锁定错误 |
| Bus-Off 恢复 | CanSM_ControllerBusOff |
STOPPED、延时、STARTED | FULLCOM 或 SILENTCOM_BOR |
增加恢复计数 |
| 唤醒验证 | CanSM_StartWakeupSource |
WUF/PN/控制器确认 | PRE_FULLCOM |
重新休眠 |
| 改波特率 | 配置或诊断触发 | STOPPED、设置结果、STARTED | 目标通信状态 | 回退 NO-COM |
5. 配置模型
5.1 配置对象关系
#mermaid-svg-iuryJZptWrbBofAE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iuryJZptWrbBofAE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iuryJZptWrbBofAE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iuryJZptWrbBofAE .error-icon{fill:#552222;}#mermaid-svg-iuryJZptWrbBofAE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iuryJZptWrbBofAE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iuryJZptWrbBofAE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iuryJZptWrbBofAE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iuryJZptWrbBofAE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iuryJZptWrbBofAE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iuryJZptWrbBofAE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iuryJZptWrbBofAE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iuryJZptWrbBofAE .marker.cross{stroke:#333333;}#mermaid-svg-iuryJZptWrbBofAE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iuryJZptWrbBofAE p{margin:0;}#mermaid-svg-iuryJZptWrbBofAE .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-iuryJZptWrbBofAE .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-iuryJZptWrbBofAE .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-iuryJZptWrbBofAE .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-iuryJZptWrbBofAE .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-iuryJZptWrbBofAE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iuryJZptWrbBofAE .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-iuryJZptWrbBofAE .node rect,#mermaid-svg-iuryJZptWrbBofAE .node circle,#mermaid-svg-iuryJZptWrbBofAE .node ellipse,#mermaid-svg-iuryJZptWrbBofAE .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iuryJZptWrbBofAE .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-iuryJZptWrbBofAE .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iuryJZptWrbBofAE .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iuryJZptWrbBofAE .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-iuryJZptWrbBofAE .edgeLabel .label text{fill:#333;}#mermaid-svg-iuryJZptWrbBofAE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} contains
uses
configures
maps_to
controls
controls
CANSM_NETWORK
uint8
NetworkHandle
enum
InitialState
uint16
MainFunctionPeriod
CANSM_CONTROLLER
CANSM_TRANSCEIVER
CANSM_BOR
uint32
BorTime
uint16
RecoveryAttempts
enum
RecoveryMode
COMM_CHANNEL
CANIF_CONTROLLER
CANIF_TRANSCEIVER
配置生成后应重点核对 NetworkHandle、ControllerId、TransceiverId、ComM Channel 和 CanIf PDU group 的映射;任何一个索引错位都会表现为"请求已发出但确认不到达"。
5.2 关键配置参数
| 配置类别 | 典型参数 | 影响 |
|---|---|---|
| 网络映射 | NetworkHandle、ComM Channel | 决定请求进入哪一个网络状态机 |
| 控制器 | CanIf ControllerId、默认模式 | 决定启动/停止命令的目标硬件 |
| 收发器 | TransceiverId、唤醒支持 | 决定低功耗、WUF 和唤醒验证路径 |
| 调度 | MainFunction 周期 | 决定超时计数和状态推进粒度 |
| Bus-Off | BorTime、恢复次数、恢复模式 | 决定故障后的等待和重启策略 |
| PDU | Tx/Rx PDU group、ONLINE/OFFLINE 策略 | 决定报文是否真正进入通信路径 |
| 波特率 | Baudrate 配置集、切换允许 | 决定 CHANGE-BAUDRATE 的可用分支 |
| 诊断 | Dem EventId、Det 开关 | 决定错误是否可追踪和如何去抖 |
5.3 API 行为与前置条件
| API | 前置条件 | 成功语义 | 常见错误 |
|---|---|---|---|
CanSM_Init |
CanIf/Det/SchM 依赖已初始化 | 所有网络进入初始状态 | 重复初始化、空配置指针 |
CanSM_DeInit |
模块已初始化且网络可停机 | 释放运行时状态 | 仍有未完成底层动作 |
CanSM_RequestComMode |
NetworkHandle 有效 | 接收并排队通信请求 | 非法句柄、非法模式、未初始化 |
CanSM_GetCurrentComMode |
输出指针有效 | 返回已提交状态 | 输出指针为空、句柄无效 |
CanSM_StartWakeupSource |
唤醒功能已配置 | 打开唤醒处理窗口 | 不支持唤醒源 |
CanSM_StopWakeupSource |
唤醒窗口已打开 | 关闭唤醒处理窗口 | 状态不匹配 |
CanSM_MainFunction |
已加入 SchM 周期 | 推进所有网络 | 未调度或周期单位错误 |
5.4 配置到运行时的验证链
#mermaid-svg-zcLtr76sNPttJEU0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zcLtr76sNPttJEU0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zcLtr76sNPttJEU0 .error-icon{fill:#552222;}#mermaid-svg-zcLtr76sNPttJEU0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zcLtr76sNPttJEU0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zcLtr76sNPttJEU0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zcLtr76sNPttJEU0 .marker.cross{stroke:#333333;}#mermaid-svg-zcLtr76sNPttJEU0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zcLtr76sNPttJEU0 p{margin:0;}#mermaid-svg-zcLtr76sNPttJEU0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zcLtr76sNPttJEU0 .cluster-label text{fill:#333;}#mermaid-svg-zcLtr76sNPttJEU0 .cluster-label span{color:#333;}#mermaid-svg-zcLtr76sNPttJEU0 .cluster-label span p{background-color:transparent;}#mermaid-svg-zcLtr76sNPttJEU0 .label text,#mermaid-svg-zcLtr76sNPttJEU0 span{fill:#333;color:#333;}#mermaid-svg-zcLtr76sNPttJEU0 .node rect,#mermaid-svg-zcLtr76sNPttJEU0 .node circle,#mermaid-svg-zcLtr76sNPttJEU0 .node ellipse,#mermaid-svg-zcLtr76sNPttJEU0 .node polygon,#mermaid-svg-zcLtr76sNPttJEU0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zcLtr76sNPttJEU0 .rough-node .label text,#mermaid-svg-zcLtr76sNPttJEU0 .node .label text,#mermaid-svg-zcLtr76sNPttJEU0 .image-shape .label,#mermaid-svg-zcLtr76sNPttJEU0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zcLtr76sNPttJEU0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zcLtr76sNPttJEU0 .rough-node .label,#mermaid-svg-zcLtr76sNPttJEU0 .node .label,#mermaid-svg-zcLtr76sNPttJEU0 .image-shape .label,#mermaid-svg-zcLtr76sNPttJEU0 .icon-shape .label{text-align:center;}#mermaid-svg-zcLtr76sNPttJEU0 .node.clickable{cursor:pointer;}#mermaid-svg-zcLtr76sNPttJEU0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zcLtr76sNPttJEU0 .arrowheadPath{fill:#333333;}#mermaid-svg-zcLtr76sNPttJEU0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zcLtr76sNPttJEU0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zcLtr76sNPttJEU0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zcLtr76sNPttJEU0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zcLtr76sNPttJEU0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zcLtr76sNPttJEU0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zcLtr76sNPttJEU0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zcLtr76sNPttJEU0 .cluster text{fill:#333;}#mermaid-svg-zcLtr76sNPttJEU0 .cluster span{color:#333;}#mermaid-svg-zcLtr76sNPttJEU0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zcLtr76sNPttJEU0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zcLtr76sNPttJEU0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zcLtr76sNPttJEU0 .icon-shape,#mermaid-svg-zcLtr76sNPttJEU0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zcLtr76sNPttJEU0 .icon-shape p,#mermaid-svg-zcLtr76sNPttJEU0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zcLtr76sNPttJEU0 .icon-shape .label rect,#mermaid-svg-zcLtr76sNPttJEU0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zcLtr76sNPttJEU0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zcLtr76sNPttJEU0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zcLtr76sNPttJEU0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 系统配置
CanSM生成配置
NetworkHandle映射
CanIf Controller/Trcv映射
ComM请求
CanSM状态机
CanIf确认回调
BswM/ComM状态
运行日志与Dem
验证时应从同一份生成配置追踪到运行时日志,不能用手工填写的网络编号替代生成配置中的实际索引。
5.5 API 与回调速查
| 类别 | 接口 | 作用 |
|---|---|---|
| 初始化 | CanSM_Init、CanSM_DeInit |
建立/释放运行时上下文 |
| 模式 | CanSM_RequestComMode、CanSM_GetCurrentComMode |
请求和读取网络通信模式 |
| 唤醒 | CanSM_StartWakeupSource、CanSM_StopWakeupSource |
控制唤醒源窗口 |
| 控制器回调 | CanSM_ControllerBusOff、CanSM_ControllerModeIndication |
报告 Bus-Off 和控制器模式 |
| 收发器回调 | CanSM_TransceiverModeIndication、CanSM_ClearTrcvWufFlagIndication |
报告收发器动作结果 |
| 唤醒回调 | CanSM_CheckTransceiverWakeFlagIndication、CanSM_ConfirmPnAvailability、CanSM_ConfirmCtrlPnAvailability |
完成唤醒/PN 异步确认 |
| 其他回调 | CanSM_TxTimeoutException |
处理配置的 Tx 超时异常 |
| 调度 | CanSM_MainFunction |
推进所有网络状态机和超时计数 |
5.6 伪代码骨架
c
void CanSM_MainFunction(void)
{
for (network = 0; network < CANSM_NETWORK_COUNT; ++network) {
CanSM_NetworkContext *ctx = &CanSM_Context[network];
if (ctx->pendingRequest == CANSM_REQ_FULL_COM) {
CanSM_ProcessPreFullCom(ctx);
} else if (ctx->busOffPending) {
CanSM_ProcessBusOffRecovery(ctx);
} else if (ctx->pendingRequest == CANSM_REQ_NO_COM) {
CanSM_ProcessPreNoCom(ctx);
} else {
CanSM_ProcessSteadyState(ctx);
}
}
}
回调函数只应记录事件、控制器/收发器索引和结果,并唤醒或等待主函数处理;不要在 ISR 或底层回调中直接调用可能阻塞的上层服务。
5.7 工程排查路径
#mermaid-svg-BDX6jazKNjp8sxa4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BDX6jazKNjp8sxa4 .error-icon{fill:#552222;}#mermaid-svg-BDX6jazKNjp8sxa4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BDX6jazKNjp8sxa4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BDX6jazKNjp8sxa4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BDX6jazKNjp8sxa4 .marker.cross{stroke:#333333;}#mermaid-svg-BDX6jazKNjp8sxa4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BDX6jazKNjp8sxa4 p{margin:0;}#mermaid-svg-BDX6jazKNjp8sxa4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 .cluster-label text{fill:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 .cluster-label span{color:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 .cluster-label span p{background-color:transparent;}#mermaid-svg-BDX6jazKNjp8sxa4 .label text,#mermaid-svg-BDX6jazKNjp8sxa4 span{fill:#333;color:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 .node rect,#mermaid-svg-BDX6jazKNjp8sxa4 .node circle,#mermaid-svg-BDX6jazKNjp8sxa4 .node ellipse,#mermaid-svg-BDX6jazKNjp8sxa4 .node polygon,#mermaid-svg-BDX6jazKNjp8sxa4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BDX6jazKNjp8sxa4 .rough-node .label text,#mermaid-svg-BDX6jazKNjp8sxa4 .node .label text,#mermaid-svg-BDX6jazKNjp8sxa4 .image-shape .label,#mermaid-svg-BDX6jazKNjp8sxa4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-BDX6jazKNjp8sxa4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BDX6jazKNjp8sxa4 .rough-node .label,#mermaid-svg-BDX6jazKNjp8sxa4 .node .label,#mermaid-svg-BDX6jazKNjp8sxa4 .image-shape .label,#mermaid-svg-BDX6jazKNjp8sxa4 .icon-shape .label{text-align:center;}#mermaid-svg-BDX6jazKNjp8sxa4 .node.clickable{cursor:pointer;}#mermaid-svg-BDX6jazKNjp8sxa4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BDX6jazKNjp8sxa4 .arrowheadPath{fill:#333333;}#mermaid-svg-BDX6jazKNjp8sxa4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BDX6jazKNjp8sxa4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BDX6jazKNjp8sxa4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BDX6jazKNjp8sxa4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BDX6jazKNjp8sxa4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BDX6jazKNjp8sxa4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BDX6jazKNjp8sxa4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BDX6jazKNjp8sxa4 .cluster text{fill:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 .cluster span{color:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BDX6jazKNjp8sxa4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BDX6jazKNjp8sxa4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-BDX6jazKNjp8sxa4 .icon-shape,#mermaid-svg-BDX6jazKNjp8sxa4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BDX6jazKNjp8sxa4 .icon-shape p,#mermaid-svg-BDX6jazKNjp8sxa4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BDX6jazKNjp8sxa4 .icon-shape .label rect,#mermaid-svg-BDX6jazKNjp8sxa4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BDX6jazKNjp8sxa4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BDX6jazKNjp8sxa4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BDX6jazKNjp8sxa4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
否
是
否
是
网络无通信
CanSM_Init 完成?
检查初始化顺序和配置指针
ComM 是否请求 FULL_COM?
检查 ComM 用户和模式仲裁
收到模式确认?
查 CanIf 回调、控制器映射、主函数
PDU 是否 ONLINE?
查 PDU 模式和 SILENT 状态
查 CAN 物理层、波特率和上层路由
建议记录:网络索引、控制器索引、当前/请求模式、状态子状态、最后一次 CanIf 请求、确认回调时间戳、Bus-Off 次数、恢复计数器、Dem 事件和 BswM 通知。仅看 ComM 状态不能证明控制器已经 STARTED,也不能证明 PDU 已 ONLINE。
5.8 配置评审清单
- 网络、控制器、收发器和 ComM Channel 的索引映射唯一且方向正确。
CanSM_MainFunction已加入 SchM 调度,周期与所有超时/Bus-Off 延时单位一致。- CanIf 的 ControllerModeIndication、TransceiverModeIndication、Bus-Off 回调已连接。
- FULL-COM、SILENT-COM、NO-COM 三种模式的 PDU 模式策略与系统需求一致。
- Bus-Off 恢复次数、延时、Dem 事件和达到上限后的回退状态已配置。
- 启用 PN/唤醒时,清标志、检查标志、确认回调和验证超时均有实现。
- 波特率切换只在控制器停止并收到确认后执行,目标速率来自同一配置版本。
- 未初始化、非法网络句柄和非法模式请求的 Det 行为已覆盖。
6. 总结
CanSM 的核心不是单个模式 API,而是"请求 -> 异步底层确认 -> 状态提交 -> 上层通知"的闭环。定位问题时应沿这条链逐项核对,并把状态机当前子状态、CanIf 确认和 CanSM_MainFunction 调度证据放在同一时间线上。