//----------------------------------------------------------------------------------------------------------------------------- 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)); }
//----------------------------------------------------------------------------------------------------------------------------- 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)); }
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"); }
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); }
/* 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; }
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"); }
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); }
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; //-------------------------------------------------------------------------------------------- }
//----------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------- 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; //-------------------------------------------------------------------------------------------- }
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; //-------------------------------------------------------------------------------------------- }
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; } }
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; }
//----------------------------------------------------------------------------------------------------------- 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; }