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.

[参考译文] TMS320F28384D:MCAN 仅生成一次中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1106270/tms320f28384d-mcan-only-generate-once-interrupt

器件型号:TMS320F28384D
主题中讨论的其他器件:C2000WARE

设计

我的客户第一次在 F28384的基础上开发 MCAN、我们希望在 RX 缓存接收新数据时生成 MCAN RX 中断、但是现在只能生成一次中断、然后再也不会发生中断、我们将检查寄存器状态、如下所示:

1、  CPU 进入 MCAN 第一次 RX 中断功能、检查寄存器窗口中的 MCAN 中断标志和 CPU PIE 标志是否都已设置

2、  固件清除 MCAN 中断标志和 CPU PIE 标志、并确认它们在寄存器窗口中变为0、然后退出中断功能

3、  将 CAN 新数据发送到总线、并确认 RX 缓冲区在寄存器窗口中接收到新数据

4、  检查 MCAN 中断标志是否再次置位、并确认 MCAN 中断使能是否置位

5、  但是 CPU 从不响应 MCAN 中断功能、检查 CPU PIE 标志是否始终 为0、并且不会再次设置

6、  其他函数中断仍然可以正常继续工作、这表示 CPU PIE 应该在没有块的情况下工作

我是否可以询问我们是否有用于实现 MCAN RX 缓冲中断的示例代码? 因为我检查到目前为止 C2000WARE 中似乎没有这样的示例? 我还为 MCAN 配置附加了客户代码、或者您能否帮助查看客户 代码是否有误?    

e2e.ti.com/.../MCAN_5F00_Config.c

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

    第二个问题是、客户可以  使用 RX FIFO 同时接收标准消息和扩展消息、但使用 RX 缓存只能接收一种类型的消息。 我们是否可以获得有关什么设置会导致此类差异行为的建议? 谢谢你。

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

    您好、Terry、

    对于中断问题、我没有从客户代码中看到中断是如何配置的。  在 MCAN 环回示例中,有一个函数调用 MCANIntraConfig(),用于设置和定义 MCAN 中断。  可能会有所帮助的解决方案。

    与其他 MCAN 专家一起检查 RX FIFO 和 RX 缓冲器问题。

    此致、

    Joseph

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

    您好 Joseph

    谢谢您的建议。 我们今天已经解决了中断问题。 它受如何清除 RX 中断功能中的 MCAN 标志的影响、如下所示。

    EALLOW;  McanssRegs.MCANSS_EOI.bit.EOI = 1;EDIS;   //此代码 有问题且 只生成一次 RX 中断

    HW_WR_FIELD32 (MCAN0_BASE + MCAN_MCANSS_EOI、MCAN_MCANSS_EOI、0x1U);  //此代码将正常运行并继续生成 RX 中断

    但是、我们仍然无法解决 RX 消息类型问题。 我们设置了标准 ID 和扩展 ID 滤波器、并且可以在使用 RX FIFO 时同时接收两种类型的消息、但在 使用 RX 缓存时只能接收扩展消息。 感谢有关如何使用 RX 缓存接收两种类型的消息的专家建议。

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

    Terry、  

    如果我对您的问题进行了正确解释、您在使用 RX 缓存接收扩展消息时遇到问题。 如果我不理解您的问题、请告诉我。

    我认为您需要重新评估所设置的 SFID2/EFID2值。 为 SFID2/EFID2设置的值直接对应于滤波器编号。

    RxMsg_Ext.efid2 = RxFiltNum; 
    
    //Other configurations go here
    
    MCAN_addExtMsgIDFilter(MCAN0_BASE, RxFiltNum, &RxMsg_Ext);

    谢谢。

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

    Terry、  

    要正确清除中断、请在 ISR 中包含以下行

    HW_WR_FIELD32(MCAN0_BASE + MCAN_MCANSS_EOI, MCAN_MCANSS_EOI, 0x2);
    
    //      For the last parameter
    //  0x01 clears Interrupt line 0
    //  0x02 clears Interrupt line 1

    谢谢。

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

    谢谢、Sahil

    是的、你是对的。 现在、我们在 ISR 中将代码1包含为"HW_WR_FIELD32 (MCAN0_BASE + MCANSS_EOI、MCAN_MCANSS_EOI、0x2)"、并运行正常。  开始时、我们在  ISR 中将代码2包含为"EALLOW;McanssRegs.MCANSS_EOI.bit.EOI=1;EDIS;"、并且只生成一次中断。 实际上 、我不理解 代码1和代码2有何不同、但应该将同一寄存器设置为相同的值。   

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

    Terry、  

    我们将对其进行研究、并将很快返回给您。

    如果您能够正确操作 RX 缓冲器、请提供更新。

    谢谢。

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

    你(们)好

    很抱歉更新晚了、因为中国只花了几天的假期。 现在、我们可以根据您的建议使用 RX 缓存来接收扩展消息和标准消息。谢谢。  

    但是、ISR 仍然只使用 RX 缓存生成一次中断。  我们确保在中断函数中包含"HW_WR_FIELD32 (MCAN0_BASE + MCAN_MCANSS_EOI、MCAN_MCANSS_EOI、0x2")、并且如果我们使用 RX FIFO、ISR 可以继续生成中断。 我无法理解为什么 ISR 会使 RX FIFO 和 RX 缓冲区的行为有所不同?  

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

    Terry、  

    首先、鉴于上述代码启用了中断线路0、 因此我假设您使用的最后一个参数为"0x1"、而不是您在上面的答复中提到的参数。

    [引用 userid="117438" URL"~/support/microcontrollers/C2000-microcontrollers-group/CC2000/f/C2000-microcontrollers-forum/1106270/tms320f28384d-mcCAN-only-generate-one-interrupt/4106437#4106437"] HW_WR_FIE32 (MCAN0_BASE + MCAN_EO2_MCAN_IELDSS]、[0xMCAN_EO2_MCAN_EMCSS_IG]

    其次、正如器件 TRM 中提到的、需要清除相应 RX 缓冲区的 NewData 标志、否则无法接收下一条消息。  

    请参阅"mCAN.c"中定义的以下函数、该函数可用于清除 NewData 标志。

    void  MCAN_clearNewDataStatus(uint32_t                    baseAddr,
                                  const MCAN_RxNewDataStatus *newDataStatus)

    向 MCAN_NDAT1/2寄存器中的特定位写入1会将该位清零。

    谢谢。

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

    你(们)好

    根据您的建议添加"MCAN_clearNewDataStatus"后、现在使用 RX 缓存、ISR 函数继续正常运行。非常感谢!