AUTOSAR_CP文档图解==>AUTOSAR_CP_SWS_CANStateManager

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 调度证据放在同一时间线上。

相关推荐
寇旨13 小时前
AUTOSAR_CP文档图解==>AUTOSAR_CP_SWS_COMBasedTransformer
网络·autosar
瞬间记忆21 天前
AUTOSAR基础概念学习
汽车·autosar
赞哥哥s1 个月前
车载以太网概念及协议架构介绍(一)
ethernet·autosar·aurix
车软派开发学长1 个月前
车企研发的“整合与自研”之争,本质是一场生意
车载系统·汽车·can·autosar
赞哥哥s2 个月前
Autosar Dem学习笔记-DTC状态位详解与用法
autosar·dem·dtc
叶修_A2 个月前
FS-17 功能安全ISO26262之敏捷开发融合深度解析
敏捷开发·autosar·汽车电子·功能安全·iso26262
叶修_A3 个月前
FS-11 功能安全ISO26262之生产运维与报废阶段安全保障深度解析
autosar·汽车电子·功能安全·iso26262
齊家治國平天下3 个月前
Google AAOS 中 SOME/IP 框架深度解析:从架构到实践
android·autosar·aaos·车载以太网·some/ip·sdv·vsomeip
叶修_A4 个月前
AP-03 SOME/IP协议实战 - AUTOSAR自适应平台通信中间件深度解析
autosar·汽车电子·some/ip·ap·通信中间件