“线程”中讨论的其它部件: TM4C123
您好,
我目前正在学习如何根据 spma074a “串行引导加载程序实施”文档使用 UART 对 TM4C123x 微控制器进行编程。 我对 ACK 和 NAK 数据包结构的结构感到困惑。 我已经在论坛的其他地方和网上寻找了答案,但我已经很简短了。 UART 设置为波特115200,传输大小为60 (如果重要),使用“自动波特”。
我只使用 ROM 引导加载程序,而不使用自定义仅 Flash 引导加载程序。 我还在使用 EK-TM4C123GXL 评估套件,并将 USB 连接到调试 USB 迷你端口。
下面是我完成的步骤:
- 在 LM Flash Programmer 应用程序中,将接口设置为 ICDI,然后转至 Flash 实用程序单击擦除以清除整个闪存。
- 按下评估板上的重置按钮以获得良好的测量结果
- 使用 Code Composer 中以前编译的项目中的.bin 文件,通过 UART 刷新主板上的微控制器
- 使用逻辑分析器通过评估板上的 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空字节的原因是什么?
谢谢你,
布兰登