在线时间6 小时
UID2076123
注册时间2016-5-20
NXP金币90
该用户从未签到
新手上路
- 积分
- 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;
} |
|