在做MSP430I2x系列程序flash数据存储时,写入数据和读出数据不一致。新的单片机写入一次后,读出来的数据是正确的,再次写入新的数据后,读出来就不正确了!
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.
在做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使用的。根据链接说的原理,我再修正软件测试一下看。