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.

[参考译文] CC3120:嵌入式编程挂起

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/942730/cc3120-embedded-programming-hangs

器件型号:CC3120
主题中讨论的其他器件: CC3220MOD

您好!

最近、我实现了文档 SWPA230A 中所述的嵌入式编程功能。 主机 MCU 可以按照步骤1至10中的说明成功地向 CC3120发送命令。 收到的回复(Ack 和 Info)正确。 但在步骤11 (FS 编程)中失败。 根本没有 Ack。 我已通过逻辑分析仪检查 UART 数据。 它们与图16相匹配。 唯一的区别是块数据的内容。

然后、我尝试使用不同的块大小。 我尝试了512字节、1024字节、2048字节和最初的4096字节。

对于 chunch_szie = 512字节、一旦累积大小大于2048字节、它就会开始失败。 以下是日志:

CC3x20::embeddedProgramming()程序映像







块=0大小=512 CC3x20::fsProgram()累积的512字节 CC3x20:::embeddedProgramming()程序映像块=1大小=512 CC3x20::fsProgram()累积的1024字节 CC3x20:::embeddedProgramming()程序映像块=2大小=512 CC3x20: CC3x20:512字节编程(=512字节 CC3x20): CC3x20):累积的闪存编程(=512字节 CC3x20): CC3x20): CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC3x3:CC3x20:CC3x20:CC3x20:CC3x20:CC3x20:CC
RC = 0 

对于 chunch_szie = 1024字节、一旦累积大小大于2048字节、它就会开始失败。 以下是日志:

CC3x20:::embeddedProgramming()程序映像



块=0大小=1024 CC3x20::fsProgram()累积的1024字节 CC3x20::embeddedProgramming()程序映像块=1大小=1024 CC3x20::fsProgram()累积的2048字节 CC3x20:::::embeddedProgramming()程序映像块=2大小=1024
CC3x20: RC = 0 

对于 chunch_szie = 2048字节、一旦累积大小大于2048字节、它也会开始失败。 以下是日志:

CC3x20:::embeddedProgramming()程序映像 chulk=0 size=2048
CC3x20::fsProgram()累积的2048字节
CC3x20::embeddedProgramming()程序映像 chulk=1 size=2048
CC3x20::txCommand()无法获取 ACK。 RC = 0 

对于 chunch_size = 4096字节、它从一开始就会失败。

CC3x20::embeddedProgramming()程序映像块=0大小=4096
CC3x20::txCommand()无法获取 ACK。 RC = 0 

然后,我尝试在 txCommand()失败后发送 GetStatus 命令。 GetStatus 也没有 Ack。 显然、CC3120在步骤 FS_programming 中接收到2048个块数据字节后挂起。

在步骤6和步骤9中,使用相同的 txCommand()函数将“最新”引导加载程序成功修补到 SRAM 和 SFLASH。 因此、函数本身应该没有问题。

