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.

[参考译文] TMS320F28069:在独立 CAN 引导模式下传输程序

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1636330/tms320f28069-transfer-program-in-stand-alone-can-boot-mode

器件型号: TMS320F28069

您好、

我正在尝试通过 CAN 引导模式更新处理器上的程序。 我通过 GetMode 选择了 CAN 引导模式、如 TRM 中所示。  

我很幸运地转移了程序:在我的工程构建后、8 位的程序数据流(can_Boot 所需)创建为一个“.txt"文件“文件。 重置芯片时、它从 CAN 引导模式开始、然后按指示通过 CAN 传输文件内容 (100kbps、MSGID=0x1、仅传输字节 0 和字节 1)。 之后、我期望处理器退出引导模式并开始运行程序、但没有任何反应。  

我尝试将字节 0 和 1 的顺序反转、将消息 DLC 更改为 2 或 8、以写入 8 个字节... 没有任何成功。 我会检查通信、而处理器确认 CAN 引导模式下的消息、因此通信必须正确。

当我发送一条随机消息(没有 0x08AA 密钥)时、它会退出 CAN 引导并按预期执行加载到闪存中的之前程序(通过仿真器进行编程)。

继续、我有两个问题:

  1. 为什么不加载已转移的程序? 我有什么问题吗? 我忘记了什么步骤吗?
  2. 每次我将处理器重置为 CAN 引导时、是否可以退出该 CAN 引导而无需发送随机消息? 我想跳转到闪存、但对于这种情况、更改 OTP 寄存器是必需的、我需要写入以实现 CAN 引导。

