• 283查看
  • 0回复

[Autosar] 深入解析BusOff及CanSM模块

[复制链接]


该用户从未签到

发表于 8-5-2024 19:17:53 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


内容提要1 ISO11898-1
1.1帧结构
1.2错误帧1.3过载帧
1.4 错误类型

1.5 错误处理

    1.5.1 Error Count

    1.5.2 BusOff快慢恢复机制

    1.5.3 BusOff产生的原因

2 CanSM
2.1 CanSM状态机介绍

2.2 CANSM_BSM_S_PRE_NOCOM

      2.2.1 CANSM_BSM_DeinitPnNotSupported

      2.2.2 CANSM_BSM_DeinitPnSupportedProceed

2.3 CANSM_BSM_S_PRE_FULLCOM

2.4 CANSM_BSM_S_FULLCOM
3 CanSM配置项讲解引言
在使用CanSM模块前,我们需要先了解一下ISO11898协议,其中ISO11898-1详细介绍了数据链路层和物理层信号。

ISO11898-1
帧的种类有以下几种:
帧种类帧用途
数据帧用于发送单元向接收单元传送数据的帧。
遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧,也可译为远程帧
错误帧用于当检测出错误时向其它单元通知错误的帧。
过载帧用于接收单元通知其尚未做好接收准备的帧。
帧间隔用于将数据帧及遥控帧与前面的帧分离开来的帧。
1.1 帧结构数据帧由下列部分组成:SOF、Arbitration field、Controlfield、Data field、CRC field、ACK field和EOF。
深入解析BusOff及CanSM模块w1.jpg

帧起始(Start of frame,SOF)
SOF表示一个数据和远程帧的起始,它是一个显性位,只有在总线空闲时才能发送SOF位。总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步。
仲裁段(Arbitration field)
仲裁段主要作用在于决定发送顺序,其他节点在静默等待总线空闲再进行下一回合的仲裁。标准帧的仲裁段由标识符位(Identifier field-ID)和远程发送请求位(Remote Transfer Request-RTR)。而扩展帧在标准帧的基础上,则多了SRR和IDE。标识符位,是一个功能性的地址(Functional address),CAN接收器通过标识符来过滤数据帧。标准格式的数据帧的标识符(CAN-ID)长度为11位(11 bits),ID10~ID0,ID10为最高权重位(MSB),ID0为最低权重位(LSB),按照ID10~ID0的顺序进行传输。CAN协议还规定:前7位最高权重位(ID10~ID4)不能都为“隐性”信号。远程发送请求位(RTR,1bit),它用于区分该帧是数据帧还是远程帧:“显性信号(0)”代表数据帧(Data Frame);“隐性信号(1)”代表远程帧(RemoteFrame)。RTR保证了在ID相同的情况下,保证数据帧优先级高于远程帧IDE位在标准帧和扩展帧中的作用不同,在标准帧中属于控制段(control field),为显性,在扩展帧中属于仲裁段,为隐性位。所以ID相同的标准帧和扩展帧,标准帧的优先级高于扩展帧。
控制段(Control field)
控制段包括6个位(6 bits),后4个bit表示数据长度,前两个位根据帧格式不同而不同,在标准中分别为IDE和保留,在扩展帧中为保留位。与传统CAN相比,CAN FD在控制场中新添加了FDF位、BRS位、ESI位。与CAN相同,IDE位表示扩展帧标志,res位为预留位。
深入解析BusOff及CanSM模块w2.jpg

CAN 标准帧结构
深入解析BusOff及CanSM模块w3.jpg

