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.

[参考译文] MSP430G2452:写入信息 C 时出现问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1168241/msp430g2452-problem-writing-to-info-c

器件型号:MSP430G2452

MSP 团队、

此客户正在 MSP430G2452上的信息 C 存储器空间中存储一些校准数据。  首先、它们将旧数据复制到 RAM、然后通过将所有0写入一个段来测试存储器。  他们发现,5%的电路板在读回0时出现故障。  (某些值仍然为1)。  

他们在同一个板上重新测试、并且将继续失败。

您能否查看下面的代码、看看它是否看起来不错?  他们插入的延迟是否不够,或者是否在错误的位置?

 

   volatile uint16_t * Flash_ptr;    //闪存指针
    volatile uint16_t i;
    volatile uint16_t backup[INFO_C_SIZE];
    uint16_t Backup_Calib、Backup_IR_POWER;

 

       //擦除前备份信息 C 内存
    Flash_ptr =(uint16_t *) 0x1040;        //初始化闪存指针

 

       //测试前备份信息 C 内存
    Flash_ptr =(uint16_t *) 0x1040;        //初始化闪存指针
    Backup_Calib =*(Flash_PTR + TRIGGER_value_offset);
    backup_IR_power =*(Flash_ptr + IR_POWER_value_offset);

 

   //初始化0的数组
    (i=0;<INFO_C_SIZE; i++ )
        Backup[i]= 0;

 

   //启动段擦除操作
    FCTL1 = FWKEY + ERASE;                 //设置擦除位
    FCTL3 = FWKEY;                               //清除锁定位
    *闪存_ptr = 0;                                  //虚拟写入以擦除闪存段
    FCTL1 = FWKEY + WRT;                   //为写入操作设置 WRT 位

 

   //写入具有0数组的信息 C 内存块
    Flash_ptr =(uint16_t *) 0x1040;        //再次初始化闪存指针
    (i=0;<INFO_C_SIZE; i++ )
        *闪存_PTR++=备份[i];

 

   FCTL1 = FWKEY;                                //清除 WRT 位
    FCTL3 = FWKEY + LOCK;                  //设置 LOCK 位

 

   wAclkIntrvlTmr_t0 (250);                     //确保每个数据表的写入之间的最小延迟(每个计数83.333us)

 

   //读回 INFO C MEMORY 并验证所有地址都是0
    (i=0;<INFO_C_SIZE; i++ ){
        if (0!=(READ_SegC_TrigVal (I)))
            返回(失败);   //检测到内存错误,退出并提醒用户
    }

 

   //启动段擦除操作(默认为0xFFFF)
    FCTL1 = FWKEY + ERASE;                 //设置擦除位
    FCTL3 = FWKEY;                               //清除锁定位
    *闪存_ptr = 0;                                  //虚拟写入以擦除闪存段
    FCTL1 = FWKEY + WRT;                   //为写入操作设置 WRT 位

 

   FCTL1 = FWKEY;                                //清除 WRT 位
    FCTL3 = FWKEY + LOCK;                  //设置 LOCK 位

 

   wAclkIntrvlTmr_t0 (250);                     //确保每个数据表的写入之间的最小延迟(每个计数83.333us)

 

   //读回信息 C 内存并验证所有地址都为1
    (i=0;<INFO_C_SIZE; i++ ){
        if (0xFFFF!=(READ_SegC_TrigVal (I)))
            返回(失败);   //检测到内存错误,退出并提醒用户
    }

 

   //启动段擦除操作(默认为0xFFFF)
    FCTL1 = FWKEY + ERASE;                 //设置擦除位
    FCTL3 = FWKEY;                               //清除锁定位
    *闪存_ptr = 0;                                  //虚拟写入以擦除闪存段
    FCTL1 = FWKEY + WRT;                   //为写入操作设置 WRT 位

 

   //将信息 C 内存块写入数组
    Flash_ptr =(uint16_t *) 0x1040;        //再次初始化闪存指针

 

   //如果内存正常,则恢复备份参数
    *(Flash_ptr + TRIGGER_Value_offset)= Backup_Calib;
    *(Flash_ptr + IR_POWER_value_offset)= Backup_IR_power;

 

   FCTL1 = FWKEY;                                //清除 WRT 位
    FCTL3 = FWKEY + LOCK;                  //设置 LOCK 位

 

   wAclkIntrvlTmr_t0 (250);                     //确保每个数据表的写入之间的最小延迟(每个计数83.333us)

 

   返回(成功);

谢谢、

Darren

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

    什么是 Vcc? 如文档中所述、如果这太低、则擦除和写入操作将不可靠。

    我看到闪存时序发生器的配置没有变化。 PUC 后的默认值为 MCLK/3、因此请验证这是否在所需的限制范围内。

    我看到有关写入之间所需的最小延迟的注释(提供的延迟为~20ms)。  我从未在任何地方看到过这种情况。

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

    VCC 为3.0V、远高于2.2V。  它来自单独电路板上的150mA LDO、这应该足够了。  我将要求他们实际测量电压。

    我将了解他们的 MCLK 是什么。

    谢谢、
    Darren

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

    它们应遵循 G2xx 参考手册或 TI 闪存写入示例、并测试 FCTL 忙状态以进行擦除/写入。

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

    谢谢。  FCTL 忙将会很有帮助并且有意义。  我在用户指南中看到它、但在外设 C 代码示例中看不到它。

    MCLK 设置为8MHz、因此我认为这是问题所在。  如果 FN = 2、则8/(2+1)= 2.6MHz、这超出了可接受的 fFTG 范围。

    Darren

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

    除非您正在从 RAM 执行代码、否则检查 BUSY 是无用的。

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

    您好 Darren、

    在有机会时、将您的调查结果发回。

    此致、

    Evan