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.

[参考译文] TMS570LS3137:适用于 PGE 部件的 CAN 或以太网启动器示例

Guru**** 2589300 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1068632/tms570ls3137-can-or-ethernet-bootloader-examples-adapted-to-a-pge-part

部件号:TMS570LS3137
“线程:测试”中讨论的其它部件

我正在尝试将以太网或 CAN 引导加载器示例调整为使用 TMS570LS3137DPGE 芯片的自定义板,但运气不好。  我在 CSS 中构建项目并刷新我的主板。  在这两个项目中,我一直关注调试器,直到它等待输入,但以太网和都无法响应外部 ping。   

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

    如果您在 CAN bootloader 的以下部分添加断点,是否可以从外部主机获取任何命令输入?

    While (1)(同时)

    //Lite_TOPRIGHT_LED;

    ulBytes = 0;
    ulCmd = PacketRead (节点,g_pucCommandBuffer,&ulBytes);

    ucStatus = CAN_CMD_Success;// 0x00
    开关(ulCmd)

    //
    //这是一个 ping 数据包。
    //此命令用于接收确认命令
    //从引导加载程序发出,表示已建立通信。
    //此命令没有数据。 如果设备存在
    //将使用 CAN_COMMAND_BPING 回复 CAN 更新应用程序。
    // CAN_command_ping = 0x1F02,0000
    // ACK = 0x1F02,0100
    Case CAN_command_ping:

      PacketWrite (节点,CAN_COMMAND_ACK,&ucStatus,1);
      休息;
    }

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

    使用断点后,我能够确认未收到任何消息。  我检查了我使用的 NI USB-8502的电缆是否正确,然后尝试将 Little _endian 定义从1更改为0。  然后我可以在总线上看到 CAN 消息。  外部代码上的 ping 命令不再超时,但我现在收到如下错误信息:

    CAN0已成功初始化...


    正在发送 command_pping 命令...

    NI-CAN:(十六进制0xBFF62105)您提供的大小或长度无效(太小或太大),操作无法继续。 解决方案:阅读功能说明并验证您是否提供了有效的大小(或长度)。

    Source = ncReadMult

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

    似乎没有来自主机的 CAN 消息传输。 请在附件中找到有关 PC 主机大小的 VC++项目示例。

    e2e.ti.com/.../7633.TMS570LS_5F00_canBootloader_5F00_Test.zip

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

    我也遇到同样的错误

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

    我可以确认 micro 收到 ping 命令,正确读取并尝试发回 ACK

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

    该错误似乎是此呼叫的结果...

    状态= ncRead (RxHandle,sizeof (ReceiveBuf),(void *) ReceiveBuf);
    IF (状态< 0)

    PrintStat (状态,“ncReadMult”);
    }

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

    您好,

    宿主侧的波特率为500k。 TMS570 DCAN0应以相同的波特率运行。

     调用 PacketWrite (节点,CAN_COMMAN_ACK,&ucStatus,1)时,是否可以在 CAN 总线上看到传输的数据?

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

    我没有更改 CAN.c 或 can.h 文件中的波特率,因此应该将其设置为500k。  我在交换机前面插入了 PacketWrite 命令,并监控了总线。  结果就是这样。

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

    我现在可以看到1446 (Dec.)的 ID 是正确的0x05A6 ACK。  Micro 收到0x05A0 Ping 并作出响应的事实是否证实 USB-8502正在以正确的波特率发送和接收?

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

    我做了测试,没有问题。

    1.应首先执行 bootloader,等待主机发出 ping 命令

    2.然后,主机端的项目开始执行。

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

    这是否是我的 Visual Studio 如何压缩代码的问题? 我的项目在主方收到 CAN 消息,但在 ncRead 呼叫上发生了错误。  

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

    我一直在使用 Visual Studio 2019构建和编译,这要求我升级项目并编译工具。

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

    我已经找到并安装了 Visual Studio 2010并运行了您的外部代码。  代码成功地将 ping 发送到 TMS570,TMS570标识 ping 并将 ACK 发回。  然后,测试代码在 ncRead 调用期间崩溃,就像在 VS2019中一样

    CAN0已成功初始化...


    正在发送 command_pping 命令...

    NI-CAN:(十六进制0xBFF62105)您提供的大小或长度无效(太小或太大),操作无法继续。 解决方案:阅读功能说明并验证您是否提供了有效的大小(或长度)。

    Source = ncReadMult

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

    使用两个 MCU 代码中的断点,我可以提供以下附加反馈。  当 MCU 代码运行时,我看到 ping 进入,我看到它被 MCU 解析,我看到它在 CAN 总线上响应  以下是在监视该总线时发回的消息。

    PC 端代码的当前状态更改为3

    然而,RecieveBuff 没有改变。

    并且抛出了大小错误。

    断开 CAN 电缆连接后,当前状态保持为0,Ping 超时。

    为什么我在 CAN 总线监视器上看到500k 的消息,但 PC 端代码似乎无法读取该消息?

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

    我不知道导致该问题的原因。 您可以尝试更长的等待时间吗?

    示例代码使用3秒:

    #define nc_duration _3sec 3000  

    该示例使用 NI USB-CAN 8473的驱动程序,请确保您下载的库适用于您的 CAN 适配器。

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

    我成功地与 PC 端代码建立了双向通信。  NcRead 呼叫是问题所在。 我将所有 ACK 读取请求更改为使用以下 NcReadMult。

    状态= ncReadMult (RxHandle,sizeof (ReceiveBuf),(vo*)ReceiveBuf,&ActualDataSize);

    通过建立通信,我可以下载我们的二进制文件(编译后以0x00010020地址开始 )并将其传输到我们的 MCU。  但是,更新检查失败,UpdateStatusAddr 显示以下值。

    我们的映像是否需要设置0x5A5A5A5A 值,或者引导加载程序是否需要设置?

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

    成功编程二进制映像后,引导加载程序将该标志写入0x10000。

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

    添加了一堆调试语句,我现在就可以看到出现了什么问题。  尽管组合正在正确传输,但数据似乎没有传输。  外部代码正在接收来自 MCU 的 ACK,并将其传输和信号成功。  MCU 未能通过地址和大小,也未接受或写入任何数据。  这是发送地址的外部代码。

    地址(DEC 格式)和大小正确,分类也正确。  这是 MCU 接收到的内容

     G_pucCommandBuffer[]元素全部为32个,导致转换错误以及地址和大小不正确。  这会导致 g_ulTransferSize 设置为0,而不会写入任何内容。

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

    在对大小进行故障排除时,我已确定读取 CAN 数据 aa 和 B 寄存器的例程工作不正常。

    pusData =(uint8_t*) pucData;

    /**-将 RX 数据复制到目标缓冲区*/
    对于(i = 0U;i < ulBytes;I++)

    #IF ((__Little _endian__=1)||(__Little _ENDIAN__=1))
    *pusData++= node->IF1DATx[i];
    #else
    *pusData++= node->IF1DATx[g_ulCanByteOrder [i];


    #endif
    }
    GADataBuffer[0]=节点->IF1DATx[3U];
    GADataBuffer[1]=节点->IF1DATx[2U];
    GADataBuffer[2]=节点->IF1DATx[1U];
    GADataBuffer[3]=节点->IF1DATx[0U];
    GADataBuffer[4]=节点->IF1DATx[7U];
    GADataBuffer[5]=节点->IF1DATx[6U];
    GADataBuffer[6]=节点->IF1DATx[5U];
    GADataBuffer[7]=节点->IF1DATx[4U];

    pusData 从未在寄存器中获取实际数据,因此 g_ulTransferSize 和 g_ulTransferAddress 都填充了所有'32。  我 能够使用自己的缓冲区正确解析数据,并将其输入地址和大小。  

    随着 ulWholeFlashSize 在0时推出,该代码与尺寸检查错误。  我取消了地址大小检查,现在我正在关注访问冲突。

    BL_Flash 函数似乎不能正确分析我的芯片的闪存定义。  您能想到会导致这种情况的任何原因吗?

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

    很抱歉,我不知道导致此问题的原因。