资讯详情

CP Autosar - Mcal - Can

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

标签: 0228连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台