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.

[参考译文] CC3220S:Uniflash 在 API 上被阻止/文件系统在编程不完整后被锁定

Guru**** 2587345 points
Other Parts Discussed in Thread: UNIFLASH, CC3220S, CC3120

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/967716/cc3220s-uniflash-stuck-on-api-blocked-file-system-locked-after-incomplete-programming

器件型号:CC3220S
主题中讨论的其他部件:UNIFLASHCC3120

您好!

我正在研究 CC3220MODAS 的系统内编程方法、在 Uniflash 尝试完成编程后、我无法再完成连接。

每次我单击"Connect"时、都会启动握手、然后返回操作失败:(80、"API blocked/File System Locked")、如此屏幕所示。

我之前的编程尝试失败时被卡在21%、当时我断电了:

我已经比较了前后连接序列的串行监听。

当 Connect 工作时、主机发送00 07 33 31 00 00 00 02、这是获取串行闪存的存储信息、CC3220S 以 00 CC 00 0A 14 10 00 04 00 C2 28 16 (Ack +存储信息)进行响应。

在连接失败的时刻、主机发送 00 07 33 31 00 00 00 02、这是获取串行闪存的存储信息、CC3220S 以00 33 (NACK)进行响应。

NACK 后、主机发送00 03 23 23 (获取状态)、CC3220S 以00 CC 00 03 50 50 (Ack +最后状态)进行响应。  我没有找到状态代码的文档、但我假设此响应中的0x50与屏幕上的 Uniflash 消息中的80相同。


这里的问题是、我的僵尸首次编程操作是否永久锁定了我、或者是否有某种方法可以从这种情况中恢复?  我一开始 就没有 CC3220MODAS 中的程序、因此不确定工厂复位选项是否可用。  我尝试过 SOP0=1和 SOP1=1的 POR、这似乎什么都没有。

开箱即用、我们的下一个版本电路板从 CC3220MODAS 中引出了 SPI 闪存引脚、我想知道我是否可以通过程序引脚进行擦除以重新开始。

还想知道原始存储擦除–SFLASH 是用于擦除 CC3220MODAS 的外部 SPI 闪存的选项、还是该命令仅限于 CC3220MODASF 的内部 XIP 闪存。

请告诉我、如果编程不完整对 CC3220S 的状态意味着什么、如果有办法、我可以将其解锁以重试 Uniflash 编程。

谢谢!

