• Menu
  • Product
  • Email
  • PDF
  • Order now
  • 避免 UCD3138 器件锁定

    • ZHCACU3 july   2023 UCD3138 , UCD3138064 , UCD3138064A , UCD3138128 , UCD3138128A , UCD3138A , UCD3138A64

       

  • CONTENTS
  • SEARCH
  • 避免 UCD3138 器件锁定
  1.   1
  2.   摘要
  3.   商标
  4. 1为何会发生锁定
  5. 2锁定的原因
    1. 2.1 load.asm 中的代码错误
    2. 2.2 TI GUI 误操作
    3. 2.3 zero_out_integrity_word 函数失败
    4. 2.4 PMBus 通信失败
    5. 2.5 意外情况
  6. 3如何避免锁定
  7. 4使用 JTAG 解锁
    1. 4.1 启用 JTAG 功能
    2. 4.2 CCS 中的新目标配置
    3. 4.3 清除闪存
  8. 5总结
  9. 6参考文献
  10. 重要声明
search No matches found.
  • Full reading width
    • Full reading width
    • Comfortable reading width
    • Expanded reading width
  • Card for each section
  • Card with all content

 

Application Note

避免 UCD3138 器件锁定

本资源的原文使用英文撰写。 为方便起见,TI 提供了译文;由于翻译过程中可能使用了自动化工具,TI 不保证译文的准确性。 为确认准确性,请务必访问 ti.com 参考最新的英文版本(控制文档)。

摘要

当器件无法再重新编程时就会发生锁定。锁定可能是由不正确的下载流程或存在故障的固件引起的。本应用手册介绍了可能导致 UCD3138 器件发生锁定的原因以及避免锁定的方法。

商标

Other TMs

1 为何会发生锁定

当存在无法清除的有效校验和时,可能会发生锁定。不同的 UCD3138 器件具有不同数量的校验和。

UCD3138(A) 器件具有单个块。校验和有两个位置,每个校验和为 4 个字节。

  • 0x7fc - 引导校验和,即从地址 0 到 0x7fB 的 pflash 字节之和
  • 0x7ffc - pflash 总体校验和,即从地址 0 到 0x7ffB 的 pflash 字节之和

图 2-4 是显示 UCD3138(A) ROM 如何处理校验和验证的流程图。只要两个校验和中有一个有效,就会跳转到地址 0 来执行 pflash 中的代码。

GUID-20230602-SS0I-PR03-9BWV-NGJDGLGTR474-low.svg图 1-1 UCD3138(A) ROM 中的校验和验证流程图

UCD3138064(A) 器件具有块 1 和块 2。校验和有四个位置,每个校验和为 4 个字节。

  • 0x7fc - 块 1 引导校验和,即从地址 0 到 0x7fB 的 pflash 字节之和
  • 0x7ffc - 块 1 总体校验和,即从地址 0 到 0x7ffB 的 pflash 字节之和
  • 0x87fc - 块 2 引导校验和,即从地址 0x8000 到 0x87fB 的 pflash 字节之和
  • 0xfffc - 组合块 1 和块 2 的 64K 程序总体校验和,或仅块 2 的总体校验和

图 1-2 是显示 UCD3138064(A) ROM 如何处理校验和验证的流程图。

GUID-20230602-SS0I-DZ8J-NGXD-GGB7VLMSLMJB-low.svg图 1-2 UCD3138064(A) ROM 中的校验和验证流程图

UCD3138128(A) 具有块 0、块 1、块 2 和块 3。校验和有四个位置,每个校验和为 8 个字节。

  • 0x7f8 - 块 0 引导校验和,即从地址 0 到 0x7f7 的 pflash 字之和
  • 0x7ff8 - 块 0 总体校验和,即从地址 0 到 0x7ff7 的 pflash 字之和
  • 0xfff8 - 组合块 0 和块 1 的 64K 程序总体校验和,即从地址 0 到 0xfff7 的 pflash 字之和
  • 0x1fff8 - 128K 程序总体校验和,或组合块 2 和块 3 的 64K 程序总体校验和

