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.

[参考译文] TMS320F28379S:C28xx_CPU1:闪存验证期间出错。 故障地址:0x000C0000

Guru**** 2466550 points
Other Parts Discussed in Thread: TMS320F28379S, SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1481697/tms320f28379s-c28xx_cpu1-error-during-flash-verification-address-of-failure-0x000c0000

器件型号:TMS320F28379S
主题中讨论的其他器件: SysConfigC2000WARE

工具与软件:

您好!

在编程(XD200)期间、CCS 返回一个 闪存验证错误:
C28xx_CPU1:GEL 输出:  
存储器映射初始化完成
C28xx_CPU1:闪存验证期间出错。 故障地址:0x000C0000、目标上的数据:0x00000000、来自程序的数据:0xBBBD0001 (0)
C28xx_CPU1:闪存验证返回了错误情况。 操作已取消。
C28xx_CPU1:文件加载程序:内存写入失败:未知错误
C28xx_CPU1:GEL:文件:

我测试了两个电路板、但两个电路板上都发生了相同的问题。  我对闪存0存储体从来没有任何问题。

什么原因可能导致该问题?

硬件/软件信息:
TMS320F28379S、 
SysConfig 1.18.0、 C2000Ware 5.1.0.00的176引脚版本

 DCSM 尚未配置。

Stephen

以下是链接器命令文件内容:


小程序

第0页:/*程序内存*/
/*存储器(RAM/FLASH)块可以移动到页1进行数据分配*/
/*开始用于"引导至闪存"引导加载程序模式*/

RAMM:origin = 0x000002、length = 0x0007F6 /*片上块 M0和 M1 */
// RAM1_RSVD:origin = 0x0007F8、length = 0x000008 /*保留不使用勘误表中的"Memory: prefeting Beyond VALID Memory"*/所述的代码

FREERTOS_STACK_RAMLS:origin = 0x008000、length = 0x002000 // End Address = 0x009FFF
RAMLS_AND_RAMGS:origin = 0x00A000、length = 0x011FF8 // End Address = 0x01BFF7
// RAMGS15_RSVD:origin = 0x01BFF8、length = 0x000008 /*根据 errata 公告"存储器:预取超出有效存储器"*、保留代码空间并勿用于此代码

复位:origin = 0x3FFFC0、length = 0x000002

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 20012000
GROUP{/*整个闪存 CRC/校验和的组存储器范围*/
#endif
#endif
/*闪存扇区*/
begin:origin = 0x080000、length = 0x000002
FLASH0:origin = 0x080002、length = 0x03FFFE //0x03FFFF 0x07FFEE
//FLASH1_DO_NOT_Use1:origin = 0x0C0000、length = 0x001000
FLASH1:origin = 0x0C0000、length = 0x03FFF0 /0x03FFFF 0x07FFEE FLASH0
FLASH1_DO_NOT_Use2:origin = 0x0FFFF0、length = 0x000010 /*根据 errata 公告"存储器:预取超出有效存储器"*、保留代码空间并勿用于此代码
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 20012000
}CRC (_CCS_FLASH_CHECKSUM、ALGORITH=C28_CHECKSUM_16)
#endif
#endif

第1页:/*数据存储器*/
external_SRAM_CS3:origin = 0x0300000、length = 0x80000

}


部分中)

/*分配方案领域:*/
.cinit :> FLASH0|FLASH1, page = 0, align(4)
.text:>> FLASH0|FLASH1、PAGE = 0、ALIGN (4)
codestart :> begin page = 0, align(4)

/*分配未初始化的数据段:*/
stack:> Ramm、page = 0
.switch:>> FLASH0|FLASH1、PAGE = 0、ALIGN (4)
.reset :> RESET , PAGE = 0, TYPE = DSECT /*未使用,*/

init_array :> FLASH0, page = 0, align(4)
.bss:> RAMLS_AND_RAMGS、PAGE = 0
.bss:output:> RAMLS_AND_RAMGS、page = 0
.bss:CIO:> RAMLS_AND_RAMGS、PAGE = 0
.data :> RAMLS_AND_RAMGS, PAGE = 0
.sysmem :> RAMLS_AND_RAMGS, PAGE = 0

