查看: 280|回复: 2

[求助] RT1024的CAN多邮箱接收例程

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
22
最后登录
2024-1-4
发表于 2023-12-27 11:11:07 | 显示全部楼层 |阅读模式
RT1024的CAN多邮箱接收,软件中没有例程demo,有相关联的例程发下
回复

使用道具 举报

该用户从未签到

2

主题

7

帖子

0

新手上路

Rank: 1

积分
30
最后登录
2024-1-15
发表于 2024-1-4 20:27:53 | 显示全部楼层
感觉这论坛人烟稀少啊,如果是单邮箱模式,只需要给对应邮箱配置ID和过滤器,打开邮箱中断,接收中断里根据邮箱状态取数据就好了
    flexcan_rx_mb_config_t RxMbConfig;

    RxMbConfig.type = kFLEXCAN_FrameTypeData;
    for(uint8_t i = 0; i < flt_num; i++)
    {
        if(pFilterID[i] & 0x80000000)
        {
            pFilterID[i] &= 0x1FFFFFFF;
            pMaskID[i] |= 1 << 30;
            RxMbConfig.format = kFLEXCAN_FrameFormatExtend;
        }
        else
        {
            RxMbConfig.format = kFLEXCAN_FrameFormatStandard;
        }
        FLEXCAN_SetRxIndividualMask(m_pCanCtl, (i + CAN_RX_BUFFER_MB0),  pMaskID[i]);

        RxMbConfig.id = pFilterID[i];
        FLEXCAN_SetRxMbConfig(m_pCanCtl, (i + CAN_RX_BUFFER_MB0), &RxMbConfig, true);

        FLEXCAN_EnableMbInterrupts(m_pCanCtl, 1 << (i + CAN_RX_BUFFER_MB0));
    }


bool CDeviceCAN::RecvCanMsg(CAN_MSG * can_data)
{
    bool bRet = true;
    uint32_t Seq = CAN_NO_MB;
    uint32_t MbStatus = FLEXCAN_GetMbStatusFlags(m_pCanCtl, CAN_RX_FLAG_MASK);

    if (MbStatus == 0) return false;
   
    for(uint8_t i = CAN_RX_BUFFER_MB0; i <= CAN_RX_BUFFER_MB_SIZE; i++)
    {
        uint32_t mask = 0x01 << i;
        if(MbStatus & mask)
        {
            FLEXCAN_ClearMbStatusFlags(m_pCanCtl, mask);

            if(m_pCanCtl->IMASK1 & mask)
            {
                Seq = i;
                break;
            }
        }
    }
   
    if(Seq == CAN_NO_MB)
    {
        return false;
    }

    flexcan_frame_t rxframe;
    if(FLEXCAN_ReadRxMb(m_pCanCtl, Seq, &rxframe) != kStatus_Fail)
    {
        if(rxframe.format == kFLEXCAN_FrameFormatExtend)
        {
            can_data->IdType = CAN_Id_Extended;
            can_data->Id = rxframe.id;
        }
        else
        {
            can_data->IdType = CAN_Id_Standard;
            can_data->Id = (rxframe.id & CAN_ID_STD_MASK) >> CAN_ID_STD_SHIFT;
        }
        if(rxframe.type == kFLEXCAN_FrameTypeRemote)
        {
            can_data->IdType |= CAN_RTRQ_Remote;
        }
        can_data->Id = BigLittleEndianChg(can_data->Id);;
        can_data->Dlc = rxframe.length;
        can_data->TimeStamp = rxframe.timestamp;

        can_data->Data[0] = rxframe.dataByte0;
        can_data->Data[1] = rxframe.dataByte1;
        can_data->Data[2] = rxframe.dataByte2;
        can_data->Data[3] = rxframe.dataByte3;
        can_data->Data[4] = rxframe.dataByte4;
        can_data->Data[5] = rxframe.dataByte5;
        can_data->Data[6] = rxframe.dataByte6;
        can_data->Data[7] = rxframe.dataByte7;
               
        return true;
    }
    else
    {
        bRet = false;
    }

    return bRet;
}
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

111

帖子

0

中级会员

Rank: 3Rank: 3

积分
449
最后登录
2024-3-29
发表于 2024-1-13 14:33:16 | 显示全部楼层
用FIFO即可,不用多邮箱
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-30 01:35 , Processed in 0.106560 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表