Chris Norris

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

    尊敬的 Chris:

    我已将其分配给了一位专家。 请给他们时间回应您。

    Jesu

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

    感谢 Jesu、期待收到专家的回复。

    同时、我将尝试 使用 CC3x20_Embedded_Programming_2_0_0软件包、看看我是否可以在 Uniflash 上继续执行擦除和重新编程操作、因为我一直停留在 Uniflash 上。

    此致、
    Chris Norris

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

    这是在您的所有板上还是在特定板上发生的?

    我从未见过编程卡在中间(没有错误)。 您在关闭电源之前等待了多长时间(编程期间、我们听说过关闭电源时出现的问题)。

    您使用的是 launchpad 还是定制板?

    如果是定制板、您是否已经完成了设计指南和审查流程(https://www.ti.com/tool/SIMPLELINK-WIFI-DESIGN-REVIEWS)  

    BR、

    Kobi

     

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

    您好、Kobi、

    我们从 LaunchPad 开始、但现在我们在具有多个处理器的定制板上。  最后、我们希望主处理器(Tiva)在没有 Uniflash 的情况下将映像发送到无线模块(CC3220MODAS)、因此我从 swpa230a 学习引导加载程序命令。

    在早期开发过程中、我让主处理器接收并重新传输引导加载程序命令、并在 PC 和 CC3220S 之间进行回复。  我们的主处理器可作为串行电缆的替代产品。  我正在串行监听器中监视引导加载程序命令和应答。  在从上面挂起期间、我的缓冲区大小太小(< 4096)、因此我意外地向 CC3220S 发送了一个不完整的数据包。  我在切断电源之前等待了大约5分钟、但在串行监听器中看不到 Uniflash 发出的任何其他命令/回复。

    我已经在串行监听器中观看了完整的编程、因此我相信、通过复制与 Uniflash 相同的命令、我最终将获得成功的编程。

    我的问题是、是否可以从不完整的编程中恢复。  如果这是永久锁定、我需要更加小心、因为在开发编程方法时、我不想牺牲太多的板。

    昨天、我运行了 ImageProgramming.py、尝试在锁定状态下恢复 CC3220S。  下面是运行的详细输出。  它能够将 BTL_ram.ptc 补丁传输到 SRAM、但在查询 SFLASH 状态时具有相同的 NACK。

    映像编程 v2.0.0
    --------------------
    此实用程序会将二进制映像编程到连接到 CC3120/CC3220器件的串行闪存中
    仅支持生产器件(即不支持预生产器件)
    需要使用 Uniflash 实用程序提前准备二进制映像

    步骤1 -->连接到目标器件
    端口已打开
    等待并清除 UART Rx 缓冲器
    设置中断信号
    --请重新启动设备--
    等待 ACK
    接收 ACK
    连接成功
    获取存储列表
    等待 ACK
    接收 ACK
    接收存储列表

    退出 bootldr 连接
    步骤2 -->阅读版本信息
    端口已打开
    等待 ACK
    接收 ACK
    读取版本信息已完成

    引导加载程序版本为(3、0、1、0)
    它是 CC3220S 器件
    步骤3 (仅限 CC3220)->将 UART 切换到 NWP 内核
    端口已打开
    等待 ACK
    接收 ACK
    设置中断信号
    等待 ACK
    接收 ACK
    切换到 NWP 引导加载程序已完成
    RawStorageWrite
    端口已打开
    步骤#4/8 -->获取 SRAM/SFLASH 存储信息
    等待 ACK
    接收 ACK
    步骤#5/9-->从块#0开始对来自 SRAM/SFLASH 的11个块进行擦除
    擦除块的过程需要几秒钟
    等待 ACK
    接收 ACK
    状态请求
    等待 ACK
    接收 ACK
    擦除完成

    步骤#6/10 ->将 IMAGE[0:1051]编程到 SRAM/SFLASH
    等待 ACK
    接收 ACK
    状态请求
    等待 ACK
    接收 ACK
    等待 ACK 38%
    接收 ACK
    状态请求
    等待 ACK
    接收 ACK
    等待 ACK 77%
    接收 ACK
    状态请求
    等待 ACK
    接收 ACK
    映像编程完成

    步骤7 -->从 SRAM 执行引导加载程序修补程序
    端口已打开
    等待 ACK
    接收 ACK
    等待 ACK
    --在 ACK 读取时 COM 端口超时
    输入获取存储信息
    端口已打开
    等待 ACK
    --获取存储信息时出错
    --Call Trace:--
    文件"C:\Python27amd64\Lib\runpy.py"、第174行、位于_run_module_as _main 中
    "__main__"、fname、加载程序、pkg_name)

    文件"C:\Python27amd64\Lib\runpy.py"、第72行、位于_run_code 中
    run_globals 中的执行代码

    文件"c:\Program files (x86)\Microsoft Visual Studio\2019\community\Common7\IDE\extensions\microsoft\python \core\debugpy\__main__.py"、第45行、如所示
    cli.main()

    文件"c:\Program files (x86)\Microsoft Visual Studio\2019\communic\Common7\IDE\extensions\microsoft\python \core\debugpy/../debugpy\server\cli.py"、第430行、位于 main 中
    运行()

    文件"c:\Program files (x86)\Microsoft Visual Studio\2019\communic\Common7\IDE\extensions\microsoft\python \core\debugpy/../debugpy\server\cli.py"、第267行、位于 run_file 中
    runpy.run_path(options.target、run_name=compat.force_str ("__main__"))

    文件"C:\Python27amd64\Lib\runpy.py"、第252行、位于 run_path 中
    返回_run_module_code (代码、init_globals、run_name、path_name)

    文件"C:\Python27amd64\Lib\runpy.py"、第82行、位于_run_module_code 中
    mod_name、mod_fname、mod_loader、pkg_name)

    文件"C:\Python27amd64\Lib\runpy.py"、第72行、位于_run_code 中
    run_globals 中的执行代码

    文件"C:\Users\clnorRIS\Documents\Projects\Datashe\CC3x20_Embedded_Programming_2_0\Sources\ImageProgramming.py"、第125行、位于
    main (args、SelectedTraceLevel、EraseBeforeWrite)

    main 中的文件"C:\Users\clnorRIS\Documents\Projects\Datashe\CC3x20_Embedded_Programming_2_0_0\Sources\ImageProgramming.py"、第95行
    BurnImage( args、SelectedTraceLevel、EraseBeforeWrite )

    BurnImage 中的文件"C:\Users\clnorRIS\Documents\Projects\Datashe\CC3x20_Embedded_Programming_2_0_0\Sources\ImageProgramming.py"、第69行
    SlashBlockSize、SlashMaxBlocks = LDR.GetStorageInfo ("SFLASH")

    --错误行:--
    回溯(最近一次调用最后一次):
    文件"C:\Users\clnorRIS\Documents\Projects\Datashe\CC3x20_Embedded_Programming_2_0\Sources\bootldr.py"、第361行、位于 GetStorageInfo 中
    INFO = self.. GetStorageInfo (存储)
    文件"C:\Users\clnorRIS\Documents\Projects\Datashe\CC3x20_Embedded_Programming_2_0\Sources\bootldr.py"、第239行、位于_GetStorageInfo 中
    self._read_ack()
    文件"C:\Users\clnorRIS\Documents\Projects\Datashe\CC3x20_Embedded_Programming_2_0\Sources\bootldr.py"、第182行、位于_read_ack 中
    提升 BootloaderException ('gOT Nack')
    BootloaderException:GOT NACK

    然后、我尝试通过在 bootldr .py 中创建自己的块擦除方法来强制执行擦除。  以下是我的函数:

    DEF RawErase (self、Storage、StartBlock、BlocksToErase、EraseBeforeWrite = True):
    尝试:
    self_trace_msg (trace_level_debug、"RawStorageErase")
    如果(存储不在存储中):
    self._trace_msg (trace_level_error、"Unknown storage{:s}"。format (Storage))
    返回无
    self._comm_open()
    if (EraseBeforeWrite):
    NormalTimeOut = self.comm.timeout
    self._trace_msg (trace_level_activity、("步骤#5/9 ->对来自 SRAM/SFLASH 的{:d}块进行偏置、从块#{:d}".format (BlocksToErase、StartBlock))开始)
    self.comm.timeout = BlocksToErase / 10.0
    if (self.comm.timeout =0):
    self.comm.timeout = 1.
    self_trace_msg (trace_level_activity"、"擦除块的过程需要几秒钟时间")
    状态= self._EraseBlocks (存储、StartBlock、BlocksToErase)
    self.comm.timeout = normalTimeOut
    如果(True !=状态):
    提交异常("RawStorageErase Failed")
    
    self._trace_msg (trace_level_activity、"擦除已完成\n")
    例外情况除外:
    self._trace_msg (trace_level_error、''--原始写入期间出错\n
    \n***** 请重置主板并重试***** '')
    self._printTraceback ()
    sys.exit (exit_code_exception_raW_write)
    

    创建函数后、我从 ImageProgramming.py 调用它来擦除所有块:

    LDR.RawErase ("SFLASH"、0、1024、True)

    擦除命令也接收到一个 NACK。  我尝试使用 SFLASH 的任何引导加载程序命令似乎都不起作用。  您是否知道用于重置 SFLASH 以便我可以再次尝试编程的任何引导加载程序命令序列?  我们是否可以从 SRAM 上载和执行任何其他类型的擦除工具?

    我们的下一个电路板修订版将 来自 CC3220MODAS 的 FLASH_SPI_CLK、FLASH_SPI_MISO 和 FLASI_SPI_NCS_IN 置于标题中。  我希望锁定不会在另一个板上发生、但如果确实发生了、我想知道使用编程引脚将 SPI 闪存擦除到所有 FF 是否会将模块重置为可以再次编程的状态。

    任何见解都值得赞赏!

    谢谢、
    Chris Norris

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

    您可以尝试恢复出厂设置过程(作为恢复方法)。

    我需要就引导加载程序代码进行咨询。

    BR、

    Kobi