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.

[参考译文] EK-TM4C123GXL:ACK/NAK Type-1数据包在实施和文档方面存在差异

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1076364/ek-tm4c123gxl-ack-nak-type-1-packets-discrepancy-in-implementation-and-documentation

部件号:EK-TM4C123GXL
“线程”中讨论的其它部件: TM4C123

您好,

我目前正在学习如何根据 spma074a “串行引导加载程序实施”文档使用 UART 对 TM4C123x 微控制器进行编程。 我对 ACK 和 NAK 数据包结构的结构感到困惑。 我已经在论坛的其他地方和网上寻找了答案,但我已经很简短了。 UART 设置为波特115200,传输大小为60 (如果重要),使用“自动波特”。

我只使用 ROM 引导加载程序,而不使用自定义仅 Flash 引导加载程序。 我还在使用 EK-TM4C123GXL 评估套件,并将 USB 连接到调试 USB 迷你端口。

下面是我完成的步骤:

  1. 在 LM Flash Programmer 应用程序中,将接口设置为 ICDI,然后转至 Flash 实用程序单击擦除以清除整个闪存。
  2. 按下评估板上的重置按钮以获得良好的测量结果
  3. 使用 Code Composer 中以前编译的项目中的.bin 文件,通过 UART 刷新主板上的微控制器
  4. 使用逻辑分析器通过评估板上的 TX/RX 引脚捕获 UART 数据包

对于上述步骤3,我尝试使用:

  • 具有 UART 的 LM 闪存编程器(成功)
  • C:\ti\\<tivaWare>\tools\sflash 中的 sflash 示例程序(失败)

在上述文档中,它讲述了来自目标的响应数据包:

第一种类型的响应数据包(类型1)是 ACK 或 NAK 响应,在发送命令数据包时,该响应以单字节数据包的形式生成。 第二种类型的响应数据包(类型2)特定于 Get_status 命令数据包,其结构与命令数据包相同。

从上面的步骤4开始,通过 LM 闪存编程器,我可以看到正在发送的命令(顶部)和来自微控制器的响应(底部)。 显而易见,自动波特数据包0x55 0x55是微控制器0x00 0xCC 的数据包,然后是 ping 命令数据包(以蓝色方形显示)和微控制器的另一个响应。 这些响应包含 ACK 响应(0xCC),但它们包含额外的空字节0x00。 这一点在任何地方都没有记录在案,我无法找到为什么要这样做。 所有这些都来自 ROM 引导加载程序。

在尝试 sflash 示例程序之前,在执行步骤3之前的相同步骤后,该程序会失败,但会产生与 LM Flash Programmer 相同的输出:

但是,闪存程序似乎无法容纳多余的空字节,如红色错误所示。 代码显示它只需要 ACK 字节0xCC:

// packet_handler.h
#define command_ACK                0xcc

// packet_handler.c.
内部32_t

SendPacket (uint8_t *pui8Data,uint8_t ui8Size,bool Back)

   //...
   
   UINT8_t ui8Ack;
   
   //...
   
   //
   //等待设备的确认。
   //
   行动
   {
       IF(UARTReceiveData(&ui8Ack,1))
       {
           返回(-1);
       }
   }
   while (ui8Ack == 0);

   如果(ui8Ack != command_ack)
   {
       返回(-1);
   }
   返回(0);
}

但是,从我在 bootloader 代码中看到的内容来看,ACK 数据包被定义为0x00 0xCC (bL_packet.c):

//*************************************************
//
//为确认收到的数据包而发送的数据包。
//
//*************************************************
静态连接 uint8_t g_pui8ACK[2]={ 0, command_ACK };

为什么引导加载程序是这样写的,为什么文档会有所不同? 为什么 LM Flash 编程器能够适应这种差异,而 TI 提供的 sflash 示例程序却不能适应? 0x00空字节的原因是什么?

谢谢你,
布兰登

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

    您好,Brandon,

     正确答案是 ACK 是两个字节,如下面命令行中的 command_ACK ix 0xCC。 我认为应用程序备注文档中的 ACK 只有一个字节,这有点误导人。 请参阅之前发布的此帖子。 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039227/tm4c123gh6pge-how-to-setup-the-bootloader-and-comms-the-right-way/3849202?tisearch=e2e-sitesearch&keymatch=Type-1#3849202

    静态连接 uint8_t g_pui8ACK[2]={ 0, command_ACK };

    就闪烁而言,我无法重复您的问题。 这对我很有作用。 请参阅下面我使用的命令和开关,使用 ROM 引导加载器下载固件。  

    实际上,我又尝试了两次下载,具体说明了波特率,两者都起作用。  

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

    我用您使用的命令进行了闪存,但它仍然无法正常工作。

    您能告诉我您使用的是哪种版本的 TiaWare 吗? 我有2.2.0.295。

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

    布兰登

     哪种版本的 TivaWare 无关紧要,因为它使用的是 ROM 引导加载程序,而不是闪存引导加载程序。 我之前在 TM4C129上试过。 现在我就试一下 TM4C123,它对我毫无问题地起作用。  

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

    这次我得到了 sflash 的帮助。 但是,我不知道我做了什么改变来使它这样做。 感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="93620" url="~/support/icls/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1076364/EK-tm4c123gxl-ack-nak-type-1-packets -实施中的差异和文档/3983671[此处只能描述该应用程序 的一个字节]。

    TI 是否可以更新文档以澄清这一点?

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

    您好,Brandon,

     我已提交变更请求。 但是,由于资源的原因,我无法给出进行更改的时间范围。