CAN FD 标准帧结构
FDF(FD Format Indicator)位在CAN的数据帧中位显性(0),在CAN FD的帧中常为隐性(1),表示CAN FD报文;
BRS(Bit Rate Switch)表示位速率转换开关,为隐形位(1)时,表示转换可变速率,即发送节点在BRS位的采样点,将会切换到高速传输的时钟模式,其他接收节点也必须转换位时钟模式。在CRC分界符的采样点,所有节点的波特率将会再切换回仲裁场的波特率。在这种情况下,所有CAN FD节点有两种类型的波特率。ESI(Error State Indicator)是指示发送节点的错误状态的标志,当发送节点的错误状态是激活时,发送隐性位(1),如果错误状态未激活时,发送显性位(0)。通过ESI位,所有节点都可以确认当前的传输节点的错误状态。而在CAN帧中,无法得知其传输节点的错误状态普通CAN数据长度最大只有8个字节。CAN FD对有效数据场长度作了很大的扩充,数据场最大可达64字节。数据长度可以从0到8,12,16,20,24,32,48,64字节中选择。而CAN只有0到8个字节。

DLC

普通CAN数据长度

CANFD数据长度

DLC

普通CAN数据长度

CANFD数据长度

0

0

0

9

8

12

1

1

1

10

8

16

2

2

2

11

8

20

3

3

3

12

8

24

4

4

4

13

8

32

5

5

5

14

8

48

6

6

6

15

8

64

7

7

7




8

8

8




CRC段(CRC field)
CRC段由CRC序列和CRC分界符(一个隐性位)组成.为了避免位填充对CRC的影响,CAN FD在CRC场中增加了stuffcount记录填充位的个数对应8的模,并用格雷码表示,还增加了奇偶校验位。FSB(fixed stuff-bit)固定为前一位的补码。CRC序列是根据生成多项式来计算CRC值. 传统CAN使用的是CRC15的算法,这个通过CAN的数据结构也可以看出,CRC段的长度就是15位。CAN FD之所以有两种是因为CAN FD的数据长度是可变的,针对不同的数据长度使用的方法不同,低于16字节的使用的是CRC17,高于16字节的使用的是CRC21。
ACK段(ACK field)
ACK段由ACK槽(ACK slot)和ACK分界符(ACKdelimiter)组成。所有的收到CAN消息并且CRC匹配后的节点都需要在ACK槽内发送一个显性的ACK信号来覆盖原来发送端的隐性位。ACK分界符是一个隐性位。与CAN相比,在CAN FD中从高速的数据场到慢速的仲裁场时,时钟切换会引起收发器相移和总线传播延迟。为了补偿其相移和延迟,相比传统的CAN,在CAN FD中多加了额外的1位时间。
帧结束(EOF)
7个连续的隐性位。远程帧结构与数据帧类似,但是它没有数据域。位填充(bit stuffing)根据ISO11898的帧编码,当发送端在帧起始(SOF)、仲裁域(arbitration field)、控制域(control field)、数据域(data field)和CRC段( CRC sequence)检测到连续5个相同的位时,需要填充一个相反的位(位填充, bit stuffing),如下图所示。
深入解析BusOff及CanSM模块w4.jpg

但是数据帧或者远程帧的其余位域(CRC界定符,ACK域和帧结束),为固定格式,不会被填充,同时错误帧和过载帧也是固定的形式(不能被填充)。1.2 错误帧
错误帧由两部分组成:错误标志和错误分界符(8个隐形位组成)。其中,错误标志是由不同的节点共同发送组成的。一般情况下有两种错误标志:主动错误标志(ACTIVE ERROR FLAG) 和被动错误标志(PASSIVE ERROR FLAG) 。

主动错误标志由六个连续的“显性”位组成。被动错误标志由六个连续的“隐性”位组成,除非它被其他节点的“显性”位覆盖。
主动错误节点检测到总线错误产生后发送主动错误标志,而由于这个主动错误标志不符合位填充规则,因此其他节点会检测到错误然后发送错误标志(显性位),所以主动错误标志的显性位长度不是固定的,最小是6,最大是12。
1.3 过载帧
过载帧是接收节点向总线上其它节点报告自身接收能力达到极限的帧。过载帧由两部分组成:过载标志(连续6个显性位)和过载界定符(连续8个隐性位)。与错误帧类似,过载帧中有过载帧重叠部分,且形成过载重叠标志的原因与形成错误帧中的错误重叠标志的原因是相同的。过载帧产生的可能原因有如下几种:1 接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。2 在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)。帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候是不应该有报文发来。3 CAN节点在错误界定符或过载界定符的第八位(最后一位)监听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。接收节点在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发来,但这个时候是不应该有报文发来的。1.4 错误种类位错误(BIT ERROR)节点将自己发送到总线上的电平与同时从总线上回读到的电平进行比较,如果发现二者不一致,那么这个节点就会检测出一个位错误(BIT ERROR)。
但是下列3种情况例外:

