Can Driver-CAN Controller状态切换

一、CAN Controller状态

●UNINIT:CAN Controller没有被初始化,CAN模块的所有的寄存器都是reset状态,CAN相关中断都被disable的。CAN Controller没有参与CAN到CAN-Bus总线活动中。
●STOPPED :在这种状态下,CAN控制器被初始化,但不参与总线。此外,错误帧和ACK不能发送。
●STARTED :控制器处于正常运行模式,功能完整,参与CAN总线网络。
●SLEEP:CAN硬件(收发器)区分支持休眠和不支持休眠的硬件,不同的CAN硬件的SLEEP状态不一样。
●支持休眠的CAN硬件,如果切换到SLEEP状态,CAN模块就会设置CAN Controller进入SLEEP状态,这SLEEP状态下CAN新建能够被CAN总线唤醒。
●不支持休眠的CAN硬件,如果切换到SLEEP状态,CAN模块设置一个逻辑SLEEP状态,只能通过软件切换到STOPPED状态。
●CAN硬件应保持在STOPPED状态,当逻辑SLEEP状态被触发后。

二、CAN Controller状态

CAN Controller状态切换
上层模块调用Can_SetControllerMode函数切换CAN Controller状态。CAN Driver模块成功完成状态切换后调用CanIf_ControllerModeIndication回调函数通知到上层CanIf模块。
事件触发的状态切换回调用事件触发后的回调函数通知到上层模块,例如Bus-Off后底层调用CanIf_ControllerBusOff,EcuM_CheckWakeup函数通知到CanIf和EcuM模块。

●CAN_Init切换状态:EcuM模块在初始化阶段调用CAN_Init函数完成CAN模块的初始化(所有硬件配置相关的寄存器的设置),CAN Controller状态从UNINIT状态切换到STOPPED状态。
●CAN_SetBaudrate切换状态 :CAN_SetBaudrate函数的调用不会切换当前状态到另一个状态,只会当前状态完成硬件寄存器配置后又回到当前状态。如果设置波特率必须重新初始化CAN Driver模块,则切换波特率的时候CAN Controller必须在STOPPED的状态,否则返回E_NOT_OK。
CAN_SetBaudrate函数在实际项目中基本不用。

●Can_SetControllerMode切换状态
上层模块调用Can_SetControllerMode函数后,Can_MainFunction_Mode周期函数回轮询CAN状态寄存器的模式标志,如果CAN Controller的模块切换成功了,Can_MainFunction_Mode函数调用CanIf_ControllerModeIndication通知到CanIf层。

Can_SetControllerMode(CAN_T_START) --> STOPPED-->STARTED:         
Can_SetControllerMode(CAN_T_START) --> 已停止-->已启动:

在STOPPED状态下调用Can_SetControllerMode(CAN_T_START)函数后,设置硬件相关的寄存器,等待有限的一段时间,使的CAN Controller能够参与到CAN网络总线活动中。
在CAN Controller完全运行起来前的发送请求会丢失,在发送回调中通知到上层。上层会判断发送超时后做相应处理。

Can_SetControllerMode(CAN_T_STOP) --> STARTED-->STOPPED:

STARTED状态下调用Can_SetControllerMode(CAN_T_STOP)函数,CAN硬件会设计相关寄存器的bits,之后CAN Controller停止参与总线通信。同时未发送出去被挂起的消息会被删除。

Can_SetControllerMode(CAN_T_SLEEP) --> STOPPED-->SLEEP:   

STOPPED状态下调用Can_SetControllerMode(CAN_T_SLEEP) 函数,CAN Controller进入到sleep模式。

如果CAN硬件(收发器)支持睡眠模式,Can_SetControllerMode(CAN_T_SLEEP) 函数会等待一段函数直到CAN Controller进入到SLEEP状态,同时保证CAN硬件能够被唤醒。
如果CAN硬件(收发器)不支持睡眠模式,Can_SetControllerMode(CAN_T_SLEEP) 函数会设置CAN Controller进入到逻辑sleep模式。逻辑睡眠模式将会保持直到Can_SetControllerMode(CAN_T_WAKEUP)被调用。

Can_SetControllerMode(CAN_T_WAKEUP) --> SLEEP-->STOPPD:      
Can_SetControllerMode(CAN_T_WAKEUP) --> SLEEP-->STOPPD:

如果CAN硬件不支持睡眠模式,Can_SetControllerMode(CAN_T_WAKEUP) 将从逻辑sleep模式中退出,但是不会影响到CAN Controller的硬件状态(因为硬件已经在STOPPED状态了)。
如果CAN硬件支持睡眠模式,Can_SetControllerMode(CAN_T_WAKEUP)将会等待一段时间,直到CAN Controller进入到STOPPED状态。

●CAN-Bus报文唤醒:CAN-Bus事件发生后CAN Controller从SLEEP状态切换到STOPPED状态,并且调用EcuM_CheckWakeup回调函数通知到EcuM模块。在CAN-Bus总线接收报文唤醒状态切换过程中调用Can_SetControllerMode(CAN_T_WAKEUP)函数将返回CAN_NOT_OK。仅支持硬件睡眠唤醒的ECU有这个特性。
●Bus-Off事件:Bus-Off事件发生后CAN Controller从STARTED状态切换到STOPPED状态,Bus-Off中断或者MainFucntion中调用CanIf_ControllerBusOff回调函数通知到CanIf层

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值