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.

[参考译文] TM4C1231H6PM:CAN 总线模块帮助

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/602597/tm4c1231h6pm-can-bus-module-help

器件型号:TM4C1231H6PM

以下是我在 Tiva 的 CAN 总线模块中遇到的问题:

目前、我在 CAN 总线模块中设置了其中一个报文对象来接收具有特定 ID 的 CAN 数据包。 这些数据包以猝发方式发送:发送方发送3个数据包的速度连续发送,每3秒一次。 我发现我的软件无法足够快地将每个数据包从缓冲区中移出、因此某些数据包会被覆盖、这会导致我们的系统出现问题。

我已经仔细反复阅读了 Tiva CAN 模块的文档,但我仍然不清楚如何创建 FIFO 缓冲区来存储数据包。 似乎无法将报文对象配置为像常规 FIFO 一样运行。 但可能我在这里遗漏了一些东西。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mike:
    您是否设置了一个消息对象或三个消息对象。 要形成 FIFO、您需要设置具有相同 ID 和 ID 掩码的三个消息对象。 前两个报文对象需要指定 FIFO。 请参阅下面的示例、该示例构成一个三条目 FIFO。

    //
    //配置接收对象。
    //
    sMsgObjectRx.ulMsgID =(0x400);
    sMsgObjectRx.ulMsgIDMask = 0x7f8;
    sMsgObjectRx.ulFlags = MSG_OBJ_USE_ID_FILTER | MSG_OBJ_FIFO;
    //
    //前两个消息对象设置了 MSG_OBJ_FIFO 来指示
    //它们是 FIFO 的一部分。
    //
    CANMessageSet (CAN0_BASE、1、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
    CANMessageSet (CAN0_BASE、2、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
    //
    //最后一个消息对象没有设置 MSG_OBJ_FIFO 来指示这一点
    //这是最后一条消息。
    //
    sMsgObjectRx.ulFlags = MSG_OBJ_USE_ID_FILTER;
    CANMessageSet (CAN0_BASE、3、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    请允许我注意、我的公司发现 Mike Xia 巧妙地编写了一篇文章、您的"深入"指导回答非常棒。

    我们是否可以询问您描述的方法是否是建模(某处)-如果是-在哪里可以"单纯的生命"-以进一步(深入)吸收细节?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 CB1、

     去年、我们在另一个 MCU 系列中出现了 CAN FIFO 问题。 我和我的同事花了一些时间来尝试理解这个问题。 我还记得 CAN FIFO 是如何工作的。 :-)

     数据表中介绍了 FIFO 设置。 我知道、如果您事先了解 FIFO 设置、读取数据表将会快速点击。 对于不熟悉使用 CAN FIFO 的用户、第一次读取描述可能不是很明显。 下面是" FIFO 缓冲器配置"部分下数据表的摘录。 同样、一个简单的图表会使理解更加容易。

     "...要将两个或多个报文对象串联到 FIFO 缓冲区中、必须将这些报文对象的标识符和掩码(如果使用)编程为匹配的值。 由于报文对象的优先级是隐式的、所以序号最小的报文对象是 FIFO 缓冲区中的第一个报文对象。 FIFO 缓冲区中除最后一个报文对象外的所有报文对象的 EOB 位都必须清零。 FIFO 缓冲区中最后一个报文对象的 EOB 位置位、表示它是缓冲区中的最后一个入口。"

     Driverlib 用户指南中还显示了一个示例、但4条目 FIFO 中对此进行了说明。  

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

    谢谢、Charles。 我们"错过"了-或者"4C123手册"中没有-我们唯一的居民、"感兴趣的 MCU"
    您注意到的图表(应该)可能会得到考虑、例如(甚至) A、"仔细重复"阅读、但未能充分理解。

    它"会"证明许多人感兴趣并重视-如果 Mike Xia 愿意实施此"修复"-然后报告(此处)他的调查结果...

    再次感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1、我很确定我已经在数据表中看到过它。 TIVAWare 手册中也提到了这一点。 尽管我不想再详细介绍了。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Robert -(仅限)现在请我"看"。 实际上、即使 MCU 手册中的"4C123"较低、17.3.11.1" FIFO 的配置"也会显示为"字换字"、这与 Charles 列出的内容完全相同、您已经确认了!

    注释为"CAN 功能描述"的17页-在分类描述的16个区域之间共享-此特定问题在列表中的编号为"11"。 我可以合理地确定、在某个时候、我阅读了该部分-但没有回忆...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您不记得400多页的文字? 我很震惊! 我让你震惊了。 震惊!

    认真地说、除非您在阅读时考虑到了该功能、否则很容易跳过。

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

    好的、Robert -一定要维护一些"秘密"!   现在-当我们为"哈利法克斯"(来自缅因州)和" CB1设计"的电子罗盘起吊索时、表示"南方"-和" Unrully、all gurl (正在获取技术) crüe "(尖叫)他们的抗议-然后(仅在那时)您有权"震惊!"

    事实上(必须)我," crüe ",而不是血酒精水平,大脑细胞减少,的海盗造成 了这种过度视力。  (确实震惊了)

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

    感谢您的回答。 实际上、我直接将原始问题发送给了 Mike、他非常友善、可以在论坛中为我重新发布。

    您给出的示例展示了如何使用驱动程序设置 CAN FIFO、这很好。 在该示例中、您连接了3个消息对象以创建 FIFO。 当一个或多个数据包到达时、如果设置了 MSG_OBJ_RX_INT_ENABLE 标志、哪个消息对象将生成中断并具有下一个接收到的数据包? 驱动程序文档中的示例像上面的代码一样设置 FIFO、然后在 while 循环中不断查找来自消息对象#1的数据包。 这是否意味着 ID 最低的报文对象用作 FIFO 的头、以便中断处理程序只处理 ID 最低的报文对象的中断?

    如果您能给我一个示例程序、演示如何通过中断使用 CAN FIFO、那将会非常有帮助。

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

    Sean、

    您的波特率是多少? 您能否共享接收中断代码的正文? 我在我的设置上没有看到这方面的问题、我想知道您的接收是否存在瓶颈。

    Robert

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

    我的中断处理程序不会从消息对象中删除数据。 相反、它会安排一个任务以稍后获取数据。 我的软件中还有许多其他中断、它们也会将任务调度到任务队列中、并且任务按调度顺序进行处理。 因此在检索数据包时会有延迟。 很明显、我可以做一些重新设计来尝试处理 ISR 中的数据包、但 FIFO 将是更好的解决方案。

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

    好的、这说明了您的瓶颈。

    [引用 user="zcircswm02">我的中断处理程序不会从消息对象中删除数据。 相反、它会安排一个任务以稍后获取数据。 [/报价]

    这是一个坏主意,海事组织。

    [引用 user="zcircswm02"]很明显,我可以进行一些重新设计,尝试在 ISR 中为数据包提供服务,

    这也是如此

    [引用 user="zcircswm02">但 FIFO 将是更好的解决方案。
    [/报价]

    我认为这是一个补丁、抵消了 CAN 邮箱设置的大部分优势。

    我是否可以建议一对不同的方法

    • 每条消息使用一个邮箱、并保留您当前的非中断方法。 消息邮箱中的值将是发送的最新值
    • 如果邮箱数量不足、请在从邮箱到队列的中断副本中使用 S/W 队列。 这可以很容易地更改 FIFO 大小以适应以后的消息更改。 它还与您的电流控制流相匹配。

    Robert

    请记住、不能保证您不会收到重复的消息、因此迟早会丢失消息。 您的协议应该能够处理这两种情况。 在良好的网络中,重复的消息比丢失的消息更为常见。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sean、
    请听取 Robert 的建议、因为他对 FIFO 具有更丰富的经验。 从我的角度来看、我将根据 FIFO 的最后一个 msg 对象生成中断。 进入 ISR 后、我将从报文对象(仅当相应的 NEWDAT 位置位时)从最低索引读取到包含 EOB 位的索引。 在我看来、FIFO 模式有点复杂。 如果您正在读取 FIFO、同时又接收到另一帧、则需要考虑这一点。 新帧将被放置在 NEWDAT 位已清零的索引最低的报文对象中。 如果 CPU 读取 FIFO 的时间比下一个新帧要长、则可能会丢失新数据。

    另一个问题是、您的传入邮件是否必须按顺序接收? 根据数据表、无法保证 FIFO 中接收到的消息的顺序。 有关更多详细信息、请参阅数据表、另请参阅图17-3。 FIFO 缓冲区中的消息对象流程图。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nah、Charles。 到目前为止、我在 FIFO 方面的最大专业知识就是意识到我不需要它。

    我的运行速度仅为500kbs、但我有多个板同时传输、并且我没有看到损耗。 另一个问题是、在1Mbps 时、这是否仍然为真。 不过、只有在使用了所有邮箱后、我才会考虑切换到 FIFO。 我可能会先看一下 TIVAWare 库的重写部分。 我记得、它看起来效率相当低。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、在传统意义上、CAN FIFO 似乎并不是真正的 FIFO。 我对 TI 选择的这个特定设计的用例非常好奇。

    在任何情况下、使用这个 CAN FIFO 都不是我的问题解决方案。 我想、当进入 ISR 时、我必须将 CAN 数据包移入队列、以最大限度地减少数据包被覆盖的机会。

    感谢提供帮助的每个人!

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    CAN 模块是我们从第三方购买的 IP。 您可能会发现其他半导体供应商使用的类似 IP。 我同意 CAN FIFO 的实现方式与 UART 或 SSI 等其他 IP 不同。 我想原因是为每个报文对象实现真正的 FIFO 成本太高。