1 在仲裁段(ARBITRATIONFIELD),节点向总线发送隐性位却回读到显性位,不认为是位错误,因为这属于ID仲裁域这种情况表示由于本身的ID较大,优先级较低,仲裁失败。

2 在ACK SLOT段,节点向总线发送隐性位却回读到显性位,不认为是位错误;这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;
3 该节点发送被动错误标志(PASSIVEERROR FLAG),节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平“吃掉”;被动错误的发言权小于主动错误。填充错误(STUFF ERROR)

在需要执行位填充的域(数据帧和遥控帧的SOF~CRC序列),检测到连续6个逻辑电平相同的bit。CRC错误

接收端和发送端计算的CRC值不一样.格式错误(FORM ERROR)

固定格式的位域检测到1个或者多个非法的位值(电平错了).具体来说,第1位(也就是SOF)必须是显性的,而整个8位EOF字段必须是隐性的。此外,ACK和CRC分界符必须是隐性的。如果接收器发现这些bit中的任何一个具有无效逻辑电平,则接收器将其检测为格式错误(FormError)。ACK错误

当发送端没有在ACK槽内检测到显性位(没有接收节点成功收到这帧数据)。1.5 错误处理1.5.1 错误计数(Error Count)
错误计数的变化是根据以下准则:
1 当接收端检测到错误,接收错误计数(REC)加1,有一种情况例外:发送主动错误标志或过载标志的时候检测到位错误;2 当接收端发送完错误标志后接收到一个的第一个位为显性位(接收端是error-active node),接收计数器增加8;3 当发送端发送错误标志,发送错误计数(transmiterrorcount,TEC)增加8,以下两种情况例外:
    a)如果发送端是错误被动的并且由于没有检测到显性ACK而检测到ACK错误,并且在发送其被动错误标志时没有检测到显性位;
    b)如果发送端在仲裁过程由于填充错误而发送错误标志,位填充错误是由于位填充应该是隐性的而且也发送位隐形但是却回读(监控)为显性。4 如果发送端在发送主动错误标志或过载标志的同时检测到位错误,则发送错误计数器应增加8( 8 );5 如果接收机在发送主动错误标志或过载标志的同时检测到位错误,则接收错误计数器应增加8( 8 )。6 在发送主动错误标志、被动错误标志或过载标志后,任何节点最多可以容忍7个连续的显性位。在检测到第14 ( 14 )个连续的显性位(在出现主动错误标志或过载标志的情况下)后或检测到第8个连续的显性位(后面紧跟被动错误标志)后或在每个另外8个连续的显性位后,每个发送端将其发送错误计数器增加8 ( 8 )个,每个接收端将其接收计数器增加8 ( 8 )个。7 成功发送一帧报文,发送错误计数器减1(最小值为0);8 成功接收一帧(接收到ACK时无误码且成功发送ACK比特)后,如果接收误差计数器在1到127之间,则应减小1。如果接收错误计数器为0,则应保持为0,如果大于127,则应设置为119到127之间的值。
深入解析BusOff及CanSM模块w5.jpg

1.5.2 BusOff快慢恢复机制

进入BusOff后重启控制器的策略是什么呢?

