CanIf篇

今天完整的看了下Vector的CanIf标准文档,记录一下学习成果。

  1. CanIf有四种状态:CANIF_CS_UNINIT、CANIF_CS_STOPPED、CANIF_CS_STARTED、CANIF_CS_SLEEP,组成枚举量为CanIf_ControllerModeType。用这四种状态来做CanIf层的状态切换,同时在不同的状态之间切换是根据Up layer的请求来切换的;对于Under layer来说通过调用CanIF_SetControllerMode函数对Can driver设置状态,Can driver调用Can_SetControllerMode对Hardware切换到对应的状态;由于Can协议栈有完整的通知机制,Can_driver层会调用CanIf_ControllerModeIndication函数向CanIf发送当前的状态通知。
  2. CanIf层还需要设置Pdu的状态,Pdu有八种状态:CANIF_SET_OFFLINE、CANIF_SET_RX_OFFLINE、CANIF_SET_RX_ONLINE、CANIF_SET_TX_OFFLINE、CANIF_SET_TX_ONLINE、CANIF_SET_ONLINE、CANIF_SET_TX_OFFLINE_ACTIVE、CANIF_NO_MODE_PDU_SET_MODE_TYPE_END;想要完成从上到下(Can driver-Pdu的通信,还需要调用CanIF_SetPduMode函数来设置CANIF_SET_ONLINE,完成Rx到Tx的设置并实现功能;
  3. CanIf和Can的状态都是通过状态机来控制的,需要注意的是CanIf和硬件没有任何关系,;
  4. CanIf的状态切换:Ecu reset之后会进入CANIF_CS_UNINIT状态,然后执行完CanIf_Init之后会进入CANIF_CS_STOPPED状态;还需要注意的地方是CanIf状态只能从STOP-START或者STOP-SLEEP不能从START-SLEEP!
  5. 对于Can通信来说还有一个最重要的功能是Busoff。从Can-CanIf流程如下,Can Hardware检测到Busoff会调用CanIf_ControllerBusoff函数然后在该函数内调用CanIf_SetPduMode函数把总线设置为Offline模式,然后调用CanIf_SetControllerMode函数设置为CANIF_CS_STOPPED模式,间接对Can设置为CAN_CS_STOP状态,等待Busoff恢复之后会从新设置为START模式。
  6. 发送流程:在想要通过CanIf层发送CAN消息之前,需要吧CanIf、PDU和Can的状态分别置为CANIF_CS_START/CANIF_SET_ONLINE/CAN_CS_START。然后调用CanIf_Transmit函数从CanIf层发送消息,该函数会调用Can_Write然后在Can_Write中会向Hardware查找Free的MBs,当前有Free的MB会返回TRUE(如果没有找到Free的MB会返回CAN_BUSY),在此处有两种情况:Interrupts:硬件发出去之后会进入Can__ISR_Tx()在中断函数中会使用AUTOSAR的通知机制,即调用CanIf_TxIndication()函数通知CanIf层消息已被正确发出,然后CanIf会继续往上边通知,还没学到,以后补充/ TODO */,至此整个发送流程已完成;
  7. 接收流程:首先Can Hardware通过中断接收到一帧报文(如果使用了硬件滤波,该报文需要通过硬件滤波之后才会被处理,软件滤波实在CanIf层进行筛选)把该报文数据拷贝到专用的Buffer,会在Can_*_ISR_Rx()中调用CanIf_RxIndication()函数向CanIf层通知收到一帧新的消息,在CanIf层会做一些Check,比如CheckSum和DLC Check等,具体需要在Davinci Config中配置,Check完成之后会传到Pdu层,根据协议进行数据拆分,进而把数据给到Com层分配给RTE接口供SWC使用;
  8. 简单说一下在Davinci Config中的一些配置吧,例如刚才提到的CheckSum功能是需要手动使能的,DLC Check也需要手动使能的同时定义需要Check的DLC的长度(CAN MAX Lenth is 8,CANFD MAX Length is 64),CanIf软件滤波也需要手动使能,同时还需要选择查找的方法,目前Davinci提供了三个:Binary(介于Linear和Double Hash之间的ID数量),Linear(少量的ID),Double Hash(大量的ID);
  9. 超时机制:CAN协议栈有两种超时机制:Update Bit和Timeout,顾名思义,Update Bit就是使用一个指定的Bit位来表明该消息是否是最新的,这种办法需要通信双方定义好哪一个Bit然后才能正确通信;Timeout就是使用定时器来定时,从接收该帧消息开始Reset timer,同时开始计时,直到接收到下一个同类消息,如果Timeout则进入超时逻辑,在Davinci中可以选择是Replace或者是None,Replace就是使用初始值代替,None就是保持原值,具体看软件需求;
    以上,今天的学习心得。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值