如何使用 FLEXCAN RRS?你好,如果我想使用 CTRL2[RRS],应该如何配置?我正在测试是否能接收到所有 ID 的远程帧,因此需要这样配置,然后让 CPU 执行相应的操作。能否举例说明如何使用 CTRL2[RRS]?
谢谢!
萨兰
Re: How to use FLEXCAN RRS?你好 森伦特
感谢您的帮助。我现在已经解决了这个问题。面具的例子也对我有所帮助。
谢谢!
萨兰
Re: How to use FLEXCAN RRS?Hi@SaLan
全局或个人设置是可选的。(您可以看看这篇文章)
https://community.nxp.com/t5/S32K-Knowledge-Base/S32K1xx-FlexCAN-Mask-Setting-Demo/ta-p/1519753
我制作的演示仅使用全局掩码设置来演示 RRS 第 1 位的配置。
Re: How to use FLEXCAN RRS?你好 森伦特
感谢您的回答,这对我帮助很大。
我想设置全局掩码 RTR 位和 IDE 以接收远程帧。但是,我发现使用您的配置无法接收它们。
然后,在 MB 中配置 RTR=1 后,我只能接收远程帧。
由于 SDK 中针对 MB 和全局掩码的库函数配置不完整,您的示例实际上只是根据 ID 执行了相应的逻辑判断。
如图所示,我使用了您的 DEMO。事实上,无论是数据帧还是远程帧,只要 ID 是 0x105,就能接收。我认为这并不严谨。
我的建议如下:
如果要准确接收远程帧,需要进行以下配置
/*RRS = 1*/
FLEXCAN_EnterFreezeMode(CAN0);
/*设置全局掩码(IDE 和 RTR)*/
CAN0->RXMGMASK = 0xC0000000;
CAN0->RX14MASK = 0xC0000000;
CAN0->RX15MASK = 0xC0000000;
can0->ctrl2 = (can0->ctrl2& ~can_ctrl2_eacen_mask) | can_ctrl2_eacen(1);
/* 启用全局 RX 屏蔽 */
can0->ctrl2 = (can0->ctrl2& ~can_ctrl2_rrs_mask) | can_ctrl2_rrs(1u);
FLEXCAN_ExitFreezeMode(CAN0);
并且必须设置 MB(RTR=1)。这样才能接收远程帧,然后进行逻辑判断处理。
(上述示例仅适用于全局掩码。如果要设置特定 MB,则需要配置相应的 RXIMR)。
Re: How to use FLEXCAN RRS?Hi@SaLan
我做了一个演示供你参考,RRS 设置为 1,如果收到的远程帧编号为 0x105,将发回 ID 为 0x100 的帧。

Re: How to use FLEXCAN RRS?您好,Senlent
我如何才能像接收普通数据帧一样接收它。
当我将 RRS 设置为 1 时,当(FLEXCAN_DRV_GetTransferStatus(INST_FLEX_CAN0,i) == STATUS_BUSY)时;不工作。== STATUS_BUSY);不工作。
我想知道我是什么时候收到这个 CAN 画框的。
之后,我就可以进行判断等操作了。
我需要一个当 RRS = 1 时的接收演示。
谢谢
SaLan
Re: How to use FLEXCAN RRS?Hi@SaLan
RRS 位默认设置为 0,因此可以直接使用此 api:
"FLEXCAN_DRV_ConfigRemoteResponseMb(instance, mb_idx,&txMsg);"

如果要将 RRS 设置为 1,则只需像接收普通数据帧一样接收即可。
Re: How to use FLEXCAN RRS?你好、森伦特
我使用 S32DS.3.4
谢谢
Re: How to use FLEXCAN RRS?Hi@SaLan
我会花点时间做一个类似的演示供你参考。
请告诉我您现在使用的集成开发环境和 SDK 版本。
Re: How to use FLEXCAN RRS?是的,我明白。我想确认应该设置哪个 CS 代码才能正确接收数据。
下面是我的代码示例。您能帮我找出问题所在吗?
如果可能,请提供如何使用 SDK 正确接收 RRS 的示例?
uint8_t CAN0_RXREMOTE_RRS_Test()
{
uint8_t data[1];
FLEX_CAN0_Config0.is_rx_fifo_needed=false;
FLEX_CAN0_Config0.max_num_mb=32;
FLEX_CAN0_Config0.num_id_filters=FLEXCAN_RX_FIFO_ID_FILTERS_8;
FLEX_CAN0_Config0.transfer_type=FLEXCAN_RXFIFO_USING_INTERRUPTS;
FLEXCAN_DRV_Init(INST_FLEX_CAN0,&FLEX_CAN0_State0,&FLEX_CAN0_Config0);
FLEXCAN_DRV_SetRxMaskType(INST_FLEX_CAN0, FLEXCAN_RX_MASK_GLOBAL);
FLEXCAN_EnterFreezeMode(CAN0);
CAN0->CTRL2 = (CAN0->CTRL2& ~CAN_CTRL2_EACEN_MASK) | CAN_CTRL2_EACEN(1);
CAN0->CTRL2 = (CAN0->CTRL2& ~CAN_CTRL2_RRS_MASK) | CAN_CTRL2_RRS(1);
CAN0->RXMGMASK = 0xC0000000;
CAN0->RX14MASK = 0xC0000000;
CAN0->RX15MASK = 0xC0000000;
FLEXCAN_ExitFreezeMode(CAN0);
flexcan_data_info_t RxdataInfo =
{
.data_length= 1U,
.msg_id_type= FLEXCAN_MSG_ID_STD,
.enable_brs= false,
.fd_enable= false,
.fd_padding= 0U,
.is_remote= true
}; f
or (int i = 0; i < 32; i++) {
data [0] =i; f
lexcan_drv_configrxMB (INST_FLEX_CAN0, i, & rxDataInfo, i);
} while (1) {
/* 定义接收缓冲区 */ flexcan_msgbuff_t recvBuff_t recvBuff;f
or (int i = 0; i < 32; i++)
{flexcan_DRV_Receive (INST_FLEX_CAN0, i, & recvBuff); wh
ile (f
lexcan_DRV_GetTransferStatus (INST_FLEX_CAN0, i) == STATUS_BUSY);PINS_DRV_
togglePins (PTD,(1 < < 15));
}}
}
Re: How to use FLEXCAN RRS?Hi@SaLan
我不确定您现在使用的 MCU 部件号,我猜您使用的是 S32K1xx。
因此,如果将 RRS 设置为 1,则亮点解释得非常清楚,它将被视为数据帧,但不会自动生成远程响应帧。
