【经验】FlexCAN(FD) Message Buffer(MB)应用开发设计

目录

一、MB硬件特性

二、MB相关寄存器地址

三、Payload长度不同的MB地址空间

四、MB RAM分区

五、项目需求分析

六、寄存器配置设计


一、MB硬件特性

  • Flexible mailboxes configurable to store 0 to 8, 16, 32 or 64 bytes data length
    MB长度可以为0、8、16、32、64字节长度
  • Flexible message buffers (MBs), totaling 64 message buffers of 8 bytes data length each, configurable as Rx or Tx
    每个MB可以配置为接收或发送,8字节长度的MB总数为64个
  • The memory area from 0x80 to 0x47F is used by the mailboxes. When CAN FD is enabled,
    the exact address for each MB depends on the size of its payload. See CAN Memory Partition for CAN FD for more detailed information
    MB地址空间偏移量为0x80~0x47F。当CANFD使能时,每个MB实际地址空间取决于payload长度(指MB装载的内容报文数据场相关信息)。

     
  • When CAN FD is enabled, the CAN RAM can be partitioned in blocks of 512 bytes. Each block can accommodate a number of Message Buffers which depends on the configuration provided by CAN_FDCTRL[MBDSRn] bit fields.

二、MB相关寄存器地址

三、Payload长度不同的MB地址空间

CAN_FDCTRL[MBDSR]Payload Length of MB(Byte)Each MB address Length(Byte)
   0  0080x10
101160x18
210320x28
311640x48

PS:具体的地址Map

四、MB RAM分区

五、项目需求分析

总线类型:CANFD标准帧;

报文数量:发送12条(长度为8B,4条;长度为32B,2条;长度为64B,6条),接收2条(长度均为64B),共计14条报文。

综上,报文条目为14,最大数据长度为64B。所以可以将Message Buffer两个Block的payload长度设置均设置为64-byte,MB总数量为14,可以满足项目使用需求。

六、寄存器配置设计


由于RAM block中的MB数据长度不同导致地址空间不同,由参数CAN_FDCTRL[MBDSRn]这一唯一的固定配置寄存器决定。所以根据不同的项目需求,分析出该如何合理设置该寄存器,达成MB的最优化使用。

根据第五章的分析,仅需配置RAM block MB数据长度都为64字节即可满足需求。

所以,对于MB发送和接收的处理代码可以基于MB号索引到实际的MB RAM空间地址进行考虑。

MB RAM空间地址内容如下:

根据MB号(mbIdx)得到该MB RAM起始地址(addr)的函数源代码如下:

static ResultStatus_t CAN_GetMbAddr(CAN_Id_t id,uint8_t mbIdx,
                                    CAN_FdMbRegion_t *region,
                                    CAN_Mb_t **addr)
{
    can_reg_t * CANx = (can_reg_t *)(canRegPtr[id]);
    uint8_t payloadSize;
    uint8_t configFieldSize = 8U;
    uint32_t ramBlockSize = 512U;
    uint32_t ramBlockOffset;
    uint32_t mbSize,maxMbNum;
    uint32_t mbOffset;
    ResultStatus_t retVal = SUCC;
    if(region != NULL)
    {
        *region = CAN_FD_MB_REGION_0;
    }
    
    payloadSize = CAN_GetPayloadSize(id,CAN_FD_MB_REGION_0);
    mbSize= (uint32_t)payloadSize + (uint32_t)configFieldSize;
    maxMbNum  = ramBlockSize / mbSize;
    
    ramBlockOffset = 0U;
    
    if(mbIdx >= maxMbNum)
    {
        mbIdx -= (uint8_t)maxMbNum;
        
        payloadSize = CAN_GetPayloadSize(id,CAN_FD_MB_REGION_1);
        mbSize= (uint32_t)payloadSize + (uint32_t)configFieldSize;
        maxMbNum  = ramBlockSize / mbSize;
        ramBlockOffset = 512U; 
        
        if(mbIdx >= maxMbNum)
        {
            retVal = ERR;
        }
        else
        {
            if(region != NULL)
            {
                *region = CAN_FD_MB_REGION_1;
            }
        }
    }
    if(SUCC == retVal)
    {
        /* Multiply the MB index by the MB size (in words) */
        mbOffset = ramBlockOffset + (mbIdx ) * mbSize;
        /*PRQA S 0303 ++*/
        *addr = (CAN_Mb_t *)((uint32_t)&(CANx->CAN_MB[0]) + mbOffset);
        /*PRQA S 0303 --*/
    }

    return retVal;
}

接下来对该MB的地址空间进行配置,addr的数据类型如下所示:

typedef volatile struct
{
        union {
                struct {
                        uint32_t TimeStamp			   :16;  /* [15:0]				   */
                        uint32_t Length				   : 8;  /* [23:16] 			   */
                        uint32_t CODE 				   : 4;  /* [27:24] 			   */
                        uint32_t RSVD_28			   : 1;  /* [28]				   */
                        uint32_t ESI			       : 1;  /* [29]				   */
                        uint32_t BRS				   : 1;  /* [30]				   */
                        uint32_t EDL				   : 1;  /* [31]				   */
                } BF;
                uint32_t WORDVAL;
        } Config;

        /* 0x84*/
        union {
                struct {
                        uint32_t ID_EXTEND			   :18;  /* [17:0]				   */
                        uint32_t ID_STANDARD		   :11;  /* [28:18] 			   */
                        uint32_t PRIO 				   : 3;  /* [31:29] 			   */
                } BF;
                uint32_t WORDVAL;
        } Id;

        uint32_t data[16];
} Can_MsgBufType;

  • 27
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值