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.

[参考译文] TMS320F2800132:无法写入 TMS320F2800132 闪存数据

Guru**** 2694555 points

Other Parts Discussed in Thread: TMS320F2800132, TMS320F2800137, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1587767/tms320f2800132-tms320f2800132-flash-data-cannot-be-written

器件型号: TMS320F2800132
Thread 中讨论的其他器件: TMS320F2800137UNIFLASH

应用 TMS320F2800132 芯片时、发现数据无法写入闪存。 但是、当 SDK 参考代码烧录到 TMS320F2800137 演示板上时、可以正常写入数据。 但是、当参考代码烧录到 TMS320F2800132 芯片时、无法写入数据。
擦除和写入函数如下所示。 增加等待时间的尝试也未能解决问题。 请帮助我找出问题的原因。 谢谢你。

code.c 

成功 (TMS320F2800137)

image.png

 

故障 (TMS320F2800132)

image.png

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

    您好 Xin、

    由于 F2800132 器件的闪存比 F2800137 少、因此应修改打算与 F2800132 配合使用的工程的链接器命令文件 (.cmd)。

    请参阅此帖子、其中说明了所需的不同范围/命令:  关于 TMS320F2800132:扇区违规问题  

    此致、

    Marlyn

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

    尊敬的 Marlyn:

    感谢您的答复。我阅读了您提到的帖子,其中描述的问题与我遇到的情况不同。 我检查了 280013x_generic_flash_lnk.cmd 文件、并发现它中的闪存定义未超过 64KB 范围。 此外、I SET 的范围未超过 0x88000。 这是一个现象、请参考。 根据我的理解、如果无法写入闪存、它应显示 0xFFFF。 但是、在我写入数据、然后在相应地址读取内容后、显示的值为 0x0000 而不是 0xFFFF。 单独的擦除验证是精细的、但写入有一个异常。 280013x_generic_flash_lnk.cmd 的内容如下。

    移动数据

    /*ram0~RAM1:2kW = 4KB:0x00000000~0x00000800*/
    //RAMM0:origin = 0x00000000、长度= 0x00000400
    //RAMM1:origin = 0x00000400、length = 0x00000400
    RAMM01:origin = 0x00000000、长度= 0x00000800
    /*RAMLS4~RAMLS7:8KW = 16KB:0x0000A000~0x0000BFFF*/
    //RAMLS4:origin = 0x0000A000、长度= 0x00000800
    //RAMLS5:origin = 0x0000A800、长度= 0x00000800
    //RAMLS6:origin = 0x0000B000、长度= 0x00000800
    //RAMLS7:origin = 0x0000B800、长度= 0x00000800
    RAMLS4567:origin = 0x0000A000、长度= 0x00002000
    /*RAMGS0:8KW = 16KB:0x0000C000~0x0000C7FF*/
    RAMGS0:origin = 0x0000C000、length = 0x00000800
    /*BootROM:64KW:0x003F0000~x003F FFFF*/
    BootROM:origin = 0x003F0000、长度= 0x00008000
    BootROM_EXT:origin = 0x003F8000、length = 0x00007FC0
    重置:origin = 0x003FFFC0、length = 0x00000002
    /*闪存扇区*/
    /*组 0 */
    // begin:origin = 0x080000、length = 0x000002 /* code flash begin */
    // FLASH_BANK0_SEC0:origin = 0x080002、length = 0x000FFE /*片上闪存*/
    // FLASH_BANK0_SEC1:origin = 0x081000、length = 0x001000 /*片上闪存*/
    // FLASH_BANK0_sec2:origin = 0x082000、length = 0x001000 /*片上闪存*/
    // FLASH_BANK0_SEC3:origin = 0x083000、length = 0x001000 /*片上闪存*/
    // FLASH_BANK0_SEC4:origin = 0x084000、length = 0x001000 /*片上闪存*/
    // FLASH_BANK0_SEC5:origin = 0x085000、length = 0x001000 /*片上闪存*/
    // FLASH_BANK0_SEC6:origin = 0x086000、length = 0x001000 /*片上闪存*/
    // FLASH_BANK0_sec7:origin = 0x087000、length = 0x001000 /*片上闪存*/
    #if 0
    begin:origin = 0x080000、length = 0x000002 /* code flash begin */
    FLASH_BANK2T6_SEC:origin = 0x080002、length = 0x006FEE /* App Flash */
    IAP_HEADER:origin = 0x086FF0、length = 0x000010 /* ISP Header*/
    FLASH_BANK7_SEC:origin = 0x087000、length = 0x001000 /* EEPROM 闪存*/
    #else
    begin:origin = 0x082000、length = 0x000002 /* code flash begin */
    FLASH_BANK2T6_SEC:origin = 0x082002、length = 0x002DEE /* App1 闪存*/
    FLASH_BANK01_SEC:origin = 0x080002、length = 0x001FFE /* boot Flash */
    IAP_HEADER:origin = 0x084DF0、length = 0x000010 /* ISP Header*/
    FLASH_BANK5T7_SEC:origin = 0x085000、length = 0x002DF0 /* App2 闪存*/
    IAP_HEADER1:origin = 0x087DF0、长度= 0x000010 /* ISP Header1*/
    BOOT_KEY:origin = 0x087E00、length = 0x000200 /* EEPROM Flash*/
    #endif
    DCSM ZSEL_Z1_P0:原点= 0x078008、长度= 0x000002
    dcsm_ZSEL_Z1_P1:原点= 0x07800C、长度= 0x000002
    }


    很重要

    codestart :> begin, align(8)
    .text:> FLASH_BANK2T6_SEC、ALIGN (8)
    .cinit:> FLASH_BANK2T6_SEC、ALIGN (8)
    .switch:> FLASH_BANK2T6_SEC、ALIGN(8)
    .reset:> reset、type = DSECT /*未使用、*/

    .stack :> RAMM01

    .init_array:> FLASH_BANK2T6_SEC、ALIGN (8)
    .bss :> RAMLS4567.
    .bss:output :> RAMLS4567
    .bss:CIO:> RAMLS4567
    .const:> FLASH_BANK2T6_SEC、ALIGN (8)
    .data :> RAMLS4567.
    .sysmem :> RAMLS4567.

    ramgs0 :> RAMGS0
    // IAP_BHeader :> IAP_Header , align(8)
    /*分配 IQ 数学区域:*/
    IQMath :> RAMLS4567
    IqmathTables :> RAMLS4567.

    .TI.ramfunc:load = FLASH_BANK2T6_SEC、
    RUN = RAMLS4567、
    LOAD_START (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    LOAD_END (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    RUN_SIZE (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐 (8)
    dcsm_zsel_Z1_1:> dcsm_ZSEL_Z1_P0
    dcsm_zsel_Z1_2:> dcsm_ZSEL_Z1_P1
    }
    /*
    //==============================================================================
    //文件结尾。
    //==============================================================================
    */

    请建议链接器文件有问题、Pls 帮助解决问题。

    此致、

    Xin

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

    尊敬的 Marlyn:

    我有一个 2800137 LaunchPad。 使用 SDK 参考代码将其编程到 2800137 板上可以成功完成。 但是、当我将 SDK 参考代码的频率更改为 100MHz 并将其编程到产品 (2800132) 时、无法成功写入。 同样、当我将自己工程代码的频率更改为 120MHz 并将其编程到 LaunchPad (2800137) 时、也无法正确写入。 我已经尝试了改变到不同的部门,但现象仍然一样。请帮助我检查配置是否有任何问题。Pls 帮助解决问题。谢谢。

    此致、

    Xin

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

    您好 Xin、

    您是否能够用 SDK 中的示例重现此问题? 如果可以使用已知的软件基础、则在我这边重现它会容易得多。 我认为链接器命令文件中提供的范围没有任何问题。

    但是、当我将 SDK 参考代码的频率更改为 100MHz 并将其编程到产品 (2800132) 时、无法成功编写。

    您能介绍一下如何更改频率吗?

    此致、

    Marlyn

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

    尊敬的 Marlyn:

    我以 100MHz 的频率重新修改了 SDK 参考代码、并将其烧录到 2800132 芯片上。 它能够正常写入数据。 似乎我在以前的修改中犯了一个错误。 当前的问题是、当我将代码更改为与参考代码相同并将其烧录到 2800132 芯片时、它编写的数据与我预期的完全不符 0000。 下面是我从参考代码中删除不必要的部分后的代码。 当我将该内容烧录到 2800132 芯片时、能够正常地写入数据。

    e2e.ti.com/.../demo_5F00_code.c

    这是我的代码。 我将其修改为与 SDK 参考代码相同、但无法编写预期值。

    e2e.ti.com/.../my_5F00_code.c

    我的配置是否有问题? 请帮助我指出。 谢谢!

    此致、

    Xin

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

    您好 Xin、

    只需确认、您正在使用同一个物理 F2800132 器件加载演示代码和您的代码? 我对您共享的两个文件进行了比较、唯一的区别是、在演示中、主代码函数是 void main ()、就像在您的代码中一样、它是 int main ()。 这不会导致您遇到的问题。 您是否在加载这两个程序之间执行任何其他操作、例如重启电源? 此外、如果您查看 CCS 中的存储器内容、其与 UniFlash 的显示内容是否一致?

    此致、

    Marlyn

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

    尊敬的 Marlyn:

    感谢您的回复。我已确定闪存写入异常的原因。 在参考代码中、数组“缓冲区“的地址定义为 0x0000A000、其长度为 0x00001FF8、如下所示。


    在我的代码中、数组“缓冲区“的地址定义为 0x0000C000、其长度为 0x00000800。 所示。


    修改“缓冲区“地址后、闪存可以正常写入数据。 我已验证数据长度未超出范围。 这两个地址之间是否有区别? 为什么在 0x0000C000 范围内的数据被视为异常? 谢谢你。

    此致、

    Xin

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

    您好 Xin、

    在我的代码中、数组“buffer"的“的地址定义为 0x0000C000、其长度为 0x00000800。 如下所示。

    很高兴您能识别出问题并正确编程您的代码。 请问您为什么要使用指定的地址创建新的 RAMGS0 部分? RAMLS1 地址 0x0000A000 是 LS1 RAM 的正确位置。  

    此致、

    Marlyn