在这种情况下、很难进行调试。 有人有这种经验吗? 任何想法都很有帮助。

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

    您好、Robert、

    让我来看看这个、然后返回给您。

    BR、

    Vince  

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

    Robert、

    块大小需要始终为4096。 其次、您的钥匙尺寸是16?

    BR、

    Vince  

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

    Vince、

    我知道块大小需要为4096。 但它总是失败、具有4096个字节。 因此、我尝试不同的块大小来查看是否有差异。

    我在该测试中不使用密钥、因此密钥大小= 0。

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

    您好、Robert、

    只是一个评论。 我将嵌入式编程用于 CC3220MOD 器件的生产编程。 我对嵌入式编程工作方式的印象不是最好的。 我建议在嵌入式编程包中准确复制 python 代码的函数。 嵌入式编程对于时序相关问题非常敏感。

    可以通过与原始 python 代码进行比较来检查潜在的时序相关问题。 在这种情况下、COM 端口监听器(如旧的 Good COM Spy)可能很有用。

    1月

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

    您好、Jan、

    是的、我根据原始 python 代码设计这些函数。 但我的主机 MCU 无法运行 python、因此我使用 C/C++来设计它们。

    串行端口数据流由示波器检查。 此示波器具有逻辑分析仪功能、能够分析串行协议并直接在屏幕上显示 RX/TX 数据值。 这就是我如何将数据与《嵌入式编程用户指南》的图16进行比较的方法。

    当我说"no Ack"时、这意味着我看不到串行协议分析器上显示的任何 Ack 字节(0x00 0xCC)。 txCommand()无法获得 Ack,也无法获得 Ack。 当块字节减少到2048字节时、我可以看到 Ack 字节一次。

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

    您好、Robert、

    我无法说出您为什么没有收到 ACK 应答。 我们还将 python 代码写入了不同的语言(实际上写入了对象 Pascal)。 我的同事完成了这项移植、但他遇到了很多麻烦、但他做到了这一点。 关于最后一个数据块的 ACK 非常烦人、但似乎您还不是很远...

    通常、在逻辑分析仪上分析 UART 通信、尤其是在硬件示波器上分析 UART 通信并不是一件非常友好的事情。 因此、我更喜欢使用 PC (例如、通过二极管连接 RX、TX 线路并通过一个 UART 进行捕获)。 通过将数据流与 python 脚本进行比较、我们能够完成移植工作。

    您是否能够使用原始 Python 代码对.ucf 文件进行编程? 如果是、我建议使用比较方法。

    1月

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

    您好、Jan、

    我想知道如何避免出现您所说的"对最后一个数据块的 ACK 非常烦人"的时序问题。 对于常规慢速 MCU、UART RX 寄存器没有硬件 FIFO。 因此、如果读取操作不够快、传入的数据将覆盖以前的数据。 例如、如果应用程序被占用过多 CPU 时间的 ISR 阻止、则 RX 寄存器上先前未读的字节将被覆盖。 诀窍是使 UART ISR 尽可能简单。 并在执行嵌入式编程功能时防止其他任务/ISR 运行。

    我习惯使用示波器及其串行协议分析器。 使用 示波器、我还可以检查信号电平是否正确或有噪声。 但我也可以通过 PC 终端程序监听 TX/RX 数据。 但是、我认为此时没有差别。

    您的建议是"使用原始 Python 对.ucf 文件进行编程"。 我会尝试。 只是需要跳过那么多线缆...

    大家好、TI 工程师、

    有时、TI 工程师会要求用户记录引脚62处的 NWP 输出。 我已记录引脚62的数据。 您能否查看日志文件并给我一些建议?

    e2e.ti.com/.../CC3120-NWP.log

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

    您好、Robert、

    通过此"关于最后一个数据块的 ACK 非常烦人"、我的意思是、在发送.ucf 文件的最后一个块后、您不会立即获得 ACK。 您将根据编程映像的大小获得 ACK 延迟(在映像解压缩后返回 ACK、并创建文件系统)。

    我不确定 NWP 日志是否能够在嵌入式编程期间提供有用的信息。 我猜不是、但请等待 TI 方面的回答。

    1月

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

    您好、Robert、

    已查看 NWP 日志、我没有发现任何问题。 NWP 上不会发生错误。 请尝试默认 python 脚本、并告知我们您是否仍有问题。

    BR、

    Vince  

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

    您好、Jan、

    现在、Python 代码可以直接对目标 CC3120进行编程。 Phython 代码可以正常工作。

    但是、我可以感觉到在发送第一个块后存在~3秒的延迟。 并且在发送最后一个块后存在~9秒的延迟。 对于每个块,我的 txCommand()只等待长达1秒,而对于最后一个块,则等待10s (自图 15显示最后一个延迟为8.766s)。 这就是我的程序无法正常工作的原因。 等待3秒后,第一个块。 它现在可以工作了。

    我想引导加载程序会在接收到第一个块时擦除所有串行闪存。 时间应与闪存的大小有关。

    谢谢 Jan 和 Vince。 你真的帮了我很多。