当节点进入总线关闭状态后,如果MCU仅是开启自动恢复功能,CAN控制器在检测到128次11个连续的隐性位后即可恢复通信,在实际的CAN通信总线中,这一条件是很容易达到的。以500K的波特率为例,128*11*(1/500000)=0.002816‬s。这意味着如果节点所在的CAN总线的帧间隔时间大于0.002816‬s,节点在总线空闲时间内便可轻易恢复通信。但是当进入总线关闭状态时,节点已经发生了严重的错误,处于不可信状态,如果迅速恢复参与总线通信,具有较高的风险。因此,在实际的应用中,往往会通过MCU对CAN控制器总线关闭状态的恢复过程进行软件处理,以控制节点从总线关闭状态恢复到错误主动状态的等待时间,达到既提高灵活性又保证节点在功能上的快速响应性的目的。具体包括“快恢复”和“慢恢复”策略,两种策略一般同时应用。

所谓快恢复,就是产生Bus Off后,ECU尝试恢复发送报文,此时的发送周期通常为50ms左右,一般快恢复5次,如果发送成功,则Bus Off解除,否则进入慢恢复机制,通常慢恢复的时间为200ms。
1.5.3 BusOff产生的原因
BusOff产生的可能原因有如下几种:
1 CAN线路问题,如CAN_H开路、CAN_L开路、CAN_H对CAN_L短路/开路、CAN_L对VBAT短路、CAN_H对GND短路、CAN_L对GND短路、终端电阻开路等;2 CAN控制器或收发器等元器件故障导致;3 CAN总线信号干扰。实际开发自测过程中,常用的方法就是CAN_H和CAN_L对接来模拟BusOff。
2 CanSM

深入解析BusOff及CanSM模块w6.jpg

从上边CanSM与其他模块的交互图可以看出,CanSM与很多模块都有关联,主要的模块为:1 EcuM:EcuM会初始化CanSM模块而且与CanSM模块一起去校验CAN唤醒信号;2 BSW 调度模块(SchM):主要调度CanSM_Mainfunction,完成一些需要周期性处理的任务;3 ComM:ComM通过CanSM的相关API来请求CAN网络的通信模式;4 CanIf:CanSM通过CanIf的相关API来控制CAN控制器和收发器的工作模式;5 BswM:CanSM需要将总线的模式变化通知到BswM模块,参考BswM的配置;6 CanNm:CanSM需要通知CanNm模块局部网络(partial network)的可用性;7 DEM:CanSM需要将总线错误报告给DEM模块。从上描述可知,CanSM负责管理Can网络和Can收发器的工作模式,任何Can网络或者手法的状态变化也应该通知到CanSM模块。
2.1 CanSM状态机

深入解析BusOff及CanSM模块w7.jpg

CanSM上电后默认处于CANSM_BSM_S_NOT_INITIALIZED状态,当调用CanSM_Init后进入CANSM_BSM_S_PRE_NOCOM状态,此时会执行Can控制器和收发器的DeInit(根据配置是否支持PNC有两个函数:CANSM_BSM_DeinitPnNotSupported和CANSM_BSM_DeinitPnSupported),然后进入CANSM_BSM_S_NOCOM状态,这个时候假如ComM模块调用ComM_RequestComMode设置为FULL_COM,然后会调用到CanSM_RequestComMode,此时CanSM进入CANSM_BSM_S_PRE_FULLCOM,设置CAN控制器和收发器进入Normal状态,然后进入CANSM_BSM_S_FULLCOM,至此,整个CanSM进入正常通讯的状态完成。当ComM模块调用ComM_RequestComMode参数设置为COMM_NO_COMMUNICATION时,ComM会先让Nm模块释放网络(调用Nm_NetworkRelease),当Nm释放网络并且进入PrepareBusSleep状态后,通过ComM_Nm_PrepareBusSleepMode告知ComM模块,此时ComM模块调用CanSM的CanSM_RequestComMode,参数设置为COMM_SILENT_COMMUNICATION,此时CanSM进入COMM_SILENT_COMMUNICATION状态,在Nm计时结束,从Prepare Bus-Sleep Mode进入BusSleepMode后,通过ComM_Nm_BusSleepMode告知ComM模块,此时ComM模块再次调用CanSM的CanSM_RequestComMode,参数设置为COMM_NO_COMMUNICATION,CanSM就进入了CANSM_BSM_S_PRE_NOCOM状态。
2.2 CANSM_BSM_S_PRE_NOCOM
Pre_NO_COM状态的DeInit根据配置分为了两个部分:支持PN(Partial Network)的DeInit和不支持PN的DeInit。

