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.

MSP430I2031: flash写读数据不一致

Part Number: MSP430I2031


在做MSP430I2x系列程序flash数据存储时,写入数据和读出数据不一致。新的单片机写入一次后,读出来的数据是正确的,再次写入新的数据后,读出来就不正确了!

  • 写入数据和读出数据不一致

    能否详细说明一下或者给出相关截图?

    另外建议试一下TI例程: https://dev.ti.com/tirex/explore/node?node=AI38OU3hctoOuvLzP83N5A__IOGqZri__LATEST 

  • void write_flash(void)
    {
    unsigned char *Flash_ptr; // Flash pointer
    unsigned char i;

    Flash_ptr = (unsigned char *)0x1080; // Initialize Flash pointer

    _DINT();
    WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
    FCTL2 = FWKEY | FSSEL_1 | FN1 | FN3 | FN5; // MCLK/42 for Flash Timing Generator

    if(FCTL3 & LOCKSEG) // Test LOCKSEG
    {
    FCTL3 = FWKEY | LOCKSEG; // No, unlock Info Segment,Clear LOCKSEG bit
    //if(FCTL3 & LOCKSEG) // Test LOCKSEG
    //{FCTL3 = FWKEY | LOCKSEG;}
    }
    FCTL1 = FWKEY | WRT; // Set WRT bit for write operation

    for (i = 0; i < 17; i++) // Write value to flash
    {
    //if(FCTL3 & LOCKSEG) // Test LOCKSEG
    //{FCTL3 = FWKEY | LOCKSEG;}
    *Flash_ptr++ =flash_data[i];
    }

    FCTL1 = FWKEY; // Clear WRT bit
    FCTL3 = FWKEY | LOCKSEG; // Set LOCKSEG bit
    _EINT();

    }

    //------------

    void read_flash(void)
    {
    uchar i;
    unsigned char *Flash_ptr; // Flash pointer
    Flash_ptr = (unsigned char *) 0x1080; // Initialize Flash pointer SegA
    for(i=0;i<17;i++)
    {
    flash_data[i]=*Flash_ptr++ ; // Read value from flash
    }
    }

    flash_data[0]第一次写0x17;读出来没有问题,再把flash_data[0]=0x49写入,读出来是0x07

  • 谢谢您的反馈。

    您的程序和我之前给出的链接内的例程基本是相同的功能。建议您将

    _DINT();
    WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
    FCTL2 = FWKEY | FSSEL_1 | FN1 | FN3 | FN5; // MCLK/42 for Flash Timing Generator

    之类的代码放到main函数内

    flash_data[0]第一次写0x17;读出来没有问题,再把flash_data[0]=0x49写入

    您写入后直接使用CCS的View-->Memory Browser 来看一下是否成功写入

    另外如数据表和用户指南中所述,当擦除INFO段时,TLV值将被擦除。

    一般不建议将应用程序数据存储在INFO段中。建议将其存储在MAIN内存段中。

    如果必须使用INFO,请将读出TLV值并将其存储在RAM中,然后将其与应用程序数据一起重新写回。

  • 您好,根据您说的方法,将WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
    FCTL2 = FWKEY | FSSEL_1 | FN1 | FN3 | FN5; // MCLK/42 for Flash Timing Generator调整到main函数内了,写入后查看INFO Memory,与预定的写入值完全不一致,程序中并没有设定擦除程序,查看INFO,TLV值没有问题。按照数据表和用户指南,INFO不需要擦除可直接读写的,问题还是存在。以前用了很多MSP430F系列的都没有出现过这个问题。

  • 请您看一下下面链接的讨论

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/930766/ccs-msp430i2041-msp430-i2041-cannot-write-to-flash 

    我手边没有这个板子,所以不太方便为您测试。

  • Susan Yang:多谢你的帮助,我看了你转发的链接,结合我测试的结果,这块MCU flash读写这块的确不好用,写flash不能写1,只能把1变成0。一旦一个flash字节全部为0,它就会一直保持这种状态,整体改写需要擦除。这和F系列MCU的相差太大,不能直接当EEPROM使用的。根据链接说的原理,我再修正软件测试一下看。

  • 好的,期待您的反馈。

  • 问题已解决,这款mcu的flash操作比较麻烦,产品线不太好。

  • 谢谢反馈。I系列是会和其他系列有一些区别