图 1-3 是显示 UCD3138128(A) ROM 如何处理校验和验证的流程图。

GUID-20230602-SS0I-V52L-ZXVG-Z2XWW5WGSKLG-low.svg图 1-3 UCD3138128(A) ROM 中的校验和验证流程图

2 锁定的原因

2.1 load.asm 中的代码错误

在 load.asm 中,如果删除了以下红线,但保留了两条蓝线,则会导致器件持续复位,因为 r4 没有有效值。在这种情况下,器件会永久锁定,并且这 5 条线将完全删除或保留。

B_fast_interrupt
         .align 4
         .sect ".text"
             .state32
c_int00
;            B      c_int00 
             LDR          r13, c_sup_stack_top ; initialize supervisor stack pointer
;            LDR          r4,c_mfbalr1_half0 ;point r4 at program flash base address register
;            MOV          r0,#0x62 ;make block size 32K, address 0, read only
;            STRH   r0,[r4]; store it there
             LDR          r0,c_mfbalr2_half0_load ;set up data flash for write only
             STRH   r0,[r4,#8] ;put it into mfbalr2

2.2 TI GUI 误操作

如果应用中没有引导加载程序,但选择了 Boot support,则地址 0x7f4(或 0x7f8)处可以存在用于引导的有效校验和。由于未使用引导加载程序,因此 0x7f4(或 0x7f8)处的校验和无法清除,并可能导致锁定。

GUID-20230602-SS0I-PRJV-2WNL-7N8VVKFLZNR6-low.png图 2-1 引导支持选择

2.3 zero_out_integrity_word 函数失败

zero_out_integrity_word 函数用于清除校验和的指定位置。当 zero_out_integrity_word 函数未在 32 位模式下进行编译时,可能会发生锁定。此函数通常位于名为 zero_out_integrity_word.c 的独立文件中不同工程的函数名或文件名可能略有不同,但通常如下所示。

#define program_flash_integrity_word (*((volatile unsigned long *) 0x7ffc))
//last word in flash, when executing from Flash.  used to store integrity code

void zero_out_integrity_word(void)
{
    DecRegs.FLASHILOCK.all = 0x42DC157E;// Write key to Program Flash Interlock Register
    DecRegs.MFBALR1.all = MFBALRX_BYTE0_BLOCK_SIZE_32K; //enable program flash write    program_flash_integrity_word = 0;
   DecRegs.MFBALR1.all = MFBALRX_BYTE0_BLOCK_SIZE_32K + MFBALRX_BYTE0_RONLY;

    while(DecRegs.PFLASHCTRL.bit.BUSY != 0)
    {
        ; //do nothing while it programs
}

    return;
}

要检查此函数/文件是否在 32 位模式下编译:

  • 右键点击 zero_out_integrity_word.c > Properties > CCS Build > ARM Compiler > Processor Option > Designate code state。
  • 如果当前为 16,则更改为 32(如图 2-2 所示。)
  • 重建工程。

请注意,此选项通过 CCS 中的配置完成,所以当变更 CCS 版本或编译器版本时,zero_out_integrity_word 函数可能会失败。


GUID-20230608-SS0I-PWGS-LCGW-NWCPTBMJSP6T-low.png

图 2-2 指定代码状态

另一种选择是使用预处理器指令 #pragma 告知编译器在 32 位模式下编译指定函数。下面是一个示例:

#define program_flash_integrity_word (*((volatile unsigned long *) 0x7ffc))
//last word in flash, when executing from Flash.  used to store integrity code

#pragma CODE_STATE(zero_out_integrity_word, 32) // 16 = thumb mode, 32 = ARM mode
void zero_out_integrity_word(void)
{
    DecRegs.FLASHILOCK.all = 0x42DC157E;// Write key to Program Flash Interlock Register
    DecRegs.MFBALR1.all = MFBALRX_BYTE0_BLOCK_SIZE_32K; //enable program flash write
    program_flash_integrity_word = 0;
   DecRegs.MFBALR1.all = MFBALRX_BYTE0_BLOCK_SIZE_32K + MFBALRX_BYTE0_RONLY; 
    while(DecRegs.PFLASHCTRL.bit.BUSY != 0)
    {
        ; //do nothing while it programs
}

    return;
}

2.4 PMBus 通信失败

当 zero_out_integrity_word 函数正常运行时可能会发生锁定,而 PMBus 通信失败的原因在于 zero_out_integrity_word 通常由 PMBus 命令触发。

要进行调试,请在应用代码的开头放置后门,如下所示。这是为了确保器件能够在满足后门条件时恢复。

void main()
{
	volatile unsigned int dummy;
	if(GioRegs.FAULTIN.bit.FLT3_IN == 0)// Re-Check pin assignment 
	{
		clear_integrity_word();
}
}

2.5 意外情况

如果在使用旧 GUI 编程期间出现意外情况,则可能会发生锁定(例如,电源关闭或电线松动)。在使用引导校验和的情况下尤其如此。这是因为旧 GUI 程序按顺序从低地址转为高地址。如果发生这种情况,请使用最新的 GUI 工具 Fusion Digital Power Studio。该工具最后对校验和进行编程,从而使器件有机会在复位时恢复。

3 如何避免锁定

要避免锁定,请执行以下三个步骤:

步骤 1:如果固件可能无法正常运行,请勿在对 UCD 器件进行编程时写入校验和。虽然编程后校验和仍可跳转到 pflash 执行,但 UCD 器件始终可以在复位时返回到 ROM 模式。请遵循图 3-1 所示配置。

GUID-20230602-SS0I-6VQF-XNHP-NKZGDSKGC3XH-low.png图 3-1 无校验和编程

步骤 2:确认已正确清除校验和的预期位置。点击命令 Command Program to jump to ROM (Send Byte 0xD9 to address xx),将 UCD 发送回 ROM 模式。

GUID-20230602-SS0I-PQZQ-K8CV-FMNLL4RXVRBM-low.png图 3-2 跳转至 ROM 模式

步骤 3:转至 Checksums 标签。选择 Dump 按钮来通过配置 Block Configuration 读取每个校验和。检查是否清除了预期的校验和位置。如果已正确清除,该字段将显示为零。

GUID-20230602-SS0I-DMPZ-HZSJ-020HHWDDZWCL-low.png图 3-3 校验和值验证

检查代码,确认是否已清除正确的校验和。按预期清除后,使用校验和对 UCD 器件进行编程。

4 使用 JTAG 解锁

如果器件无法重新编程,但固件和存储器调试器的读写功能正常运行,则可以通过 JTAG 解锁。

4.1 启用 JTAG 功能

JTAG 端口主要包括 4 个引脚:TCK/TDI/TDO/TMS。如果禁用 JTAG 功能,这 4 个引脚可在 GPIO 模式下正常运行,这在应用中是正常情况。要启用 JTAG 功能,请检查以下寄存器的配置,并在必要时进行重新配置。将 IOMUX 寄存器设置为 0 以便启用 JTAG,并确保 TCK/TDI/TDO/TMS 引脚均不在 GPIO 模式下运行。这可以通过 UCD3xxx 器件 GUI 中的存储器调试器来完成。

       MiscAnalogRegs.IOMUX.all = 0; //enable JTAG

                MiscAnalogRegs.GLBIOEN.bit.TCK_IO_EN = 0;
                MiscAnalogRegs.GLBIOEN.bit.TDI_IO_EN = 0;
                MiscAnalogRegs.GLBIOEN.bit.TDO_IO_EN = 0;
                MiscAnalogRegs.GLBIOEN.bit.TMS_IO_EN = 0;

 

Texas Instruments

© Copyright 1995-2025 Texas Instruments Incorporated. All rights reserved.
Submit documentation feedback | IMPORTANT NOTICE | Trademarks | Privacy policy | Cookie policy | Terms of use | Terms of sale