freertosStaticStack:> freertos_stack_RAMLS page = 0

/*初始化段进入闪存*/
.const :>> FLASH0|FLASH1, PAGE = 0, ALIGN(4)

Filter_Regs : 307> RAMLS_AND_RAMGS,页面= 0

ramgs0 :> RAMLS_AND_RAMGS, PAGE = 0
RAMGS1 :> RAMLS_AND_RAMGS, PAGE = 0


SRAM_SECTION :> EXTERNAL_SRAM_CS3 , page = 1.

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 15009000
.TI.ramfunc:{}load = FLASH0、
运行= RAMLS_AND_RAMGS、
Load_start (RamfuncsLoadStart)、
Load_Size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
RUN_SIZE (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#else
ramfuncs:{}load = FLASH0、
运行= RAMLS_AND_RAMGS、
Load_start (RamfuncsLoadStart)、
Load_Size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
RUN_SIZE (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#endif
#endif

}

/*
//________________________________________________====
//文件结尾。
//________________________________________________====
*/

 

 

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

    如您所说、0xC0000在编程为闪存0组时应该类似、让我们检查 CCS 闪存插件工具设置。

    您能否在 CCS 中打开闪存工具、并查看是否可通过该工具对整个闪存执行擦除?  然后仔细检查以在存储器窗口中看到、您在该区域中看到所有的0xFFFFs。

    在该工具中、还要验证有问题的地址没有被阻止写入等。并且应正确检查代码加载时的擦除/编程/验证选项。

    此致!

    Matthew

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

    Matthew、您好!

    我使用 CCS12.1。  您指的是什么闪存工具?

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

    以下是擦除闪存期间调试器的输出:

    C28xx_CPU1:GEL 输出:
    存储器映射初始化完成
    C28xx_CPU1:写入闪存@长度为0x00000008的地址0x00080000 (第0页)
    C28xx_CPU1:PLL 配置状态= 1。 PLL 配置成功。
    C28xx_CPU1:擦除闪存组0扇区 A
    C28xx_CPU1:擦除闪存组0扇区 B
    C28xx_CPU1:擦除闪存组0扇区 C
    C28xx_CPU1:擦除闪存组0扇区 D
    C28xx_CPU1:擦除闪存组0扇区 E
    C28xx_CPU1:擦除闪存组0扇区 F
    C28xx_CPU1:擦除闪存组0扇区 G
    C28xx_CPU1:擦除闪存组0扇区 H
    C28xx_CPU1:擦除闪存组0、扇区 I
    C28xx_CPU1:擦除闪存组0、扇区 J
    C28xx_CPU1:擦除闪存组0扇区 K
    C28xx_CPU1:擦除闪存组0扇区 L
    C28xx_CPU1:擦除闪存组0扇区 M
    C28xx_CPU1:擦除闪存组0扇区 N
    C28xx_CPU1:擦除闪存组1扇区 O
    C28xx_CPU1:擦除闪存组1扇区 P
    C28xx_CPU1:擦除闪存组1扇区 Q
    C28xx_CPU1:擦除闪存组1扇区 R
    C28xx_CPU1:擦除闪存组1扇区 S
    C28xx_CPU1:擦除闪存组1扇区 T
    C28xx_CPU1:擦除闪存组1扇区 U
    C28xx_CPU1:擦除闪存组1扇区 V
    C28xx_CPU1:擦除闪存组1、扇区 W
    C28xx_CPU1:擦除闪存组1扇区 X
    C28xx_CPU1:擦除闪存组1扇区 Y
    C28xx_CPU1:擦除闪存组1扇区 Z
    C28xx_CPU1:擦除闪存组1扇区 AA
    C28xx_CPU1:擦除闪存组1扇区 AB

    似乎不是在擦除 BANK1:

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

    在 DCSM 寄存器设置中将组1设置为不可访问:

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

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

    这看起来像是  DCSM 问题、因为 闪存组1设置为不可访问、这很奇怪、因为我从未配置过 DCSM。

    在运行时、0xC0000处的值为0:

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

    我是否需要配置  DCSM?  配置方面我需要帮助。

    这有点像 Graw_Bank1包含00。  这可以改变吗?

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

    Steven、

    我同意您的最后一句话、我想重复一些其他比我更熟悉 DCSM 的人。  我还想在全新的器件上、CCS 工具能够自动抓取闪存信标、而无需修改 Graw_Bank1。

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

    谢谢。  希望 我很快就会收到他们的消息。

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

    Matthew、您好!

    您认为什么时候可以让更熟悉 DCSM 的人员来帮助解决此问题?

    谢谢!

    Stephen

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

    Steven、您好。

    您是否在 SysConfig 中添加了 DCSM 模块、即使只是为了对自定义引导设置进行编程也是如此? 我认为过去版本的 SysConfig 存在一个问题、即添加 DCSM 模块会将闪存组1默认编程为不可访问。

    是否还有另一个未编程的器件? 您能否检查此器件上是否将 GRABR_BANK1编程为00?

    您能截取从地址0x78000开始的内存浏览器的屏幕截图并在该主题上共享吗?

    谢谢!

    Luke

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

    Luke、您好!

    我认为我从未将 DCSM 模块添加到 SysConfig。    我测试的两个电路板上都出现了这种情况。  我们确实有第三块电路板可以尝试使用、但是、 目前其他人已经拥有了该电路板。

    一旦被编程为不可访问、是否可以对其进行重新编程以进行访问?

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

    我们的板有两个 TMS320F28379S、我将其称为 CPU1和 CPU2。  CPU2具有如下所示的 DCSM 配置。  但是、我正在尝试对 CPU1进行编程、该操作尚未配置。

    我的 CCS 工程使用的是 SysConfig 版本1.18和 C2000版本5.1.0.00。

    DCSM1.$name ="DCSM0";
    DCSM1.Zone1_OTP.$name ="zone_OTP0";
    DCSM1.Zone1_OTP.configureBoot = true;
    DCSM1.Zone1.$name ="ZONE0";
    DCSM1.ZONE2_OTP.$name ="zone_otp1";
    DCSM1.ZONE2.$name ="Zone1";

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

    Steven、您好。

    您可以通过更新地址0x78000处的链接指针值来重置 GRABSECT 设置。 没有3个 LINKPOINTER 值需要更新。 如果您在此方面需要帮助、请告诉我(我建议使用片上闪存工具直接对链接指针进行编程)。

    我已查看最新的 C2000Ware 并发现、当区域1或2受到保护时、SysConfig 始终将 bank1编程为不可访问。 我将确保在下一版本的 SysConfig 中更正此错误。

    您能否发送从地址0x78000开始的内存浏览器屏幕截图? 我希望检查闪存组1是否始终编程为不可访问、无论链接指针值如何都是如此。

    谢谢!

    Luke

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

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

    看起来 bank1仅配置为在 ZoneSelectBlock1中无法访问。   

    我是否应该将所有三个链路指针设置为0x1FFFFFFE、这就是 ZoneSelectBlock2?

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

    将以下内容添加到链接器 cmd 文件就足够了  

    小程序

    第0页:/*程序内存*/

    /* Z1 OTP。 LinkPointers */
    DCSM_OTP_Z1_LINKPOINTER:origin = 0x78000、length = 0x00000C
    /* Z2 OTP。 LinkPointers */
    DCSM_OTP_Z2_LINKPOINTER:origin = 0x78200、length = 0x00000C
    }

    部分中)

    DCSM_OTP_Z1_linkpointer:>DCSM_OTP_Z1_LINKPOINTER page = 0、type = DSECT

    DCSM_OTP_Z2_linkpointer:> DCSM_OTP_Z2_LINKPOINTER page = 0、type = DSECT
    }

    然后将以下文件添加到我的项目中:
    e2e.ti.com/.../3531.DCSM_5F00_Z1_5F00_ZoneSelectBlock.asme2e.ti.com/.../3531.DCSM_5F00_Z2_5F00_ZoneSelectBlock.asm


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

    Steven、您好。

    是的、我认为这样应该可行、如果您在尝试后遇到任何问题、请告诉我。

    谢谢!

    Luke

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

    在我更新 cmd 文件并添加 asm 文件后、不会修改0x78000和0x78200。

    映射文件:





    存储器区域:


    链接器 cmd 文件:


    小程序

    第0页:/*程序内存*/
    /*存储器(RAM/FLASH)块可以移动到页1进行数据分配*/
    /*开始用于"引导至闪存"引导加载程序模式*/

    RAMM:origin = 0x000002、length = 0x0007F6 /*片上块 M0和 M1 */
    // RAM1_RSVD:origin = 0x0007F8、length = 0x000008 /*保留不使用勘误表中的"Memory: prefeting Beyond VALID Memory"*/所述的代码

    FREERTOS_STACK_RAMLS:origin = 0x008000、length = 0x002000 // End Address = 0x009FFF
    RAMLS_AND_RAMGS:origin = 0x00A000、length = 0x011FF8 // End Address = 0x01BFF7
    // RAMGS15_RSVD:origin = 0x01BFF8、length = 0x000008 /*根据 errata 公告"存储器:预取超出有效存储器"*、保留代码空间并勿用于此代码

    复位:origin = 0x3FFFC0、length = 0x000002

    /* Z1 OTP。 LinkPointers */
    DCSM_OTP_Z1_LINKPOINTER:origin = 0x78000、length = 0x00000C

    /* Z2 OTP。 LinkPointers */
    DCSM_OTP_Z2_LINKPOINTER:origin = 0x78200、length = 0x00000C

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 20012000
    GROUP{/*整个闪存 CRC/校验和的组存储器范围*/
    #endif
    #endif
    /*闪存扇区*/
    begin:origin = 0x080000、length = 0x000002
    FLASH0:origin = 0x080002、length = 0x03FFFE //0x03FFFF 0x07FFEE
    //FLASH1_DO_NOT_Use1:origin = 0x0C0000、length = 0x001000
    FLASH1:origin = 0x0C0000、length = 0x03FFF0 /0x03FFFF 0x07FFEE FLASH0
    FLASH1_DO_NOT_Use2:origin = 0x0FFFF0、length = 0x000010 /*根据 errata 公告"存储器:预取超出有效存储器"*、保留代码空间并勿用于此代码
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 20012000
    }CRC (_CCS_FLASH_CHECKSUM、ALGORITH=C28_CHECKSUM_16)
    #endif
    #endif

    第1页:/*数据存储器*/
    external_SRAM_CS3:origin = 0x0300000、length = 0x80000

    }


    部分中)

    /*分配方案领域:*/
    .cinit :> FLASH0|FLASH1, page = 0, align(4)
    .text:>> FLASH0|FLASH1、PAGE = 0、ALIGN (4)
    codestart :> begin page = 0, align(4)

    /*分配未初始化的数据段:*/
    stack:> Ramm、page = 0
    .switch:>> FLASH0|FLASH1、PAGE = 0、ALIGN (4)
    .reset :> RESET , PAGE = 0, TYPE = DSECT /*未使用,*/

    init_array :> FLASH0, page = 0, align(4)
    .bss:> RAMLS_AND_RAMGS、PAGE = 0
    .bss:output:> RAMLS_AND_RAMGS、page = 0
    .bss:CIO:> RAMLS_AND_RAMGS、PAGE = 0
    .data :> RAMLS_AND_RAMGS, PAGE = 0
    .sysmem :> RAMLS_AND_RAMGS, PAGE = 0

    freertosStaticStack:> freertos_stack_RAMLS page = 0

    /*初始化段进入闪存*/
    .const :>> FLASH0|FLASH1, PAGE = 0, ALIGN(4)

    Filter_Regs : 307> RAMLS_AND_RAMGS,页面= 0

    ramgs0 :> RAMLS_AND_RAMGS, PAGE = 0
    RAMGS1 :> RAMLS_AND_RAMGS, PAGE = 0


    SRAM_CS3_SECTION:> EXTERNAL_SRAM_CS3、page = 1

    DCSM_OTP_Z1_linkpointer:>DCSM_OTP_Z1_LINKPOINTER page = 0、type = DSECT

    DCSM_OTP_Z2_linkpointer:> DCSM_OTP_Z2_LINKPOINTER page = 0、type = DSECT

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 15009000
    .TI.ramfunc:{}load = FLASH0、
    运行= RAMLS_AND_RAMGS、
    Load_start (RamfuncsLoadStart)、
    Load_Size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    RUN_SIZE (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
    #else
    ramfuncs:{}load = FLASH0、
    运行= RAMLS_AND_RAMGS、
    Load_start (RamfuncsLoadStart)、
    Load_Size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    RUN_SIZE (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
    #endif
    #endif

    }

    /*
    //________________________________________________====
    //文件结尾。
    //________________________________________________====
    */

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

    之前、我未在 SysConfig 中添加 DCSM。  我刚才完成了这个操作、现在它修改了区域1的链接指针。  它还更改了该区域的 OTP 存储器、我不想让它执行该操作。  因此、它仍然无法写入第二个存储库。

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

    它正在工作。  我需要写入闪存两次。  我将 SysConfig 生成的 DCSM 文件(asm 和 cmd)删除、并删除了 如下所示的区域配置部分。  我还从 SysConfig 中删除了 DCSM 配置。


    ;-------------------------------------------------------
    ;区域1
    ;-------------------------------------------------------
    .sect "dcsm_otp_z1_linkpointer"
    .retain
    .long 0x1FFFFFFC
    .long 0xFFFFFFFF;保留
    .long 0x1FFFFFFC
    .long 0xFFFFFFFF;保留
    .long 0x1FFFFFFC
    .long 0xFFFFFFFF;保留

    .sect "dcsm_otp_z1_pswdlock"
    .retain
    .long 0xFFFFFFFF
    .long 0xFFFFFFFF;保留

    .sect "DCSM_OTP_Z1_crclock"
    .retain
    .long 0xFFFFFFFF
    .long 0xFFFFFFFF;保留


    ;-------------------------------------------------------

    ;代码安全操作,开发完成后,之前
    ;生产时、所有其它区域选择块位置都应编程
    ;设置为0x0000以获得最大安全性。
    ;如果使用偏移量0x10处的第一个区域选择块、则该段
    ;"dcsm_rsvd_z1"可用于将这些位置编程为0x0000。
    ;此代码为开发注释掉。

    ;.sect "dcsm_rsvd_z1"
    ;.loop (1e0h)
    ;.int 0x0000
    ;.endloop


    ;-------------------------------------------------------
    ;区域2
    ;-------------------------------------------------------
    .sect "dcsm_otp_z2_linkpointer"
    .retain
    .long 0x1FFFFFFC
    .long 0xFFFFFFFF;保留
    .long 0x1FFFFFFC
    .long 0xFFFFFFFF;保留
    .long 0x1FFFFFFC
    .long 0xFFFFFFFF;保留

    .sect "dcsm_otp_z2_pswdlock"
    .retain
    .long 0xFFFFFFFF
    .long 0xFFFFFFFF;保留

    .sect "DCSM_OTP_Z2_crclock"
    .retain
    .long 0xFFFFFFFF
    .long 0xFFFFFFFF;保留

    ;-------------------------------------------------------

    ;代码安全操作,开发完成后,之前
    ;生产时、所有其它区域选择块位置都应编程
    ;设置为0x0000以获得最大安全性。
    ;如果使用偏移量0x10处的第一个区域选择块、则该段
    ;可以使用"dcsm_rsvd_z2"将这些位置编程为0x0000。
    ;此代码为开发注释掉。

    ;.sect "dcsm_rsvd_z2"
    ;.loop (1e0h)
    ;.int 0x0000
    ;.endloop


    ;-------------------------------------------------------
    ;文件结尾
    ;-------------------------------------------------------