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.

[参考译文] TMS320F280025C:用户定时发送时 CAN TX 问题

Guru**** 2408620 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1540622/tms320f280025c-can-tx-issue-when-user-a-timed-transmission

器件型号:TMS320F280025C


工具/软件:

您好!

通过 在主循环中调用 can_receive_routin() 和 can_send_routin()、我已成功发送和接收 CAN。  can_send_routin() 只包含一组 can_sendMessage  () 消息调用。

我不使用 DMA、也不使用中断。 我有两个问题:

问题 1: 由于某种原因  ,当我尝试将 can_send_routin() 移动到 1ms 任务时(我也在将它用于另一个进程),我在执行时会收到断言错误。

我在映射文件中查找到错误、看起来像 can.obj、我假设这意味着 can.c 文件? 行号为 487、即:

 assert ((msgCtrl & CAN_IF1MCTL_DLC_M)== msgLen);

这很奇怪、因为我以前从未遇到过 DLC 问题。 我尝试注释掉该断言行、但出于某种原因、我仍然收到具有相同行号的断言错误。 有什么想法在这里可以发生什么?

问题 2:  can_sendMessage (uint32_t base、uint32_t Objid、uint16_t msgLen、 const uint16_t *msgData) 是否 在发送时阻止 CPU? 我注意到、只要在每 1ms 执行过程中添加其中 1 个函数调用、我的 1ms 任务就会大幅减慢。 我曾假设他们不会因为邮箱功能而需要任何处理。 我是否需要启用 DMA 或其他任何功能?

提前感谢!

Steven

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

    您好、Steven:

    当 DLC 检查错误发生时,您是否可以检查寄存器 CAN_IF1MCTL 以获取 DLC 值,并将其与 can_sendMessage () 传递的内容进行比较。  这可能表明添加 CAN 发送功能的 1ms 任务会阻止 CAN 外设寄存器的更新。

    can_sendMessage() 不应阻止 CPU、因为写入 CAN 接口寄存器会启动从邮箱到 CAN 内核和输出到总线的消息传输、这与 CPU 无关。  不过、如果您查看 API 内部、有一个 while 循环会在  CAN_IF1MCTL 值更新后立即轮询 BUSY 位 (CAN_IF1CMD_BUSY)。  可能是 API 在轮询 BUSY 位时花费更多的时间。  如果是这种情况、并且在 1ms 任务中也会遇到持续的 DLC 比较失败、则 1ms 任务之前可能会有一些指令阻止 CAN 模块更新寄存器。

    您是否尝试过在发送例程中使用 CAN ISR?  只有当它检测到邮箱中的有效变化(例如新数据可用时)时、才会发送 CAN 帧。  这可能比基于时间的任务更高效。

    此致、

    Joseph

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

    谢谢 Joseph、我一定会调查发送的 ISR。 我设法 通过用 can_sendMessage_updateDLC () 替换 can_sendMessage_updateDLC () 来修复 can_sendMessage () 问题,尽管 DLC 以前没有问题。  很高兴这个解决方案能起作用。