S32k312 CANFD 通过FlexCAN_Ip_ConfigRxMb()设置问题

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

S32k312 CANFD 通过FlexCAN_Ip_ConfigRxMb()设置问题

Jump to solution
362 Views
Bert2023
Contributor III

你好:

在使用S32k312 配置CANFD功能时发现,

FlexCAN_Ip_ConfigRxMb(INST_FLEXCAN_0, RX_MB_IDX, &rx_info, MSG_ID);
FlexCAN_Ip_Receive(INST_FLEXCAN_0, RX_MB_IDX, &rxData, false);

rx_info.data_length = 8u;

rx_info.fd_enable = FALSE;
1. Data的length和FD_enable 设置为8U,和FALSE时,当发送端发送16个字节CANFD帧时,S32K312 端还是能接收到16个byte的数据,请问这是问什么?代码如下:

 

Flexcan_Ip_DataInfoType rx_info;

IntCtrl_Ip_EnableIrq(FlexCAN0_1_IRQn);
IntCtrl_Ip_InstallHandler(FlexCAN0_1_IRQn, CAN0_ORED_0_31_MB_IRQHandler, NULL_PTR);

FlexCAN_Ip_Init(INST_FLEXCAN_0, &FlexCAN_State0, &FlexCAN_Config0);
FlexCAN_Ip_SetRxMaskType_Privileged(INST_FLEXCAN_0,FLEXCAN_RX_MASK_INDIVIDUAL);
FlexCAN_Ip_SetRxIndividualMask_Privileged(INST_FLEXCAN_0,RX_MB_IDX,0x0<<18);

FlexCAN_Ip_SetStartMode(INST_FLEXCAN_0);

//setupCanXCVR_TJA1153();

tx_info.is_polling = FALSE;
tx_info.msg_id_type = FLEXCAN_MSG_ID_STD;
tx_info.data_length=64;
tx_info.fd_enable = TRUE;
tx_info.enable_brs = TRUE;


rx_info.msg_id_type = FLEXCAN_MSG_ID_STD;
rx_info.data_length = 8u;
rx_info.fd_enable = FALSE;
rx_info.fd_padding = FALSE;
rx_info.enable_brs = FALSE;
rx_info.is_polling = FALSE;
rx_info.is_remote = FALSE;



FlexCAN_Ip_ConfigRxMb(INST_FLEXCAN_0, RX_MB_IDX, &rx_info, MSG_ID);
FlexCAN_Ip_Receive(INST_FLEXCAN_0, RX_MB_IDX, &rxData, false);

FlexCAN_Ip_Send(INST_FLEXCAN_0, TX_MB_IDX, &tx_info, MSG_ID, (uint8 *)&dummyData);

此图为s32k312接收到数据,再发送出来:

Bert2023_0-1730795465155.png

 

0 Kudos
Reply
1 Solution
302 Views
Senlent
NXP TechSupport
NXP TechSupport

Hi@Bert2023

不错的问题,之前没细心留意过。

我测试之后发现确实是这样,当调用过FlexCAN_Ip_Init之后,每个MB的大小是已经确定了,你的工程是设置为64byte的数据长度,所以只要rx_info.data_length在64byte之内,你能收到所有的数据。

但是你可以查看rxData.dataLen来查看当前收到的Frame的数据长度,这样你就直到你实际需要接收多少个字节的数据。

FlexCAN_Ip_Receive(INST_FLEXCAN_0, RX_MB_IDX, &rxData, false);

for(int i=0;i<rxData.dataLen;i++)
{
     dummyData[i]=rxData.data[i];
}

View solution in original post

0 Kudos
Reply
3 Replies
303 Views
Senlent
NXP TechSupport
NXP TechSupport

Hi@Bert2023

不错的问题,之前没细心留意过。

我测试之后发现确实是这样,当调用过FlexCAN_Ip_Init之后,每个MB的大小是已经确定了,你的工程是设置为64byte的数据长度,所以只要rx_info.data_length在64byte之内,你能收到所有的数据。

但是你可以查看rxData.dataLen来查看当前收到的Frame的数据长度,这样你就直到你实际需要接收多少个字节的数据。

FlexCAN_Ip_Receive(INST_FLEXCAN_0, RX_MB_IDX, &rxData, false);

for(int i=0;i<rxData.dataLen;i++)
{
     dummyData[i]=rxData.data[i];
}

0 Kudos
Reply
350 Views
Senlent
NXP TechSupport
NXP TechSupport

Hi@Bert2023

工程发过来,我帮你测试检查下

0 Kudos
Reply
321 Views
Bert2023
Contributor III

好的,多谢!工程文件如附件,环境DS3.4 +S32K3 RTD2.0.0   ,FD code参考Example S32K358 FlexCAN TXRX ISR S32DS35 RTD400 - NXP Community例程。

0 Kudos
Reply