This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM48L952:CAN IF3问题

Guru**** 2534260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem

器件型号:RM48L952

大家好、感谢大家始终回答我的问题。
今天、我想问一个与 CAN 的 IF3相关的问题。
使用 CAN IF3接收通知数据时、IF3不会更改 CAN 中断寄存器的值、因此无法通过选中报文框编号来区分数据。 IF3的这一特性吗? 还是错误的结果?
2.为了使用 IF3对数据进行分类、我尝试通过查看 IF3 ARB 寄存器的 ID 对数据进行分类。
此时 ARB 寄存器的 ID 值未复位、因此即使是发送中断、也会出现接收中断工作的现象。 最后、我在条件中添加了条件"当消息框编号为0时"、但我不理解这种现象。
3.如果 IF3未接收 CAN 中断寄存器的报文框编号值、那么在使用通知中的 IF3接收数据时、应如何对数据进行分类?
感谢你能抽出时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我将此问题转发给我们的 CAN 专家、他很快会向您提供最新信息。

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    IF3寄存器(数据、仲裁、控制)可以用 CAN IF3x 更新寄存器中指定的已接收报文对象自动更新。 这些对象应具有相同的消息 ID 和掩码设置。 报文对象的#不会复制到 IF1x/IF2x 和 IF3x 寄存器。  

    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem ]1. 当使用 CAN IF3从通知接收数据时、IF3不会更改 CAN 中断寄存器的值、因此无法通过选中消息框编号来区分数据。 IF3的这一特性吗? 还是错误的结果?

    如前所述、如果启用 DE3、则可以自动更新 IF3x 寄存器并生成 DMA 请求。 您的项目中是否启用了此功能?  

    如果要使用轮询模式、可以检查 IF3Upd 标志以确定是否有新的 IF3内容就绪。

    今天让我仔细检查一下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem ]1. 当使用 CAN IF3从通知接收数据时、IF3不会更改 CAN 中断寄存器的值、因此无法通过选中消息框编号来区分数据。 IF3的这一特性吗? 还是错误的结果?

    如果使用 CAN2 IF3x、则应禁用 CAN2 RX 中断。

    报文对象中的 NewDat 位将通过一个到 IF3的传输被复位。 如果 CAN RX 中断被启用、代码将永远检查 newDat 标志。

    您可以使用 IF3中断从 IF3x 数据寄存器读取数据、也可以使用轮询模式(在 IF3OBS 中检查 IF3Upd 标志)从 IF3x 数据寄存器读取数据、或使用 DMA 自动将数据从 IF3x 数据寄存器传输到 SRAM。

    要使用 IF3x 中断、请为 CAN2 IF3x 选择 VIM 矢量表的通道46、并将 CAN2 CTL 寄存器的 DE3位置位:

    //启用 CTL 寄存器中的 DE3位,以便在 IF3接收数据时触发 DMA
    canREG2->CTL |=(1U <<20U);

    报文对象的数据被复制到 IF3x 数据寄存器后、IF3Uptd 标志被置位。  

    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem ]2. 为了使用 IF3对数据进行分类、我尝试通过查看 IF3 ARB 寄存器的 ID 对数据进行分类。
    此时 ARB 寄存器的 ID 值未复位、因此即使是发送中断、也会出现接收中断工作的现象。 最后、我在条件中添加了条件"当消息框编号为0时"、但我不理解这种现象。

    要更新 ID、需要设置 IF3OBS 寄存器的 ARB 位。

    例如 ,canREG2->IF3OBS = 0x1F;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem ]3. 如果 IF3未接收 CAN 中断寄存器的消息框编号值、那么在使用通知中的 IF3接收数据时、应如何对数据进行分类?[/QUERT]

    应使用消息 ID 而不是邮箱#。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    通过测试、如果在使用 IF3时禁用 RX 中断、则不会产生 RX 中断。 原因是 VIM 通道的44、46、60 = CAN1、2、3的 IF3、但即使它们被启用、中断代码也不会在 sys_vim.c 中生成、因此该代码不能与通知一同使用。 因此、使用 IF3禁用 RX 中断是不正确的。
    我想0~23的是、当使用 IF3而不是 DMA 接收数据时、DCAN INT (CAN 中断寄存器)的 μ s 位中的消息框编号未启用的现象。
    因此、由于使用 IF3接收数据时没有消息框编号、因此出现了消息= 0U。
    我想知道这种现象是正常的还是异常的。
    如果这是正常操作、并且它设计为这样操作、那么我想知道为什么 IF3的设计使它在接收时无法区分消息框编号。
    我想知道为什么即使在启用 VIM 通道44、46、60 (CAN1、2、3 IF3)时也不生成中断代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem/4399368 #4399368"]通过测试、如果使用 IF3时禁用 RX 中断、则不会生成 RX 中断。 原因是 VIM 通道的44、46、60 = CAN1、2、3的 IF3、但即使它们被启用、中断代码也不会在 sys_vim.c 中生成、因此该代码不能与通知一同使用。 因此、通过使用 IF3禁用 RX 中断是不正确的。[/引用]

    HAL 不为通道44/46/60提供 ISR 处理程序。 您必须为这些通道定义 ISR 处理程序。 中断标志为 IF3OBS 寄存器中的 IF3Uptd:

     

    这是我的 can2IF3UpdateInt ISR 处理程序示例代码。  报文对象的数据被复制到 IF3x 数据寄存器后、将调用该处理程序。

    #pragma CODE_STATE (CAN2IF3UpdateInterrupt、32)
    #pragma INTERRUPT (CAN2IF3UpdateInterrupt、IRQ)

    void can2IF3UpdateInterrupt (void)

    uint32 value =(canREG2->IF3OBS & 0x9800)>> 8;
    uint8 * pData = rx_data;
    uint32 i;

    如果(值= 0x98U)

    对于(I = 0U;I < 8;I++)

    #if ((__little_endian__= 1)||(__little_ENDIAN__= 1)
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    *Rx_ptr = canREG2->IF3DATx[i];
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    RX_PTR++;
    其他
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    *Rx_ptr = canREG2->IF3DATx[s_canByteOrder02[i];
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    RX_PTR++;
    #endif


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem/4399368 #4399368"]当使用 IF3而不是 DMA 接收数据时,我所好奇的是,当 DCAN INT (CAN 中断寄存器)的0~23位中没有启用消息框编号这一现象。

    如果 CTL 寄存器的 DE3被置位、且 VIM 通道46被启用、 那么中断将在消息目标的数据被复制到 IF3x 数据寄存器后生成。 中断标志为 IF3Uptd。  IF3x 不使用 DCAN INT。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem/4399368 #4399368]\n 因此,由于使用 IF3接收数据时没有消息框编号,因此出现了消息=0U。
    我想知道这种现象是正常的还是异常的。[/引述]

    为了处理接收到的 CAN 数据、messageID 足以确定消息的来源。  

    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem/4399368 #4399368"]如果这是正常操作,并且它是这样设计的,我想知道为什么 IF3的设计是为了在接收时无法区分消息框编号。

    所选报文对象(IF3UPDxx 寄存器)的数据、仲裁和屏蔽自动传输到 IF3x 寄存器(数据、ARB 和屏蔽)。 与使用 IF1和 IF2不同、您需要将报文编号写入 IF1CMD 或 IF2CMD 寄存器、以启动从报文对象到 IF1或 IF2寄存器的数据传输。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem/4399368 #4399368"]我想知道为什么即使启用了 VIM 通道44、46、60 (CAN1、2、3 IF3)也不会生成中断代码。

    配置 CAN IF3寄存器:

    //启用 CTL 寄存器中的 DE3位,以便在 IF3接收数据时触发 DMA 和 IF3中断
    canREG2->CTL |=(1U <<20U);

    //读取数据 A 和 B、ARB 和 MASK */
    CANREG2->IF3OBS = 0x1F;

    //为自动更新配置的消息框0/1/2/3/4
    canREG2->IF3UEy[0]= 0x00000F;//4邮箱

    2.启用 VIM 通道46 (IF3),并将您自己的 ISR 作为我的示例写入

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    数据表中没有任何内容表明在作为 IF3接收数据时不使用 DCAN INT。
    因此、我无法确定使用哪种方法是正确的。
    但是、谢谢您、我解决了这个问题。 感谢您的教学。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对 CAN1 IF3执行了 ISR 处理程序。 但是、即使同时启用了 IF3 UEy 和 OBS、CAN1 IF3 ISR 处理程序也不会触发中断。
    由于 CAN1也具有 TX 传输角色、因此将 CAN1启用为高电平是否会出现问题?
    在 CAN1HighlevelInterrupt 中、中断可用于发送和接收、但我不知道我所做的 CAN1 IF3 ISR 处理程序为什么不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    CTL 寄存器中的 DE1是否启用?  

    VIM 矢量表中的 DCAN1 IF3通道也应该被启用。

    将 ISR 名称(CAN1IF3UpdateInterrupt)添加到 VIM RAM 的通道44:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 VIM 矢量表中添加了 CAN1 IF3 ISR 至 VIM RAM 并启用了 IF3通道。
    我知道 CAN 控制寄存器中的 DE1位在连接 DMA 请求线路时启用 IF1。 它是否与 IF3 ISR 相关?
    我正在连接项目。 此项目在 EVM 板上进行了测试。

    e2e.ti.com/.../20221109_5F00_CAN1_5F00_2_5F00_TEST.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="518229" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168405/rm48l952-can-if3-problem/4401172 #4401172"]是否与 IF3 ISR 相关?

    DE3用于为 IF3启用 DMA 请求线路、并用于启用 IF3Upd 标志生成的中断。 在数据通过 IF3传输后、IF3Upd 被置位。

    //使能 CTL 寄存器中的 DE3位来触发 DMA 并在 IF3接收数据时产生 IF3中断
    canREG2->CTL |=(1U <<20U);

    您的代码未设置 DE3位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。 通过测试、我发现它按我的需要工作。
    在数据表中、DE1、DE2和 DE3位仅描述为 DMA 请求线路使能、因此我不知道在使用 IF3 ISR 处理程序时必须启用它们。
    感谢您宝贵的时间。