2.2.1 CANSM_BSM_DeinitPnNotSupported

深入解析BusOff及CanSM模块w8.jpg

CanSM在控制CAN控制器的工作状态时的调用时序如下图所示。
深入解析BusOff及CanSM模块w9.jpg

CanSM调用CanIf_SetControllerMode将CAN控制器(Can Controller,CC)设置为Stopped,Can驱动设置成功调用CanIf的CanIf_ControllerModeIndication函数通知到CanIf模块,CanIf调用CanSM_ControllerModeIndication函数通知到CanSM模块,然后按照这个流程CanSM再将CAN控制器设置为Sleep.随后CanSM控制CAN收发器先进入Normal状态再进入Standby,流程和控制CAN控制器的类似(CanSM->CanIf_SetTrcvMode->CanTrcv_TJA1145_SetOpMode设置工作模式,然后CanIf_TrcvModeIndication->CanSM_TransceiverModeIndication通知到CanSM模块)。
2.2.2 CANSM_BSM_DeinitPnSupportedProceed

深入解析BusOff及CanSM模块w10.jpg

支持PN的DeInit相比不支持PN而言,多了几个动作:它上电时会先清除CAN收发器的唤醒帧标志(Clear Wakeup Frame Flag),然后将CAN控制器置未Stop状态,再先将收发器置为Normal后置为Standby,随后将CAN控制器置为Sleep模式,这个时候再来判断唤醒信号的有效性(CanSM调用CanIf的CanIf_CheckTrcvWakeFlag函数,CanIf调用CanIf_CheckTrcvWakeFlag读取收发器的寄存器判断唤醒标志是否置位)。
2.3 CANSM_BSM_S_PRE_FULLCOM

深入解析BusOff及CanSM模块w11.jpg

CanSM调用CanIf_SetTrcvMode->CanTrcv_TJA1145_SetOpMode设置收发器为Normal状态,然后将CAN控制器设置为STARTED状态,在CanSM_NO_COM状态调用DeInit函数将CAN控制器设置为了SLEEP状态,根据AUTOSAR CAN驱动文档描述,CAN要从非STOPPED状态(UNINIT或者SLEEP)切换到STARTED需要先进入STOPPED状态。CAN控制器的状态切换如下图所示。
深入解析BusOff及CanSM模块w12.jpg

2.4 CANSM_BSM_S_FULLCOM

深入解析BusOff及CanSM模块w13.jpg

在FULLCOM状态,需要一直对BusOff状态进行检测,当发生了BusOff后,需要重启CAN控制器(RESTART_CC),重启完成后,等一段时间再重启开启发送。3 CanSM配置项讲解
深入解析BusOff及CanSM模块w14.jpg

CanSMBorCounterL1ToL2:BusOff发生后快恢复尝试多少次后切换到慢恢复。

CanSMBorTimeL1:慢恢复重试时间间隔。

CanSMBorTimeL2:快恢复重试时间间隔。

CanSMBorTimeTxEnsured:检测BusOff事件的时间间隔

CanSMComMNetworkHandleRef:引用ComM中配置的网络句柄(将CanSM与ComM对应起来).

CanSMControllerId:引用CanIfTrcvCfg中配置的收发器(将CanSM与CanTrcv对应起来).

CanSMControllerId:引用的CanIf中配置的CAN网络(将CanSM与CanIf关联起来).

深入解析BusOff及CanSM模块w15.jpg

CanSMMainFucntionPeriod:CanSM_MainFunction的运行周期.

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:49 , Processed in 0.291874 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.