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.

[参考译文] TMS470MF06607:DCAN2上的 CAN 传输始终会导致错误

Guru**** 2451240 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/623588/tms470mf06607-can-transmission-on-dcan2-always-results-in-error

器件型号:TMS470MF06607
主题中讨论的其他器件:HALCOGEN

您好!

我正在为客户提供基于 TMS470 Micro 的项目。 我的第一项任务是让一个简单的调度程序使用 RTI (工作)、在 UART 上发送一个字节并在同一 UART 上回路(工作)、最后在 DCAN2上发送一条固定消息、该消息用作带有外部收发器的高速 CAN。 上述所有驱动程序都是使用 halcogen 生成的。

问题:每次我单击 CAN_Transmit (在我的5ms 任务中)时、我都会收到错误通知、请参阅下面的代码片段

void Task_5ms ()

uint8 retval = 0;

RetVal = canTransmit (canREG2、canMESSAGE_box3、FT_TX_PTR);
if (评估)
    while (hs_TX_DONE = 0){};  //等待 CAN 传输完成。 该标志在 canMessageNotification 函数中设置
sciSend (sciREG1、8、DATA_UART);

 我看到 节点->IF2DAT 包含我将中断点放置在 canTransmit 内时要发送的数据。 我已将 message_box3配置为在 halcogen 中传输、我已在初始化中启用错误和消息通知。

此外、我在 ISR 中放置了一个断点、我看到它在调用 canTransmit 后到达 ISR、但始终存在错误! 因此、控制始终转到错误通知。

void can1高 LEVELInterrupt (void)

uint32 value = canREG1->INT;

如果(值= 0x8000U)

canErrorNotification (canREG1,canREG1->ES & 0x1E0U);--------------- >始终转到错误通知。
返回;

我在总线上连接了一个正在运行的 CAN 监控工具、该工具将发送确认信号。

我检查了勘误表寄存器、它大部分时间显示为0xE5。 一些人会在我启动程序后立即试用断点、我看到寄存器的值为0x05。

我从数据表中了解到 CAN 上存在位错误、对吗? 我甚至尝试在 CAN_H 和 CAN_L 线路上输入120欧姆的端接电阻、但似乎什么都不起作用。 所有 AM 卡滞是 CAN 错误通知。 有人能帮我向前迈进吗? 如何继续调试? 请帮助。

此致、

Shankar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DCAN ES 寄存器的 LEC 位域为5、表示位0错误。 我建议您将 DCAN RX 与 DCAN TX 引脚与示波器进行比较、并验证收发器是否正常工作。 当 TX 为低电平时、RX 也应变为低电平、由收发器驱动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Bob 很快就会更新相关内容

    更新了

    Bob、您好!

    首先、当我运行 canTransmit 时、我甚至看不到 CANTx 更改其状态。 始终保持在3.3V。 因此、我不知道观看 Rx 是否有任何意义。 Tx 没有改变状态的原因吗? 这可以对驱动程序执行什么操作吗?

    此致、

    Shankar  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试此操作:在 PC 上连接具有记录器功能的 USB CAN 器件、并将其连接到您的器件网络。 如果出现常见的 CAN 错误、该工具可能会通知您。 还应确认电压和硬件连接是否正确应用。
    此外、当我使用示例工程实现紧密匹配但不完全匹配硬件时、我会产生意外结果。 当我开始一个完全与目标匹配的全新 HalCoGen 项目时、几个奇怪的问题消失了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Parker、

    感谢您的输入。 我使用工具尝试了此操作、当我尝试从工具传输消息并希望节点接收消息时、我始终会看到一个 ACK 错误。 当我更深入地探讨这个问题时、我认为我应该尝试回路模式(测试模式)、并查看是否至少可以在同一信道中发送和接收消息。 遗憾的是、即使这看起来不起作用。 这是我所做的。

    #define canMESSAGE_BOX1 2U
    #define canMESSAGE_BOX2 2U

    CANREG1->CTL |= 0x80;//启用测试模式
    canREG1->TEST |= 0x18;//启用内部回路和静音模式

    canTransmit (canREG1、canMESSAGE_BOX1、hs_TX_PTR);//在 CAN1上发送已知消息

    while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX2));//等待消息在 CAN1上接收回
    canGetData (canREG1、canMESSAGE_BOX2、hs_rx_ptr);

    while (1);

    我在 while (1)处放置了一个断点、我希望 hs_Rx 指针缓冲区保存 Tx 数据。 令我惊讶的是、它没有。 我在这里做了些什么问题吗? 任何帮助都将不胜感激(更值得称赞!)

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

    我建议您首先尝试使用 HalCoGen 示例。
    我非常确定消息框必须是 TX 或 Rx、并且您使用相同的 ID (2U)定义了 canMESSAGE_BOX1和 CAN MESSAGE_BOX2。  这似乎不是您想要的操作。

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

    大家好、我尝试了 halcogen 示例、但它不起作用。 我创建了一个新的工作区、重新生成了 halcogen、并尝试了该示例。

    回到消息框配置、即使我对此有疑问、也是如此。 但是、如果回路看起来如技术参考手册第346 10.2.3.4页所示、那么我们应该考虑什么? Tx 消息应该与 Rx 消息具有相同的 ID、如果我为这两个消息使用不同的标识符、则消息不会通过 Rx 筛选器、因此我们如何理解内部回路? 有什么想法吗?

    此致、

    Shankar

    更新:

    我意识到了我所犯的错误。 因此、将代码改回其生成方式。 我放弃了循环的想法、因为我不知道它是怎么工作的。 我继续观察 CAN_H 和 CAN_L 上的信号 此外、我还构建了一个小型系统、其中包含两个其他节点、它们可以使用 Arduino 板相互传输和接收。 我将 TMS HW 作为它们之间的一个挂起节点。 我仍然不幸运。 我一直在努力调试,但现在我非常渴望成功,因为我的耐心正在慢慢地流失。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、最后我放弃了我们的硬件、因为我获得了 Hercules 电路板、看起来我的硬件上有收发器问题。 现在、我有一个不同的问题、我打开了一个新帖子。 感谢所有支持