AUTOSAR学习笔记2——CANIF

CanIf:
在AUTOSAR中与上层通信层与CAN驱动程序服务接口

1、初始化CANIF
CanIf_InitMemory() 初始化全局配置,将CANIF初始化成原始数据
CanTrcv_xxx_InitMemory() 、CanTrcv_xxx_Init() 初始化CAN收发器,要在CanIf_Init()之前就 要把收发器设置成正常状态
Can_InitMemory() 、 Can_Init() 初始化CAN存储以及初始化CAN(也要在CanIf_Init()之前调用)
CanIf_Init() 初始化所有的CAN接口控制器,
CanIf_SetControllerMode(0, CANIF_CS_STARTED) 配置CANIF在CAN控制器0的状态为启动状态
CanIf_SetPduMode(0, CANIF_SET_ONLINE) 配置CAN接口在CAN控制器0上的模式为在线模式
在初始化CANIF之前要先调用 EcuM_BswErrorHook(),当产生下面任一错误时初始化操作就会停止
错误1:ECUM_BSWERROR_NULLPTR 指向配置的指针无效
错误2:ECUM_BSWERROR_COMPATIBILITYVERSION 收发器不兼容
错误3:ECUM_BSWERROR_MAGICNUMBER 罕见的数字错误

2、通信
控制器模式:物理状态上控制,有停止(CANIF_CS_STOPPED)、启动(CANIF_CS_STARTED)、睡眠(CANIF_CS_SLEEP)、不初始化(CANIF_CS_UNINIT),每次进行转换都要先停止再切换,比如要想从开始模式切换到睡眠模式,就要先让切换到停止模式再切换到睡眠模式 (这些函数要用这个CanIf_SetControllerMode()来设置)
PDU(数据协议单元)模式:完全由软件进行处理。只有在CANIF_CS_STARTED模式下PDU模式才能运行
CANIF_GET_OFFLINE TX和RX都离线
CANIF_GET_RX_ONLINE TX离线,RX在线
CANIF_GET_TX_ONLINE TX离线,RX在线
CANIF_GET_ONLINE TX和RX都在线
CANIF_GET_OFFLINE_ACTIVE TX和RX都离线,有接口进行模拟操作
CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE TX离线、RX在线,由接口进行模拟操作
如果启用了参数r CanIfPnWakeupTxPduFilterSupport下面也可以使用:
CANIF_GET_TX_ONLINE_WAKF TX在线,RX离线
CANIF_GET_ONLINE_WAKF TX和RX切换在线
只要设置了CANIF_GET_ONLINE 和 CANIF_GET_TX_ONLINE其中一种就会激活PUD模式
PDU模式可以通过函数CanIf SetPduMode()来设置,也可以通过函数CanIf_GetPduMode()来检索。
3、传输:只有在初始化成功之后、CAN设备启动之后、CANIF在于启动状态并且TX/RX在线,才能传输PUD
TX请求必须调用CanIf_Transmit(, ),(底层调用的是CAN_Write()函数)
如果在总线上传输成功,那就会有一个轮询函数确认,然后传输到上层,所有需要配置一个回调函数
1)TX数据截断:通过CanIfTxPduTruncation参数配置截断特性,数据长度超出设置的长度,就会进行截断发送。如果没配属性且长度超出就不会传输且报错 CANIF_E_TXPDU_LENGTH_EXCEEDED
2)动态的传输:通过Dynamic Tx Objects参数激活(与静态不同的是ID属性可以选择)可以使用CanIf_SetDynamicTxId()来配置ID
3)发送缓冲区:同一时间有很多的数据需要发送,这些数据就存在发送缓冲区中,等待按照优先级或者先进先出进行发送
1)FIFO(frist in frist out先进先出:那一条数据先进入缓冲区就哪一条数据先发送
2)CAN-identifier:通过报文的ID进发送,ID越小发送的优先级越高
4)发送确认:配置参数CanIfPublicTxConfirmPollingSupport,提供上次启动控制器以来发生的确认消息CanIf_GetTxConfirmationState()
5)发送数据校验和:配置参数CanIfTxPduDataChecksumPdu开启校验和,然后通过CanIf_TransmitSubDataChecksumTxAppend()来计算
CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE
6)can接收数据单元:接收数据是根据ID进行匹配的,有三种检索方法:
1)线性检索:逐一排查对比,通过与自己数据库里面的ID进行比较,来接受正确的ID。慢
2)双哈希检索:通过两个哈希函数进行检索计算。检索无论消息多少,时间都是固定的。
3)二分查找:进行多次等分,寻找最符合的。速度快(不能用于混合ID)
7)上下ID转换为掩码-代码形式:
code=下ID,上ID-下ID得到的数据取反再 & 0X7FF得到11位的掩码,& 0X1FFF FFFF得到29位掩码
8)数据的DLC(数据长度)检查
可以通过预编译为每个RX-PDU进行设置,用来检验接受的DLC是否大于等于设置的,>=就是对的,<会报错并停止接受
9)接收校验和:CanIfRxPduDataChecksumPdu配置这个参数判断,通过CanIf_RxIndicationSubDataChecksumRxVerify()函数实现
10)睡眠、唤醒:CANIF用来控制底层CAN驱动和收发驱动的模式。

11)错误处理: 预编译前配置这个CANIF_DEV_ERROR_REPORT==STD_ON,通过Det_ReportError()上报错误信息

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值