CanSM模块如何处理Busoff等问题呢

can总线中,相对其他通信类问题,busoff问题比较难搞。本文从cansm模块出发,就busoff产生、busoff信息交互、busoff快/慢恢复等问题展开聊一聊。
这个话题前面有聊过,可以参考前文autosar网络管理:说说busoff那点事。
1 busoff产生
这里再说一次busoff产生的条件:tec > 255。也就是说ecu自身发出的报文错误,导致tec(transmit error counter)不断累加,直到tec超过255产生busoff,如下所示:
举例:ecu1::can1发送的错误帧只能使ecu1::can1进入busoff状态,而不能使ecu2::can1进入busoff,如下所示:
因为错误由ecu1::can1自己产生,ecu1::can1有问题,自己脱离can总线即可,不要影响ecu2::can1继续使用can总线。
2 busoff信息交互及busoff恢复机制
节点产生busoff以后,controllermode状态自动切换到canif_cs_stoped模式,停止发送错误帧,避免影响总线其他节点的通信。既然busoff已经发生,对应的信息就需要传递给上层,让上层决策后续的通信行为。怎样通知上层呢?
can controller通知到上层有两种方式:interrupt或者polling。
step1、busoff事件信息如何通知到cansm
interrupt方式:
busoff中断发生->
caninterruptstatus()
->canhl_errorhandling()->
canif_controllerbusoff()
->
cansm_controllerbusoff()
->cansm_busoffindicated(),cansm_busoffflag = true
...cansm_mainfunction()周期性检查cansm_busoffflag置位情况。
polling方式:can_mainfunction_busoff()
->canhl_errorhandling()->
canif_controllerbusoff()
->
cansm_controllerbusoff()
->cansm_busoffindicated(),cansm_busoffflag = true
...cansm_mainfunction()周期性检查cansm_busoffflag置位情况。
提示:上述函数关联关系,除autosar标准接口以外,其他接口,不同软件供应商,实现上可能存在不同。
step2、cansm请求重启can controller,通知comm、bswm模式切换
busoff发生以后,cansm调用canif_setcontrollermode()接口,请求将controllermode切到canif_cs_started模式,以便于后续尝试恢复通信。同时关闭tx pdu的发送,只能接收rx pdu。所以这也是为什么在恢复期内可以收到报文的原因。cansm调用bswm_cansm_currentstate()接口通知bswm进入cansm_bswm_bus_off状态,调用comm_bussm_modeindication()接口通知comm进入comm_silent_communication状态。
busoff发生以后,cansm先告知comm,comm在请求cansm对应channel由full communication进入silent communication。进入cansm_bsm_s_silentcom_bor状态,如下所示:
busoff发生以后,cansm会启动一个busoff timer,busoff timer分为两种:
快恢复时间参数:cansmbortimel1;
慢恢复时间参数:cansmbortimel2。
具体busoff timer应该等于cansmbortimel1还是cansmbortimel2,取决于配置参数cansmborcounterl1tol2。
如果busoff连续发生次数 < cansmborcounterl1tol2,busoff timer = cansmbortimel1;
如果busoff连续发生次数≥ cansmborcounterl1tol2,busoff timer = cansmbortimel2;
注意:cansmbortimel1、cansmbortimel2、cansmborcounterl1tol2三个参数均在cansm模块配置,具体数值根据oem需求配置。测试中,busoff的快/慢恢复行为如下所示:
在快/慢恢复时间内,可以接收报文。
step3、cansmbortimel1或者cansmbortimel2耗尽
cansmbortimel1或者cansmbortimel2耗尽(elapse),重新发送tx pdu,让故障节点再次尝试向can总线发送报文。同时,cansm通知bswm进入cansm_bswm_full_communication状态,通知comm进入comm_full_communication状态。可以启动cansmbortimetxensured,确认busoff是否恢复,也可以使用confirm方式确认busoff恢复。
step4、cansmbortimetxensured耗尽
在cansmbortimetxensured时间内,busoff再次发生,则进行下一次的busoff恢复机制,如果cansmbortimetxensured耗尽,则说明成功从busoff状态恢复。如果在cansmbortimetxensured时间内,再次发生busoff,则busoff次数累加。
3 busoff发生时的网络状态
这里主要讨论busoff进入慢恢复期,节点在nos(normal operation state)和rss(ready sleep state)下是否会进行网络状态切换。
nos:busoff进入慢恢复期,如果上层不主动请求释放网络,网络状态无法进入rss,所以,节点会一直在nos状态下,一直处于慢恢复状态,如下所示:
rss:busoff进入慢恢复期,如果在恢复期收不到有效的网络管理报文,nm-timeout时间超时以后,进入pbsm(pre bus sleep mode);如果可以收到有效的网络管理报文,则网络处于rss状态,如下所示:
如果节点在nos状态下,一直处于慢恢复,会带来什么问题呢?节点一直在慢恢复期,意味着该节点不会外报文(应用报文和网络管理报文均不会外发),其他节点会上报对应的节点丢失故障。


透过先进的MOCVD技术降低LED制造成本
基本半导体完成数亿元B轮融资,打造行业领先的碳化硅IDM企业
拓邦软件信息安全管理体系通过SGS认证审核
美国会议员提出一项针对中国电信企业中兴通讯的法案
导电胶点胶加工时点胶机编程的几种方式介绍
CanSM模块如何处理Busoff等问题呢
小米5G新机已获得无线电发射型号核准
华为智能手表专利曝光:支持边框触控技术
5G到底该不该成为购机新指标?
openEuler Embedded软实时系统的特性说明
华为P10国行售价曝光:网友们的评论亮了
三星推出QLED电视和MicroLED电视,意图抢回被LG攻占的市场
基于两电平SVM改进的直接转矩控制
“泡沫金属复合物”甚至能将子弹化成灰烬,比防弹衣还要强大!
运放的简单应用-电压比较
门岗机器人,解决传统物业访客管理问题
智芯传感ZXP6系列压力传感器 在呼吸机应用中实现国产替代
石墨烯产业链分析市场格局的特点
关于五个基本的RC振荡电路的分析介绍
持续追踪三星Note7,竟然还有30万粉真爱粉在使用