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.

[参考译文] MSPM0G3507:CAN 协议实现

Guru**** 2430620 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1530540/mspm0g3507-can-protocol-implementation

器件型号:MSPM0G3507


工具/软件:

您好、

  我一直在尝试为我们的工程实现 CAN 协议。 TX 配置正常。 但对于接收、我们当前使用的是 RXFIFO、我尝试配置专用的 RXBUFFER、但无法通过 RXBUFFER 接收任何中断和接收消息。 请给出使用 RXBUFFER 的一些想法。

谢谢。

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

    您好、

    您能否提供有关您希望实施的行为的更多详细信息?

    马修

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

    您好、

         正如我向大家介绍的、我们在工程中使用的是 CAN 协议。 问题是、在使用 RXFIFO 时、我们无法使用带有专用缓冲器的 RX 缓冲器。 但我们更喜欢使用 RXBUFFER 元件来减少 CAN 总线的流量。 因为在使用 RXFIFO 时、我们无法尽快处理。 则无法使用 RXFIFO 进行调试。 因此、我建议您给我一个使用 RX 缓冲器实现 CAN 协议的想法。

    谢谢、

    Praveen

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

    尊敬的 Praveen:

    感谢您提供的信息。 我查看了提供的代码、想详细了解您是如何实现系统的。

    我们首先尝试缩小这是否可以是软件还是硬件

    听起来您已经创建了一个测试用例、其中发送器发送了一个恒定值、但接收器偶尔收到了错误的值。

    >>>您能否提供显示端接电阻(以及任何其他连接)的原理图?

    >>您是否在 Launchpad /EVM 上测试了代码、以便使用经验证的硬件来测试软件?

    马修

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

    您好、Matthew、

    >>我附上了 CAN 侧的原理图。 请看一下这一点。  

    >>我使用了没有板载 CAN 收发器的 MSPM0G3507 LaunchPad。 所以、我们使用了我们设计的 CAN 收发器板。 之后、它进行了沟通、但 我们 在此方面观察到了同样的问题。

    下面给出了连接。

    如有其他需要、请告诉我。

    谢谢、

    Praveen

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

    Praveen,

    您是否尝试使用示例代码发送相同类型的数据?

    您能否确认我的理解是否正确? -->您的测试用例正在发送一个常量值、但您偶尔收到错误的值?  

    马修

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

    您好、Matthew、

    是的、我已经尝试使用示例代码将相同的常量数据从 PCAN Explorer 发送到 MCU。 我们观察到了同样的问题。  

    是的、对于测试用例、了解是正确的。

    在上述迹线中、常量值传输了 1 小时、但我们观察到了下降(不同的值)。

    -- Praveen

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

    您好、Matthew、

    您能告诉我 RX FIFO 元素和 RX 缓冲区的基地址吗? 因为我们将尝试使用寄存器级代码。  

    谢谢、

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

    您好、

    您器件的 CAN 基地址可以在下图所示的数据表中找到。 有关所需偏移的详细信息、请参阅 TRM。

    马修

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

    您好、

    如何在不使用 CCS 提供的 API 的情况下读取 RX 缓冲区/RX FIFO 元素。 上述元素的起始地址是什么?

    -普拉文

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

    尊敬的 Praveen:

    通过获取 MCAN 的基地址并将其添加到 syscfg 中的偏移量、可以找到 CAN 消息 RAM 的起始地址。 不过、在 syscfg (172) 中找到的地址位于 DEC 中、因此将其转换为十六进制 (0xAC)

    0x40508000 + 0xAC = 0x405080AC

    马修

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

    您好、Matthew、

    你好!

    我们已解决了作为与 CAN 通信相关的查询而提出的问题。

    以前的方法:

    我们对每个 ID 使用 TX 专用缓冲区。 因为我们认为、如果我们为每个 ID 使用专用缓冲区、将会更加高效和可靠。

    但是它意外地造成了一个问题。

    CAN 传输侧使用了以下功能。  

    DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&TxMsg);

    在这里、您可以看到完全取决于缓冲器类型和缓冲器编号的参数。  在这里、您可以通过不同的缓冲区传输数据

    生成单个缓冲区。  

    DL_MCAN_TXBufAddReq (MCAN0_INST、0);

    这是用于通过 CAN 传输(请求传输)数据的函数。 在这里、我们还提到缓冲区编号。

    因此、它不会导致任何问题。   

    无论怎么说,一切都是完美的定义和使用,我们都无法解决这个问题。  

    为便于您理解、这里我提供了一个小型示例代码、说明我们如何实现 CAN 状态机。  

    交换机(传输)

    充电盒充电器_信息:
             充电器信息 ();
             DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&Tx Msg_Charger_Info);
             DL_MCAN_TXBufAddReq (MCAN0_INST、0);
             TRANSMIT = CHARGE_PROFILE;
             休息;
    充电盒 Charge_profile:
             Charge_Profile ();
             DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、1、&Tx Msg_Charge_Profile);
             DL_MCAN_TXBufAddReq (MCAN0_INST、1);
             传输= CHARGER_INFO:
             休息;
    }

    在状态机显示上方、这两种情况都使用了不同的缓冲区编号。  

    当前方法:

    现在、我们将对所有 ID 使用单个 TX 缓冲区。 它按预期运行。

    交换机(传输)

    充电盒充电器_信息:
             充电器信息 ();
             DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&Tx Msg_Charger_Info);
             DL_MCAN_TXBufAddReq (MCAN0_INST、0);
             TRANSMIT = CHARGE_PROFILE;
             休息;
    充电盒 Charge_profile:
             Charge_Profile ();
             DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、 0 &Tx Msg_Charge_Profile);
             DL_MCAN_TXBufAddReq (MCAN0_INST、0);
             传输= CHARGER_INFO:
             休息;
    }

    在状态机显示的上方、两种情况都使用相同的缓冲区编号。  

    第一种方法有什么问题、如何使用最后一种方法解决?

    您能告诉我们实际的问题是什么吗?

     

    谢谢、

    Praveen

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

    1) 它看起来像你正在使用缓冲区 0 你的所有消息. 这种行为是否可以接受?

       a) 我的理解是、您希望 CHARGE_PROFILE 位于缓冲器 0 中、CHARGER_INFO 位于缓冲器 1 中。

    2) 当您测试出现间歇性错误的初始解决方案时-->是否有任何其他子例程可能导致其挂起?

    我会尝试创建一个基本的设置 系统 包括 CAN 传输、因此您可以将问题隔离到缓冲区。 听起来可能还有另一个变量在播放。

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

    您好、Matthew、

    您好、Matthew、

    1) 它看起来像你正在使用缓冲区 0 你的所有消息. 这种行为是否可以接受?

       a) 我的理解是、您希望 CHARGE_PROFILE 位于缓冲器 0 中、CHARGER_INFO 位于缓冲器 1 中。

    回复:

    是的、功能行为是可以接受的。  

    是的、我们希望使用专用缓冲器。  

     

    2) 当您测试出现间歇性错误的初始解决方案时-->是否有任何其他子例程可能导致其挂起?

    回复:

    没有、没有子例程。  

     

    我会尝试创建一个基本的设置 系统 包括 CAN 传输、因此您可以将问题隔离到缓冲区。 听起来可能还有另一个变量在播放。

    回复:

    我们已经尝试过。 项目代码仅具有 CAN 发送和接收功能。 但我们也面临同样的问题。  

    当前方法与前一种方法的区别在于、我们用于传输的缓冲区数量没有、其余部分完全相同。  

    查询:

    我对当前方法的关注是“如果传输的信息数量增加到说 50 个消息“。

    我怀疑对所有消息使用相同的缓冲区会导致问题。 您的意见如何?

    谢谢、

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

    这种行为是否会在不同的器件上发生?

    典型的 CAN 帧包括用于防止垃圾值的 CRC、因此我不确定这是硬件问题。

    请提供 完整 CCS 工程文件 以及最新设置的详细说明? 我可以尝试复制您的设置、并运行一些我自己的测试。 (您可以通过电子邮件将其提供给您的 TI 销售代表)

    马修