MCMCAN支持以下CAN通信协议
?经典CAN和CAN FD符合ISO 11898-1
?时间触发CAN根据ISO 11898-4
MCMCAN由作为CAN节点的Bosch M_CAN和作为用户界面M_CAN由包装器组成。M_CAN提供以下功能:
?CAN协议控制器
?生成接收和发送时间戳
?传输处理程序
?接收处理程序
MCMCAN用户界面提供以下功能:
?可配置的信息RAM,用于存储要发送或接收的信息。RAM由MCMCAN模块中的一切CAN节点共享
?中断信号通过中断压缩单元分组发送
?时钟选择和生成通过时钟控制块进行
?通过BPI访问保护
?基于定时器CAN帧传输和接收CAN帧的超时
CAN Hardware Uint
我们项目通常使用两条线,CAN high, CAN low 连接实际上是CAN transceiver,(CAN 收发器),CAN 收发器分析水平CAN 线的差分信号。输出tx 和 rx 给我们的CAN 这里有模块mcal介绍的是CAN 模块的硬件驱动及其原理。不涉及抽象和协议 具体信号。
以上图为例,两路CAN,左边是收发器CAN, 右边是双绞线CAN高CAN低。所以电阻(120欧元)也是收发器。也可以看出来CAN属于半双工,只能同时收发。顺便说一句,差分信号的优点。这里抗干扰能力强,系统波动时can高can同时变高或变低,差分值不变。信号值不变。
基地址 可以对应着芯片手册查到,工具里写入。
Module | Base Address | End Address | Note |
---|---|---|---|
CAN0 | F0200000 H | F0208FFFH | Bus Interface |
CAN1 | F0210000 H | F0218FFFH | Bus Interface |
CAN2 | F0220000 H | F0228FFFH | Bus Interface |
CAN0_ACCENNODEi0 (i=0-3) | Access Enable Register CAN Node i 0 | 008100H i*400 H | See Family Spec |
---|---|---|---|
CAN1_ACCENNODEi0 (i=0-3) | Access Enable Register CAN Node i 0 | 008100H i*400 H | See Family Spec |
CAN2_ACCENNODEi0 (i=0-3) | Access Enable Register CAN Node i 0 | 008100H i*400 H | See Family Spec |
CAN控制器
根据控制器EE 架构设计,需要用到几路CAN 这里加几条路就行了。每一条。CAN里面的信息基本都是adapt一下。
收发方式
主要知道接收和发送方式。是中断还是polling. 一般来说 例如,接收过程可以设计为中断触发RX, 如果是中断触发,则接收buffer此时,数据传输将触发中断,调用函数rx的buffer读取里面的数据。如果是polling是一定的周期buffer在里面读取,如果各方控制器的周期都很稳定。但是比如在做OTA 升级时,有的数据大,有的数据周期小。基本可以满负荷发送500k. 此时原配置polling可能还不够。建议分为两类中断。(2类中断autosar os 管控)。当然tx也一样。
网络唤醒
这里是否支持网络唤醒?EE架构的事。与用户交互的控制器节点是网络管理中的主节点。也会有硬线唤醒 网络唤醒,因为是主节点,所以也会承担一些唤醒被动节点的事情。这里不多说,mcal只需检查是否要生成相应的内部api. 具体器和电源管理芯片的具体实现。这里有些收发器不支持硬件信号过滤,可能需要唤醒机制的实现mcu判断报文。(transceiver选型时注意)
波特率
不要混淆比特和波特。
比特(bit)相信大家都知道,1字节(Byte)等于8比特(bit)。自然,比特率是每秒传输的比特数。
波特(Baud)即调制速率是指有效数据信号调制载波的速率,即单位时间内载波调制状态变化的次数。它是一种测量符号传输速率的方法。1波特是指每秒传输一个符号,可以通过不同的调制方法在一个码元符号上负载多个符号bit位信息。
我们经常使用的500kb到底是什么意思?(网图,侵权请联系我删除)
在这个例子中,也就是说,5000kb这意味着每秒可以发送一个高位或一个低位 500k单位。每个单位将由多个小单位组成。这里最小的单位是1tq (一般是CAN 时钟的整数倍,或者直接是CAN 时钟的时间值)。了解这里的500kb或者CAN FD 的 2000K 配置不同波特率很容易。
举个栗子: CAN时钟为100M, 需要配置一个 500kb波特率。对于每个数据,会有相应的SS , PTS, PBS1, PBS2 即同步点、采样点等信息。每段对应tq。根据上图,暂时设置一个tq是时钟周期。
buad rate = 1/(1/10000000*19) = 526kb.
有了理论基础,可以根据客户需求在工具中进行相应的配置。知道为什么。
CAN hardware object
重点是tx mailbox 和 rx mailbox. 以rx mailbox 例子。每一个CAN hardware芯片制造商设计不同Rx FIFO. 这里tc397 为两个FIFO. 通常有两种过滤方法可以接收报纸。
标识符列表模式,它将接收报纸 ID 列表要求报文 ID 在接收之前,它与列表中的标识符完全相同,可以理解为白名单管理。掩码模式,它将可接收报文 ID 作为列表,这些被称为隐藏代码,可以理解为关键字搜索,只要隐藏代码(关键字)相同,满足要求,文本将保存到接收 FIFO。
这里的白名单模式一般用于报文不多,方便好用。为什么这么说?也就是说,每篇报文占一个element position, 上面说到的FIFO每个FIFO 可以配置64个element 我们只需要对应CAN hardware添加不同ID 报纸就够了。请注意,如果报纸数量超过64 考虑第二种模式。
即使用一个FIFO,这个FIFO 里面会有8个buffer, 循环使用,新报到时,增加尾部,读完后增加头部,循环队列。这里需要保证FIFO 不要满意。否则,新的报纸将无法填写FIFO.因此,将上述接收方法设置为中断是有益的。
以上理论基础可以通过工具支撑和了解how and why 去配置mcal CAN. 赞赞赞
交互关系
autosar看看架构角度CAN driver.
纵向结构和CANIF 以及一个com stack交互,接收系统,模式管理和控制。交互水平和诊断机制。
从部分接口函数接口可以看出,CAN 驱动程序为上述文件提供了一些列接口。这些都是需要定义的架构接口,可以调用。以下是关于发送和接收最基本的示例代码
IfxMultican_Status IfxMultican_Can_MsgObj_readMessage(IfxMultican_Can_MsgObj *msgObj, IfxMultican_Message *msg) { IfxMultican_Status status = IfxMultican_Status_noError; IfxMultican_MsgObjId objId; if (msgObj->msgObjCount > 1) { /* for FIFO message Objects */ &bsp; objId = msgObj->fifoPointer; } else { /* for standard message Objects */ objId = msgObj->msgObjId; } Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, objId); /* clear pending flag */ IfxMultican_MsgObj_clearRxPending(hwObj); /* read the message object */ status = IfxMultican_MsgObj_readMessage(hwObj, msg); /* if successfull: */ if (status == IfxMultican_Status_noError) { if (msgObj->msgObjCount > 1) { /* set next message object(MOSTAT.PNEXT) of the current object as the next txFIFO slave object */ msgObj->fifoPointer = IfxMultican_MsgObj_getBottomObjectPointer(hwObj); } else {} } return status; } IfxMultican_Status IfxMultican_Can_MsgObj_sendMessage(IfxMultican_Can_MsgObj *msgObj, const IfxMultican_Message *msg) { IfxMultican_Status status = IfxMultican_Status_noError; IfxMultican_MsgObjId objId; if (msgObj->msgObjCount > 1) { /* for FIFO message Objects */ objId = msgObj->fifoPointer; Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->msgObjId); /* set message as valid, in case of FIFO mSGVAL has to be set before setting it to each slave object */ IfxMultican_MsgObj_setStatusFlag(hwObj, IfxMultican_MsgObjStatusFlag_messageValid); } else { /* for standard message Objects */ objId = msgObj->msgObjId; } Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, objId); /* send the message */ status = IfxMultican_MsgObj_sendMessage(hwObj, msg); /* if successfull: */ if (status == IfxMultican_Status_noError) { if (msgObj->msgObjCount > 1) { /* set next message object(MOSTAT.PNEXT) of the current object as the next txFIFO slave object */ msgObj->fifoPointer = IfxMultican_MsgObj_getBottomObjectPointer(hwObj); } else {} } return status; }
CANFD
CANFD 是可以兼容CAN的,现在整车报文越来越多,CAN的500kb已经不足以满足需求,所以这里介绍一下CANFD. 在开发CAN FD 的时候,因为是兼容的,所以只需要对这个F 动手脚就行了。F: flexble 可变的波特率。根据上面的理论知识对CANFD 的 报文头部 和 数据位 进行单独配置各自的波特率。实现可变的效果。其他配置都一样,可以直接使用。
作者:Z-ONE_00751242454 文章来源:上汽零束SOA开发者论坛 原文链接:https://bbs.z-onesoft.com/omp/community/front/api/page/mainTz?articleId=7725