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.

[参考译文] CCS/UCD3138:将 DFLASH 区域重新写入0xffffffff。

Guru**** 2577385 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/897586/ccs-ucd3138-dflash-area-was-rewritten-to-0xffffffff-all-over

器件型号:UCD3138

工具/软件:Code Composer Studio

突然、下面的闪存区域被重新写入0xffffffff。

00018880 _PMBus_DCDC_cal_constants             

0001888c _PMBus_DCDC_cal_nonpge_constants     

00018890 _PMBus_DCDC_CONFIG_constants           

000188d0 _PMBus_DCDC_CONFIG_NONPaged_constants

00018900 _PMBus_CHECKSUM                       

 

我确信、参数不会在 Fusion Digital Power Studio 中重写。

 

我怀疑 flash.c erase dflash 区域中的 start_erase_task ()、因为这是我可以找到的唯一擦除整个 dflash 区域的代码。

 

start_erase_task()被称为以下 if 子句。

if ((校验和! = PMBus_CHECKSUM)&&(PMBus_CHECKSUM! = 0x87654321))

我认为(校验和! = PMBus_CHECKSUM)始终为 true 并且(PMBus_CHECKSUM! = 0x87654321)通常为 false。 我想(PMBus_CHECKSUM! = 0x87654321)变为 ture。

 

PMBus_CHECKSUM 是否可能会被噪声破坏或误读 PMBus_CHECKSUM?

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

    您可以在此处找到答案:

    如果您无法消除噪声、以下代码将更改以添加 RAM 闪存密钥以提供保护:

    添加到 PMBus.c -可能是其他位置、具体取决于您使用的代码:


    +int32 PMBus_write_dflash_key (空)
    +{
    + dflash_key =(PMBus_buffer[2]<< 24)+(PMBus_buffer[3]<< 16)+(PMBus_buffer[4]<< 8)+ PMBus_buffer[5];
    +
    +返回 PMBus_SUCCESS;
    +}

    在 PMBus.c 中的 switch 语句中、写入消息:

            案例 PMBus_CMD_MFR_parm_info:

                  返回 PMBus_write_parm_info();

                                  案例 PMBus_CMD_MFR_parm_value:

                           返回 PMBus_write_parm_value ();       

    +                            案例 PMBus_CMD_MFR_SPECIFIC_35:

    +                                            返回 PMBus_write_dflash_key ();

    在软件中断函数中、可能在 interrupts.c 中、将常量对 FLASHILOCK 的所有写入替换为对 RAM 变量的写入

                                                   {

                                                                  返回;                 //段号无效

                                                  }

    -                                             DecRegs.FLASHILOCK.ALL = DATA_FLASH_UNCHONSE_KEY;//解锁闪存写入;

    +                                            DecRegs.FLASHILOCK.ALL = dflash_key;//解锁闪存写入;

                                                  //设置数据闪存控制寄存器中的位来擦除指定的段

                                                  dflashctrl_shadow.all = DecRegs.DFLASHCTRL.ALL;            //读取硬件寄存器

                                                  dflashctrl_shadow.bit.page_erase = 1;                                              //擦除一个段

                           //这清除只读位以允许写入数据闪存。

    -                                             DecRegs.FLASHILOCK.ALL = 0x42DC157E;//解锁闪存写入

    +                                            DecRegs.FLASHILOCK.ALL = dflash_key;//解锁闪存写入

    //                                          DecRegs.MFBALR2.bit.block_size =2;

    //                                          DecRegs.MFBALR2.bit.address = 0x22;

    @@-181、7 +181、7 @@ void software_interrupt (uint32 arg1、uint32 arg2、uint32 arg3、uint8 swi_number)

                                                  while (byte_counter > 0)

                                                  {

                                                                  uint32  temp_word =* src_ptr++;

    -                                                             DecRegs.FLASHILOCK.ALL = 0x42DC157E;//解锁闪存写入

    +                                                            DecRegs.FLASHILOCK.ALL = dflash_key;//解锁闪存写入

                                                                  //将 temp 字写入 DFlash。

                                                                  *目标_ptr = temp_word;

    网址为 variables.h

    +extern int32 dflash_key;

      如果要存储默认值 all 或对数据闪存执行其他写入操作、则需要对密钥执行块写入- 0x42DC157E。   

    我们的客户通常遵循的最佳做法是修复电路板布局和电源噪声、以免问题发生、并进行代码修复。