Exemplo n.º 1
0
//-----------------------------------------------------------------------------------------------------------------------------
u8 SaveCycleGPS(u32 cyclewr, u8 *content , u16 saveLen)
{
    /*
           //old  NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
           NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 128 Bytes ;  1page= 4Records   1Sector=8Page=32Records
    */
    u32  pageoffset = 0; //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr = 0; //页内 地址偏移
    //	u8   reg[1]={0};
    u8   rd_back[128];
    u16  i = 0, retry = 0;

    //----------------------------------------------------------------------------------------------
    //   1. Judge  Whether  needs to Erase page
    pageoffset = (u32)(cycle_write >> 2);            // 计算出 Page 偏移  除以4 (每个page能放4条记录)
    InPageoffset = cycle_write - (u32)(pageoffset << 2); // 计算出 页内偏移地址
    InPageAddr = (u16)(InPageoffset << 7);       // 计算出页内 字节   乘以 128 (每个记录128个字节)
    if(((pageoffset % 8) == 0) && (InPageoffset == 0)) // 判断是否需要擦除Sector  被移除到下一个Sector  1Sector=8Page
    {
        WatchDog_Feed();
        SST25V_SectorErase_4KByte((pageoffset + CycleStart_offset)*PageSIZE);    // erase Sector
        DF_delay_ms(60);
        if(GB19056.workstate == 0)
            rt_kprintf("\r\n Erase Cycle Sector : %d\r\n", (pageoffset >> 3));
    }
Exemplo n.º 2
0
//-----------------------------------------------------------------------------------------------------------------------------
u8 SaveCycleGPS(u32 cyclewr,u8 *content ,u16 saveLen) 
{
  /*
     NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
  */
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr=0;   //页内 地址偏移 
	u8   reg[1]={0};
	u8   rd_back[40];
	u16  i=0,retry=0;

  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page 
  
     pageoffset=(u32)(cycle_write>>4);                // 计算出 Page 偏移  除以16  
     InPageoffset=cycle_write-(u32)(pageoffset<<4);   // 计算出 页内偏移地址 
     InPageAddr=(u16)(InPageoffset<<5);           // 计算出页内 字节   乘以 32 (每个记录32个字节)
     if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Sector  被移除到下一个Sector  1Sector=8Page  
     {
        WatchDog_Feed();
		SST25V_SectorErase_4KByte((pageoffset+CycleStart_offset)*PageSIZE);      // erase Sector		
		DF_delay_ms(20); 
	    rt_kprintf("\r\n Erase Cycle Sector : %d\r\n",(pageoffset>>3));       
	 }
Exemplo n.º 3
0
void DF_Erase(void)
{
    u16 i = 0;
    /*
         1. 从0x1000    4K  开始擦除28K     7 sector
         2.擦除56个扇区   7 个32k block
      */

    DF_TAKE;
    rt_kprintf("\r\n  ISP erase start\r\n");
    //  -----erase        28 K   area  -------------
    for(i = 0; i < 7; i++) // 7  secotor
    {
        WatchDog_Feed();
        SST25V_SectorErase_4KByte(ISP_StartArea + i * 0x1000);
        DF_delay_ms(220);
        WatchDog_Feed();
    }
    //----------- erase  32k
    for(i = 0; i < 7; i++) // 56sector
    {
        WatchDog_Feed();
        SST25V_BlockErase_32KByte(0x8000 + i * 0x8000);
        DF_delay_ms(800);
        WatchDog_Feed();
    }
    DF_RELEASE;
    rt_kprintf("\r\n  ISP erase OK DFReady\r\n");
}
Exemplo n.º 4
0
void DF_WriteFlash(u16 page_counter, u16 page_offset, u8 *p, u16 length) //512bytes 一个单位
{
    u16 i = 0, j = 0, k = 0; //写补报

    for(i = 0; i < 8; i++)
    {
        DF_ReadFlash((8 * (page_counter / 8)) + i, 0, SectorBuf_save[i], DFBakSize); //PageSIZE
    }

    SST25V_SectorErase_4KByte((8 * ((u32)page_counter / 8))*PageSIZE);
    DF_delay_ms(100);
    for(j = 0; j < 8; j++)
    {
        if(j == (page_counter % 8))
        {
            for(i = 0; i < length; i++)
            {
                SectorBuf_save[j][page_offset + i] = *p;
                p++;
            }
        }
        for(k = 0; k < DFBakSize; k++)
        {
            SST25V_ByteWrite(SectorBuf_save[j][k], ((8 * (page_counter / 8)) + j)*PageSIZE + k);
        }
    }
    DF_delay_ms(20);
}
Exemplo n.º 5
0
/*
      note:  使用前提是   addr+len 不允许超过  本扇区
*/
u8  SST25V_OneSector_Write(u8 *p,  u32  addr,  u32 len)
{ 
   u32   SectorStartAddr=addr&0xFFFFFFFFFFFFF000,i=0;  //  获取起始扇区的起始地址
   u32   insector_offset=addr&0xFFF; // 取扇区内偏移地址 



      //  1.  get   4096 to buf
       WatchDog_Feed();
       SST25V_BufferRead(OneSectorReg,SectorStartAddr,4096);
       WatchDog_Feed();
	   
	  // rt_kprintf("\r\n insector_offset=0x%X  \r\n",insector_offset);   
	   //OutPrint_HEX("\r\n 读取前",OneSectorReg,4096);  
       delay_ms(35);
       WatchDog_Feed();
	  
	  // 2. 把更新的内容给填进去
	   memcpy(OneSectorReg+insector_offset,p,len);  

	  // 3.  erase  Sector
	  	 SST25V_SectorErase_4KByte(SectorStartAddr);	
	     WatchDog_Feed();
	     DF_delay_ms(130); 	 
		// OutPrint_HEX("\r\n 擦完写前",OneSectorReg,4096);  
	  // 4.  write  buf  to  DF
	  // SST25V_strWrite(OneSectorReg,SectorStartAddr,4096);
	   SST25V_BufferWrite(OneSectorReg,SectorStartAddr,4096); 
	   DF_delay_ms(130);    
      

         //---------------- add   for  debug----------------       
	    WatchDog_Feed();
	    SST25V_BufferRead(reg_4096,SectorStartAddr,4096); 
		DF_delay_ms(50);    
      
	     //  rt_thread_delay(2);	  
		//   OutPrint_HEX("\r\n 读取后",OneSectorReg,4096);     
		   for(i=0;i<4096;i++)
		   {
		       if(OneSectorReg[i]!=reg_4096[i])
		       	{
		       	    rt_kprintf("\r\n Error at =0x%X \r\n",i);   
	                break;
		       	}
		   }	   
	 
       //----------- debug --------------------------------------------------  
					
		   WatchDog_Feed();
	      delay_ms(5);
	  //--------------------------------
	  return  true;
}
Exemplo n.º 6
0
void DF_EraseAppFile_Area(void)
{
    u16 i=0;
      /*
           1.先擦除0扇区   
           2.读出page48内容并将其写到第0扇区的page 0 
           3.读出page49内容并将其写到第0扇区的page 0
           4.擦除 6-38扇区 即 48page 到 304 page
           5.以后有数据过来就直接写入,不需要再擦除了 
        */
	
        SST25V_SectorErase_4KByte(0x0);
 	 DF_delay_ms(5);   
	 WatchDog_Feed();
       DF_ReadFlash(48,0,SST25Temp,PageSIZE);
	//DF_delay_ms(1);	 
        DF_WriteFlashDirect(0,0,SST25Temp,PageSIZE);
	 DF_delay_ms(1);	
	 WatchDog_Feed();
        DF_ReadFlash(49,0,SST25Temp,PageSIZE);
        DF_WriteFlashDirect(1,0,SST25Temp,PageSIZE);
	 DF_delay_ms(1);		
        for(i=6;i<134;i++)    // 要求是512K -> 128  erase sector 6-134      128K ->  32   
        {
            WatchDog_Feed();
            SST25V_SectorErase_4KByte(((u32)i*4096));
	     DF_delay_ms(5); 
	     WatchDog_Feed();		
        }
        DF_ReadFlash(0,0,SST25Temp,PageSIZE);
        DF_WriteFlashDirect(48,0,SST25Temp,PageSIZE); 
	 WatchDog_Feed();	
	 DF_delay_ms(1);		
        DF_ReadFlash(1,0,SST25Temp,PageSIZE);
	 WatchDog_Feed(); 	
        DF_WriteFlashDirect(49,0,SST25Temp,PageSIZE);
        rt_kprintf("\r\nSST25Ready\r\n"); 

}
Exemplo n.º 7
0
void DF_WriteFlashSector(u16 page_counter, u16 page_offset, u8 *p, u16 length) //512bytes 直接存储
{
    u16 i = 0;

    // 要擦除所在的sector(要求pagecounter 为所在sector的第一个page) ,然后该sector的第一个page写
    SST25V_SectorErase_4KByte((8 * ((u32)page_counter / 8))*PageSIZE);
    DF_delay_ms(200);

    for(i = 0; i < length; i++)
    {
        SST25V_ByteWrite(*p, page_counter * 512 + i + page_offset);
        p++;
    }
    DF_delay_ms(30);

}
Exemplo n.º 8
0
u8 Save_PerSecContent(u32 In_wr,u8 *content ,u16 saveLen)
{
	/*
	   NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
	*/
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr=0;   //页内 地址偏移 
	u8   reg[1]={0};
  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page 
  
     pageoffset=(u32)(In_wr/7);                // 计算出 Page 偏移  除以7 
     InPageoffset=In_wr-(u32)(pageoffset*7);   // 计算出 页内偏移地址 
     InPageAddr=(u16)(InPageoffset*70);           // 计算出页内 字节   乘以 70 (每个记录70个字节)    
     if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Block  被移除到下一个Block  1Block=8Page  
     {
	  SST25V_SectorErase_4KByte((pageoffset+AvrgSpdSec_offset)*PageSIZE);	  // erase Sector 
	  mDelaymS(50);   
	  // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6));   
	 }
  //	   2. Filter write  area    
      DF_ReadFlash(pageoffset+AvrgSpdSec_offset,InPageAddr,reg,1);
      DF_delay_us(10);
	   if(reg[0]!=0xff)  // 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
	   	{
	   	  In_wr++; 
		  AvrgSpdPerSec_write++;		  
		  if(AvrgSpdPerSec_write>=Max_SPDerSec) 
			   AvrgSpdPerSec_write=0;   
//		  rt_kprintf("\r\n    *******  每秒钟速度 写区域 Write area : %d  In_wr=%d  is   Dirity!  \r\n",AvrgSpdPerSec_write,In_wr);  
          //--------------------------
		  	 return false;
	   	}       
  //   3. Write Record Content 
     DF_WriteFlashDirect(pageoffset+AvrgSpdSec_offset,InPageAddr,content,saveLen);  //   写入信息
     DF_delay_ms(10);
	// rt_kprintf("\r\n Write PerMit Starpageoffset=%d  PageOffset= %d ,  InPageAddr= %d \r\n",AverageSpdStart_offset,pageoffset,InPageoffset); 
     return true; 
  //-------------------------------------------------------------------------------------------- 
}
Exemplo n.º 9
0
//-----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------
u8 Save_DrvRecoder(u32 In_write,u8 *content ,u16 saveLen) 
{
	/*
	   NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
	*/
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移 
    u16  InPageAddr=0;   //页内 地址偏移 
	u8   reg[1]={0};
  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page 
  
     pageoffset=(u32)(In_write>>1);                // 计算出 Page 偏移  除以2  
     InPageoffset=In_write-(u32)(pageoffset<<1);   // 计算出 页内偏移地址 
     InPageAddr=(u16)(InPageoffset<<8);           // 计算出页内 字节   乘以 256 (每个记录256个字节)  206(content)+1(FCS)
     if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Block  被移除到下一个Sector  1Sector=8 Page  
     {
        SST25V_SectorErase_4KByte((pageoffset+VehicleRecStart_offset)*PageSIZE);      // erase Sector	
        DF_delay_ms(70);
		// rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6));   
	 }
  //	   2. Filter write  area    
        DF_ReadFlash(pageoffset+VehicleRecStart_offset,InPageAddr,reg,1); 
	   if(reg[0]!=0xff)  // 如果要写入的区域 dirty  ,则地址跳到下一个
	   	{
          In_write++;
		  Recorder_write++;		  
		  if(Recorder_write>=Max_RecoderNum)  
			   Recorder_write=0;  
		 // rt_kprintf("\r\n    *******   行车记录仪写区域 Write area : %d   is   Dirity!  \r\n",In_write);  
		  return false;
	   	}       
  //   3. Write Record Content 
     DF_WriteFlashDirect(pageoffset+VehicleRecStart_offset,InPageAddr,content,saveLen);  //   写入信息
     DF_delay_ms(8); 
	// rt_kprintf("\r\n DrvRec Starpageoffset=%d  PageOffset= %d ,  InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); 
		return true; 
  //-------------------------------------------------------------------------------------------- 
}
Exemplo n.º 10
0
u8 Save_MintPosition(u32 In_write,u8 *content ,u16 saveLen)
{    // 记录单位小时内每分钟的位置信息
	/*
	   NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
	*/
    u32  pageoffset=0;   //Page 偏移
	u8   reg[1]={0};
  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page     每条记录512个字节
  
     pageoffset=In_write;                // 计算出 Page 偏移  除以4  
        // 计算出 页内偏移地址 0
        // 计算出页内 字节   乘以 512 (每个记录512个字节)  485(content)+1(FCS)
     if((pageoffset%8)==0)  // 判断是否需要擦除Block  被移除到下一个Block  1Block=8 Page  
     {
	  SST25V_SectorErase_4KByte((pageoffset+AvrgMintPosit_offset)*PageSIZE);	  // erase Sector 
	  DF_delay_ms(50);
	  // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6));   
	 }
  //	   2. Filter write  area    
       DF_ReadFlash(pageoffset+AvrgMintPosit_offset,0,reg,1); 
	   if(reg[0]!=0xff)  // 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
	   	{
          In_write++;
		  AvrgMintPosit_write++;		  
		  if(AvrgMintPosit_write>=Max_MintPos) 
			   AvrgMintPosit_write=0;  
		 // rt_kprintf("\r\n    *******   行车记录仪写区域 Write area : %d   is   Dirity!  \r\n",In_write);  
		  //----------------------------
		  	return  false;
	   	}       
  //   3. Write Record Content 
       DF_WriteFlashDirect(pageoffset+AvrgMintPosit_offset,0,content,saveLen);  //   写入信息
       DF_delay_ms(10);
	// rt_kprintf("\r\n DrvRec Starpageoffset=%d  PageOffset= %d ,  InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); 
     return true; 
  //-------------------------------------------------------------------------------------------- 
}
Exemplo n.º 11
0
u8 Rx_data_save(u8 *str)
{
	u8 temp[4];
	u8 trans[256];
	u8 len =0;
	u32 i= 0;
	u32 test_head=0;
	memset(trans,0,256);
	memset(temp,0,4);
	
	for(i=0;i<16*512;i=i+256)
	{
	    if(i>=8*512)
	    {
	    	//下半部分显示时候显示上半部分
	    	SST25V_SectorErase_4KByte((8*(((u32)DF_BD_data_rx+8)/8))*PageSIZE);
			//Erase_flag =Top_15;
	    }
		if(i>=16*512)//保证随时都有可以写的空间
		{
		    i=0;//从新遍历
			//擦除上半部分显示下半部分
			SST25V_SectorErase_4KByte((8*((u32)DF_BD_data_rx/8))*PageSIZE);	
			//Erase_flag = After_15;
			rt_kprintf("erase the 8016-8023\r\n");
		}
		DF_ReadFlash(DF_BD_data_rx,i,temp,4);
		
		test_head = (temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3];
		//rt_kprintf(" %d--%d--%d--%d--%d--%x\r\n",temp[0],temp[1],temp[2],temp[3],i,test_head);
		if(test_head==Max_value)
		{
	
			test_head = find_max_id(DF_BD_data_rx)+1;//最大ID自加1
		    //找出上一个ID值
	    	trans[0]=test_head>>24;
			trans[1]=(test_head>>16)&0xff;
			trans[2]=(test_head>>8)&0xff;
			trans[3]=test_head&0xff;
			len =(((str[16]<<8)+str[17])/8);
			//rt_kprintf("收到电文长度---%d",len);
			len =len+8;//根据协议加上7个字节(信息类别到电文长度)
		    trans[4] =len+4+6+1;//+4是加上计数+1长度+是时间长度=总长

			if(UDP_dataPacket_flag==0x02)
			{
				trans[5]=Temp_Gps_Gprs.Date[0];
				trans[6]=Temp_Gps_Gprs.Date[1];
				trans[7]=Temp_Gps_Gprs.Date[2]; 

				trans[8]=Temp_Gps_Gprs.Time[0]; 
				trans[9]=Temp_Gps_Gprs.Time[1]; 
				trans[10]=Temp_Gps_Gprs.Time[2]; 
			}
			else
			{
				time_now=Get_RTC(); 

				trans[5]= time_now.year;
				trans[6]= time_now.month;
				trans[7]= time_now.day;

				trans[8]= time_now.hour;
				trans[9]= time_now.min;
				trans[10]= time_now.sec;
			}
			/*
		    trans[5]=(((Gps_Gprs.Date[0])/10)<<4)+((Gps_Gprs.Date[0])%10);		
			trans[6]=((Gps_Gprs.Date[1]/10)<<4)+(Gps_Gprs.Date[1]%10); 
			trans[7]=((Gps_Gprs.Date[2]/10)<<4)+(Gps_Gprs.Date[2]%10);
			trans[8]=((Gps_Gprs.Time[0]/10)<<4)+(Gps_Gprs.Time[0]%10);
			trans[9]=((Gps_Gprs.Time[1]/10)<<4)+(Gps_Gprs.Time[1]%10);
			trans[10]=((Gps_Gprs.Time[2]/10)<<4)+(Gps_Gprs.Time[2]%10);	
			*/
			OutPrint_HEX("Time", trans+5, 6);//wxg_test
		    if(trans[4]>=256)
		    {
		    rt_kprintf("-------接收数据有误-----\r\n");
			return RT_ERROR;
		    }
			memcpy(trans+11,str+10,len);//将信息内容拷贝
			
			DF_WriteFlashDirect(DF_BD_data_rx,i,trans,trans[4]);
			//OutPrint_HEX("saved", trans, trans[4]);//wxg_test
			memset(temp,0,4);//清零
			return RT_EOK;
		}
			
	}
Exemplo n.º 12
0
u8  Common_WriteContent(u32 In_write,u8 *content ,u16 saveLen, u8 Type) 
{
  //-----------------------------------------------------
  u8     reg[1];
  //u8   regStr[25];   
  //-----------------------------------------------------
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr=0;   //页内 地址偏移 
	u32  Start_offset=0; 

   //--------------------------------------------------	
    //memset(regStr,0,sizeof(regStr)); 
  //  1.   Classify
    switch(Type)
    {
	
		case TYPE_TiredDrvAdd:
							 Start_offset=TiredDrvStart_offset;
							// memcpy(regStr,"疲劳驾驶",25);
							 break;
		case TYPE_ExpSpdAdd:
							 Start_offset=ExpSpdStart_offset;
							// memcpy(regStr,"超速报警",25);
							 break; 					 
		case TYPE_ErrorLogAdd:
							 Start_offset=AbNormalStart_offset;
							 //memcpy(regStr,"异常LOG",25); 
							 break; 
		case TYPE_LogInAdd:
							 Start_offset=LogIn_offset; 
							// memcpy(regStr,"登录记录",25);   
							 break; 
		case TYPE_SettingChgAdd:
							 Start_offset=SettingChg_offset;    
							 //memcpy(regStr,"参数修改",25);       
							 break; 					 
		default :
							 return false;		  					 
    }
	//----------------------------------------------------------------------------------------------
	//	 2. caculate address 
	 
		pageoffset=(u32)(In_write>>4);				 // 计算出 Page 偏移  除以16  
		InPageoffset=In_write-(u32)(pageoffset<<4);	 // 计算出 页内偏移地址 
		InPageAddr=(u16)(InPageoffset<<5);			 // 计算出页内 字节   乘以 32 (每个记录32个字节)
		if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Block  被移除到下一个Block	1Block=8Page  
		{
        SST25V_SectorErase_4KByte((pageoffset+Start_offset)*PageSIZE);      // erase Sector	
        DF_delay_ms(70);
		//  rt_kprintf("\r\n Common --- Erase Cycle Block : %d\r\n",(pageoffset>>6));    
		}
	 // 	  2. Filter write  area    
		DF_ReadFlash(pageoffset+Start_offset,InPageAddr,reg,1); 
		  if(reg[0]!=0xff)	// 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
		   {
			 In_write++;
			 if(In_write>=Max_CommonNum)
				  In_write=0;  
			         // rt_kprintf("\r\n	 *******   Common 写区域 Write area : %d	is	 Dirity!  \r\n",In_write);  
				 return false;
		   }	   
	 //   3. Write Record Content 
        DF_WriteFlashDirect(pageoffset+Start_offset,InPageAddr,content,saveLen);  //   写入信息
		DF_delay_ms(10);
		//rt_kprintf("\r\n Common Starpageoffset=%d	PageOffset= %d ,  InPageAddr= %d  TYPE= %s \r\n",CycleStart_offset,pageoffset,InPageoffset,regStr);  

     //   4. end  
        switch(Type) 
    {
	
		case TYPE_TiredDrvAdd:							 
							 TiredDrv_write=In_write;
							 break;
		case TYPE_ExpSpdAdd:
							 ExpSpdRec_write=In_write;
							 break; 					 
		case TYPE_AvrgSpdAdd:
							 AvrgSpdPerMin_write=In_write;
							 break;
		case TYPE_ErrorLogAdd:
							 ErrorLog_write=In_write;  
							 break; 
		case TYPE_LogInAdd:
							 Login_write=In_write;
							 break; 
		case TYPE_SettingChgAdd:
							 Settingchg_write=In_write;     
							 break; 					 
		default :
							 return false;	 						 
    }

	return true; 
	     	     
}
Exemplo n.º 13
0
//-----------------------------------------------------------------------------------------------------------
u8  Common_WriteContent(u32 In_write, u8 *content , u16 saveLen, u8 Type)
{
    //-----------------------------------------------------
    u8     reg[1];
    //u8   regStr[25];
    //-----------------------------------------------------
    u32  pageoffset = 0; //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr = 0; //页内 地址偏移
    u32  Start_offset = 0;

    //--------------------------------------------------
    //memset(regStr,0,sizeof(regStr));
    //  1.   Classify
    switch(Type)
    {

    case TYPE_ExpSpdAdd:
        Start_offset = ExpSpdStart_offset;
        // memcpy(regStr,"超速报警",25);
        break;
    default :
        return false;
    }
    //----------------------------------------------------------------------------------------------
    //	 2. caculate address

    pageoffset = (u32)(In_write >> 4);				 // 计算出 Page 偏移  除以16
    InPageoffset = In_write - (u32)(pageoffset << 4);	 // 计算出 页内偏移地址
    InPageAddr = (u16)(InPageoffset << 5);			 // 计算出页内 字节   乘以 32 (每个记录32个字节)
    if(((pageoffset % 8) == 0) && (InPageoffset == 0)) // 判断是否需要擦除Block  被移除到下一个Block	1Block=8Page
    {
        SST25V_SectorErase_4KByte((pageoffset + Start_offset)*PageSIZE);    // erase Sector
        DF_delay_ms(70);
    }
    // 	  2. Filter write  area
    DF_ReadFlash(pageoffset + Start_offset, InPageAddr, reg, 1);
    if(reg[0] != 0xff)	// 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
    {
        In_write++;
        if(In_write >= Max_CommonNum)
            In_write = 0;
        return false;
    }
    //   3. Write Record Content
    DF_WriteFlashDirect(pageoffset + Start_offset, InPageAddr, content, saveLen); //   写入信息
    DF_delay_ms(10);

    //   4. end
    switch(Type)
    {

    case TYPE_ExpSpdAdd:
        ExpSpdRec_write = In_write;
        break;
    default :
        return false;
    }

    return true;

}