lm4f230h5qr EEPROM数据容易丢失的问题,请解答,谢谢



技术支持工程师你们好,我用的是LM4F230H5QR这个片子,用到内部EEPROM用来存放用户设置的数据,现在碰到问题,在重复开机多次的情况下,EEPROM数据会丢失.

我附上主函数这部分源程序:

我把程序中很多子函数都屏蔽掉,只用了显示和按键检测跟读写EEPROM的子函数,然后就频繁的开关机.目的就是验证到底是函数调用的部分影响到了EEPROM还是EEPROM本身的问题.现在情况是,在不确定的是次数时候EEPROM会丢失.

 

//****************************************************************************
//Main Routing
//
//*****************************************************************************
 
int main(void)
{
   Various_Init();
    if(REVISION_IS_A2)
    {
     SysCtlLDOSet(SYSCTL_LDO_2_75V);
    }
    SysCtlClockSet(SYSCTL_SYSDIV_3| SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);   
   Led_Init();                          //LED4 LED0(x) LED1 LED2 LED3
    Uart_Init();
  SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0);
  EEPROMInit();
    Key_Init();
  
  Learnned_Flags_Init();                            //read the learnned flags
  Nos_Cnt_Start();
   Beep_Init();
  Pressure_Set_Init();                              //read the setting data from EEPROM
 // Pressure_Measure_Init();
  Pressure_Unit_Init();                             //read the unit for pressure from EEPROM
  ID_Init();                                        //read the learned ID
 // Temperature_Measure_Init();    
  Temperature_Unit_Init();                          //read the unit for temperature from EEPROM
 // Get_NOS_Leaking_Alarm();
  //  Get_Other_Alarm();
  
  Kitronix320x240x16_SSD2119Init();
  GrContextInit(&sContext,&g_sKitronix320x240x16_SSD2119);
  Clean_Screen_With_Nothing(); 
  GrContextFontSet(&sContext, &g_sFontCmss20b);  //设置字体
  GrContextForegroundSet(&sContext,ClrWhite);
  
   Timer_Init(50000,60000);   //50000    //50MHZ frequency,per instruction time 0.02us so,50000x0.02=1ms
   TimerEnable(TIMER0_BASE,TIMER_A);       //LED4显示定时器在工作
  
   
//////////////////////////////////////////////////////////////////
  
 ////    Power_On_Display_Tesee();             //power on display icon
 ////   Delay_10ms(1000);
//    Clean_Screen_With_Nothing(); 
//    GrImageDraw(&sContext,g_pucCar,POS_CAR_X,POS_CAR_Y); //display car icon
//     Power_On_Display_Frame();
 //  PWM_Init();                             //LED2显示PWM在工作
  
while(1)
{  
 ////Pressure_Unit_Init();
 ////Temperature_Unit_Init(); 
 if(bfrs_main_flag==0)
 {  
 Clean_Screen_With_Nothing();
 GrImageDraw(&sContext,g_pucCar,POS_CAR_X,POS_CAR_Y); //display car icon
  Power_On_Display_Frame();
 Data2Disbuf();
  Display_Disbuf();
  GrFlush(&sContext);
  bfrs_main_flag=1;
  }

  
   EEPROMRead(read,0x33,0x08);
  write_temp=read[0];
   LongNumber2String(disbuf,write_temp);
  GrStringDraw(&sContext,disbuf,100,1,120,0);

  write_temp=read[1];
   LongNumber2String(disbuf,write_temp);
  GrStringDraw(&sContext,disbuf,100,1,140,0);
 ////Pressure_Set_Init();
  Key_Scan();
 ////ID_Init();
 
 ////Receive_Data();
 GrContextFontSet(&sContext, &g_sFontCmss20b);  //设置字体
  GrStringDraw(&sContext,RxBuf,30,0,130,0);
 
  if(g_uckeyvalue==OK)
   {
   EEPROMProgram(write,0x33,0x08);
  write[0]=0x01;
  EEPROMProgram(write,EE_ADD_FLAG_UNIT_PRESSURE,0x04);
  g_uckeyvalue=0;
  }

 if(g_uckeyvalue==SET)
  {
  ucloop_m_flag=1;
  ucfrs_m_enter_flg=0;
 }
 if(g_uckeyvalue==UP)
  {
  g_uckeyvalue=0;
  uctemp_m_UL++;
  ulpressure_m_UL++;
 }
 if(g_uckeyvalue==DOWN)
  {
  g_uckeyvalue=0;
  uctemp_m_UL--;
  ulpressure_m_UL--;
 }
 
 //// Manue_Routing();
//// Alarm_Routing();
 
   
 if((bflag_ul_nos==1)||(bflag_ul_nos==1)||(bflag_ul_nos==1)||(bflag_ul_nos==1)||(bflag_ul_nos==1))
 {
  UARTPutString("NOS WARNING!!!",UART1_BASE);  
   UARTCharPut(UART1_BASE,'\n'); 
  }

 

很急,请技术支持工程师给予帮助,到底怎么处理这个问题,谢谢!

  • EEPROM的硬件连接有没有问题? 

     

    我用的24AA1025+4F230 ,调试正常。

  • 我用的是内部EEPROM,不存在连接问题

  • TI的技术工程师呢?回复一下好吗?

  • 在回答这个问题前,我想我们先来分清一下什么是数据丢失?基本上,当EEPROM中的数据不是你既定的值时,有两种可能:

    1)写入失败

    2)写入成功后丢失。

    如果当你的EEPROM写入成功后,在之后都没有任何写入操作的情况下,不断重复上下电试验,随后发现一部分的数据异常改变,这叫“数据丢失”

    如果当你在程序中有规律的对EEPROM进行写操作,并在这个过程中,随机或者不断的进行上下电试验,随后发现一部分的数据异常改变,我不能说100%,但是基本上可以把这类问题归为“写入失败”。

    请详细阅读任何一份TI的或者非TI的MCU的数据手册,在任何带有内部EEPROM的MCU的电气特性中一定会有一项技术指标是用来说明完成一次EEPROM的写操作需要多长时间。虽然EEPROM不需要像Flash那样按片擦除,但是每个字节的写入都是需要先擦除后写入的。一般这个擦除的时间是在几个ms到几十个ms不等的时间内。那么在这个时间内如果你的系统断电了。那么神仙也保证不了你这次在擦除后才能进行的写操作会写成功。。。

    所以,如果你的系统真的是需要在EEPROM写入的过程中不断的发生掉电的情况,那么你的系统需要非常强壮的冗余设计来保证你的EEPROM在写入失败的时候仍然有备用的值可用。

  • 另外你现在用的是A1版本还是A3版本的样片。A1版本的样片在EEPROM写操作时产生复位有严格限制,你要查看一下errata sheet.