此致、Sergio

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

    您好:

    为什么不加载已传输的程序? 我有什么问题吗? 我忘记了什么步骤吗?

    所需数据流结构摘要:

    1. 密钥值:0x08AA(首先作为 0xAA 发送、然后 0x08–LSB 优先)
    2. 8 个保留字:16 字节的 0x00
    3. 入口点地址:32 位(MSW 在前、然后是 LSW、每个字 LSB 在前)
    4. 数据块:每个块都有大小、目标地址、然后是数据
    5. 终止:块大小为 0x0000

    每个 16 位字必须首先发送 LSB、然后发送 MSB。 对于密钥 0x08AA、必须先传输 0xAA、然后传输 0x08。 这适用于整个流。

    DLC 应为 2:引导加载程序恰好要求每个 CAN 帧 2 个字节。

    如果任何部件丢失或格式错误、引导加载程序将不会执行您的程序。  请确保传输了正确的终止、您的主题中没有提到这一点。

    每次我将处理器复位时、它都会进入 CAN 引导模式、我是否可以退出该 CAN 引导而无需发送随机消息? 我想跳转到闪存、但为了实现这一点、更改 OTP 寄存器是必需的、我需要写入 CAN 引导。

    该器件上的 CAN 引导加载程序没有超时;它无限期地等待数据。 发送无效密钥以触发退出到闪存是预期的退出机制。

    用于 CAN 引导的 OTP 寄存器 (OTP_KEY = 0x005A、OTP_BMODE = 0x0007) 无法同时配置跳转至闪存。 这是此代 C2000 器件的限制。 自定义引导加载程序(存储在闪存中)方法是您最灵活的方法。

    此致、
    马特

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

    评估 Matt、

    对于第一部分:

    我创建了一个程序来检查我正在发送的文件的各个部分、这是可以的:

     

    我以 DLC = 2 发送它、但它没有反应。 我是否必须先加载 can_flash_kernel 示例? 这就是 CAN 引导模式已经执行的操作。 我尝试使用调试器运行 can_flash_kernel、并传输文件、以查看发生了什么。 处理器似乎没有正确读取消息、但我不确定断点是否能正常使用。 但 CAN 系统正确、我已经使用 CAN 测试了一些应用、当引导后发送错误密钥时、它会加载之前的固件。

    第二部分:

    对于自定义引导加载程序、我可以尝试这种方法吗? : https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1622886/tms320f2800137-custom-bootloader?tisearch=e2e-sitesearch&keymatch=faq%3Atrue%20custom%20bootloader

    我不知道是否只能使用一个闪存存储体。 主要思路是有一个应用程序用于自定义引导加载程序(即 can_flash_kernel,进行极少修改)、另一个应用程序用于正常固件。

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

    您好:

    为了确保将应用程序通过 CAN 加载到闪存中的正确流程为:

    1. 器件复位并进入引导 ROM 中的 CAN 引导模式(根据配置)
    2. CAN 引导加载程序  首先将 CAN 闪存内核加载到 RAM 中(因为 ROM 无法直接对闪存进行编程)
    3. ROM 分支到 RAM 中的 CAN 闪存内核
    4. CAN 闪存内核接受应用程序并使用闪存 API 将其编程到闪存中
    5. 编程完成后、CAN 闪存内核分支到应用程序入口点

    SPRUJH3 的第 3.2 节对此进行了详细说明。 您还可以 按照部分中的步骤加载引导 ROM 符号以调试 CAN 引导加载程序  5.3.

    [报价 userid=“620493" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1636330/tms320f28069-transfer-program-in-stand-alone-can-boot-mode/6311432

    对于自定义引导加载程序、我可以尝试这种方法吗? : https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1622886/tms320f2800137-custom-bootloader?tisearch=e2e-sitesearch&keymatch=faq%3Atrue%20custom%20bootloader

    我不知道是否只能使用一个闪存存储体。 主要思路是有一个应用程序用于自定义引导加载程序(即 can_flash_kernel,进行极少修改)、另一个应用程序用于正常固件。

    [/报价]

    是的、即使在单个闪存存储体器件上、这种方法也是有效的。 我还将参考此有关自定义引导加载注意事项的常见问题解答:  【常见问题解答】C2000 引导加载设计注意事项 

    此致、
    马特

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

    我没有使用 CAN 引导模式通过 CAN 刷写应用程序。 我首先发送内核、然后发送我的应用、但没有。 似乎是在内核函数 CopyData() 中的字节接收时出现错误。 块大小读取不正确、可能是因为之前的接收问题、并导致加载失败。 我不知道该怎么办。

    感谢您的帮助。

    此致、Sergio。

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

    您好:

    要进入同一个页面:引导 ROM 中的 CAN 引导加载程序是否能够正确下载内核? 引导 ROM 是否能够成功分支到 CAN 闪存内核? 使用 ROM 引导加载程序下载后、是否需要一些时间来设置闪存内核?

    此致、
    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引导 ROM 中的 CAN 引导加载程序是否能够正确下载内核? 引导 ROM 是否能够成功跳转到 CAN 闪存内核?

    我对如何使用此加载符号函数没有信心、因为当我为引导 ROM 加载符号时、它不允许移动任何代码行。 但当我停止处理器时、调用堆栈显示了 Boot 中的函数、因此我认为它是正确的。 然后让它运行、加载 can_flash_kernel、加载 Symbols、并调试代码、从而正确加载 can_flash_kernel。 然后我发送我的应用(它比 can_flash_kernel 多 30 个 CAN 字)、我加载工程的符号、但当我停止处理器时、没有任何调用栈(只是一个十六进制地址)、也没有任何代码执行停止的行。

    我尝试了更多操作:当我使用调试器加载我的应用,并断开并重新连接目标,然后加载符号时,我在调用栈上看不到任何内容,或者也无法调试代码行。 在这种情况下、我是指我应该能够在加载符号后调试或查看调用栈。

    ]使用 ROM 引导加载程序下载后、是否留出一些时间来设置闪存内核?

    是的、我为 PCB 供电、几秒钟后发送 CAN_FLASH_kernel、大约 15 秒后发送我的应用程序。

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

    您好:

    您能否检查闪存内核中的闪存编程是否成功? 在 Flash_Erase () 和 Flash_Program () 调用后有一些错误检查,这只是直接从 CopyData() 返回。 相反、您可以放置一个 while (1) 循环来查看是否存在您可能缺失的闪存 API 错误?

    此致、

    马特

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

    尊敬的 Matt:

    是的,问题在 CopyData() 函数中,它进入您建议的循环。 状态为 12、因此下一个块收到了一个已无效地址。

    我还保存了收到的最后几句话,我得到了这个:

    左侧是接收到的最后一个字、右侧是发送的“myapp.txt"文件“文件

    似乎错误在于内核函数 CopyData () 中的字节接收。 块大小读取不正确、可能是因为之前的接收问题、并且会导致加载失败。

    我不明白为什么这种错误发生在行 504 上,这对应于块 3 可能:

    [报价 userid=“620493" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1636330/tms320f28069-transfer-program-in-stand-alone-can-boot-mode/6311432

     

    [/报价]

    我认为一个信息丢失了,下一个字是没有意义的错误顺序。 但在开始时,通信正常的一段时间,突然发生了这种情况。  

    我的另一个节点是 PCAN-USB、因此可以很好地确定没有错误。

    此致、Sergio。

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

    您好:

    感谢您确认、一定存在一些错位情况。  

    您是否在 0x08AA 密钥和入口点 PC 之间发送了 8 个保留字?

    另 请注意、即使您使用 0x08AA 密钥针对 8 位数据流进行配置、 对于 8 位和 16 位数据流格式、块的大小也定义为块中 16 位字的数量。 例如、要从一个 8 位数据流传输一个包含 20 个 8 位数据值的块、块大小将为 0x000A、以指示 10 个 16 位字。

    此致、

    马特

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

    ;  消息编号
    ;  |      时间偏移 (ms)
    ;  |      |       参数
    ;  |      |        |       ID(十六进制)
    ;  |      |        |       |      数据长度
    ;  |      |        |       |      |  数据字节(十六进制)……LSB 到 MSB
    ;  |      |        |       |      | |   
    ;--------------------------------------------------------+----+--------------------------------        ----
       1)   7503.8 Rx         第 08 章  
       2)   7503.9 Rx       0001 2 00 00  
       3)   7503.9 Rx       0001 2 00 00  
       4)   7503.9 Rx       0001 2 00 00  
       5)   7503.9 Rx       0001 2 00 00  
       6)   7503.9 Rx       0001 2 00 00  
       7)   7503.9 Rx       0001 2 00 00  
       8)   7503.9 Rx       0001 2 00 00  
          9) 7504.0 Rx       0001 2 00 00  
         10) 7504.0 Rx       0001 2 3E 00  
      11)   7504.0 Rx       0001 2 2C 6F  
      12)   7504.0 Rx       0001 2 02 00  
      13)   7504.0 Rx       0001 2 3F 00  
      14)   7504.0 Rx       0001 2 F6 7F  
      15)   7504.1 Rx       0001 2 7E 00  
      16)   7504.1 Rx        01 2 0D 73  
      17)   7504.1 Rx       0001 2 1F 00  

    看一下我发送的内容(从我的“app.txt"开始“开始)开始)。 我认为格式不存在问题、那么我首先要正确发送格式相同的 can_flash_kernel、由编译后句子 “${CG_TOOL_HEX}““${BuildArtifactFileName}“-boot -sci8 -a -o “${BuildArtifactFileBaseName}.txt“创建。

    我可以尝试以 1ms 的延迟发送每条消息、也许所有消息都能正确接收。

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

    您好:

    是的、我会尝试增加消息延迟、尤其是考虑到该器件的闪存编程/擦除时间:

    此致、

    马特