⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 AT91fr40162的FLASH读写程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//******************************************************************
_BYTE FlashReadWriteSPB(struct StruSPB *spSPB,_BYTE cMode)
{
   	_BYTE j,cRetCode,cChip;
   	_BYTE cCrcCode;
   	_WORD wAdd;
   	_BYTE cpSPBBuf[LENOFSPB];
   	_BYTE cpBuf[LENOFSPB];

   	cChip=0;
   	wAdd=FLASH1_SPB_ADDRESS;
   	if (cMode==ICWRITE) CompressSPB(spSPB,cpSPBBuf);
   	for(j=0;j<2;j++){
   		if (cMode==ICREAD){
  	 		cRetCode = FlashReadBuf(wAdd,LENOFSPB,cChip,cpSPBBuf);
  	 		if (cRetCode==C_OK) {
  	 			// 解密
  	 			cCrcCode = Crc8(LENOFSPB-1,cpSPBBuf);  				//计算校验
   				if (cCrcCode==cpSPBBuf[LENOFSPB-1]) {				//判断校验是否正确
   					UncompressSPB(cpSPBBuf,spSPB);
   					return(C_OK);	
   				}
   			}		
   			cChip=1;
     	}              
     	else{
      		cCrcCode = Crc8(LENOFSPB-1,cpSPBBuf);  //计算校验
   	  		cpSPBBuf[LENOFSPB-1] = cCrcCode;
   	  		//加密
        	cRetCode = FlashWriteBuf (wAdd,LENOFSPB,cChip,cpSPBBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	
        	// 回读;
        	cRetCode = FlashReadBuf(wAdd,LENOFSPB,cChip,cpBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	if ((cRetCode =FlashVerify(cpSPBBuf,cpBuf,LENOFSPB))!=C_OK) 
        		return(cRetCode); 
   	 		if(cChip ==1 ) return(C_OK);
   	 		cChip=1;
     	}
  	} 	
   	return(C_FLASHERR);
}

//******************************************************************
//函数名:FlashVerify()
//功  能:比较两个缓冲区的内容是否相等
//参  数:
//        cpSourceBuf:源缓冲区的指针
//        cpTragetBuf: 目标缓冲区的指针
//		  wLength:    比较内容的长度
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//******************************************************************
_BYTE FlashVerify(_BYTE *cpSourceBuf,_BYTE *cpTragetBuf,_WORD wLength)
{
   _WORD i;
   for (i=0;i<wLength;i++)
      if (cpSourceBuf[i]!=cpTragetBuf[i]) return(C_FLASHVERIFYERR);
   return(C_OK);
}


//******************************************************************
//函数名:_BYTE FlashWriteDAT(_BYTE *cpDATBuf,_BYTE cMode)
//功  能:读取FLASH中的DAT表,或写入信息到FLASH中指定的SPB表
//参  数:cpDATBuf:读取的DAT表项信息或要写入的DAT表项信息
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//******************************************************************
_BYTE FlashReadWriteDAT(_BYTE *cpDATBuf,_BYTE cMode)
{
    _BYTE j,cRetCode,cChip;
   	_BYTE cCrcCode;
   	_WORD wAdd;
   	_BYTE cpBuf[LENOFDAT];
   	cChip=0;
   	wAdd=FLASH1_DAT_ADDRESS;
  
   	for(j=0;j<2;j++){
   	 	if (cMode==ICREAD){
  	 		cRetCode = FlashReadBuf(wAdd,LENOFDAT,cChip,cpDATBuf);
  	 		if (cRetCode==C_OK) {
  	 			cCrcCode = Crc8(LENOFDAT-1,cpDATBuf);  				// 计算校验
   				if(cCrcCode==cpDATBuf[LENOFDAT-1]) 					// 判断校验是否正确
   					return(C_OK);
   				else
   					cRetCode = C_FLASHCRCERR;
   			}	
   			cChip=1;
     	}              
     	else{
      		cCrcCode = Crc8(LENOFDAT-1,cpDATBuf);  					// 计算校验
	   	  	cpDATBuf[LENOFDAT-1] = cCrcCode;
        	cRetCode = FlashWriteBuf (wAdd,LENOFDAT,cChip,cpDATBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	
        	// 回读
        	cRetCode = FlashReadBuf(wAdd,LENOFDAT,cChip,cpBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	cRetCode =FlashVerify(cpDATBuf,cpBuf,LENOFDAT);
        	if (cRetCode!=C_OK) return(cRetCode); 
   	 		if(cChip ==1 ) return(C_OK);
   	 		cChip=1;
     	}
  	} 	
   	return(cRetCode);
}



//******************************************************************
//函数名:_BYTE FlashWriteKEYAREA(_BYTE *cpKEYBuf,_BYTE cMode)
//功  能:读取FLASH中的DAT表,或写入信息到FLASH中指定的KEY表
//参  数:cpKEYBuf:读取的KEYB表项信息或要写入的SPB表项信息
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//******************************************************************
_BYTE FlashReadWriteKEYAREA(struct StruKEYAREA *spKEY,_BYTE cMode)
{
   	_BYTE j,cRetCode,cChip;
   	_BYTE cCrcCode;
   	_WORD wAdd;
   	_BYTE cpKEYBuf[LENOFKEY];
   	_BYTE cpBuf[LENOFKEY];
   	cChip=0;
   	wAdd=FLASH1_KEY_ADDRESS;
   	if (cMode==ICWRITE) CompressKEY(spKEY,cpKEYBuf);
   	for(j=0;j<2;j++){
   	 	if (cMode==ICREAD){
  	 		cRetCode = FlashReadBuf(wAdd,LENOFKEY,cChip,cpKEYBuf);
  	 		if (cRetCode==C_OK) {
  	 			// 解密
  	 			cCrcCode = Crc8(LENOFKEY-1,cpKEYBuf);  			//计算校验
   				if(cCrcCode==cpKEYBuf[LENOFKEY-1]) {			//判断校验是否正确
					UncompressKEY(cpKEYBuf,spKEY);
   					return(C_OK);
   				}
   				else
   					cRetCode = C_FLASHCRCERR;
   			}		
   			cChip=1;
     	}              
     	else{
      		cCrcCode = Crc8(LENOFKEY-1,cpKEYBuf);  //计算校验
	   	  	cpKEYBuf[LENOFKEY-1] = cCrcCode;
   		  	//加密
        	cRetCode = FlashWriteBuf(wAdd,LENOFKEY,cChip,cpKEYBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	
        	// 回读;
        	cRetCode = FlashReadBuf(wAdd,LENOFKEY,cChip,cpBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	cRetCode =FlashVerify(cpKEYBuf,cpBuf,LENOFKEY);
        	if (cRetCode!=C_OK) return(cRetCode); 
   	 		if(cChip ==1 ) return(C_OK);
   	 		cChip=1;
     	}
  	} 	
   	return(cRetCode);
}


//******************************************************************
//函数名:_BYTE FlashWriteCDTI(_BYTE *cpCDTIBuf,_BYTE cMode)
//功  能:读取FLASH中的CDTI表,或写入信息到FLASH中指定的CDTI表
//参  数:cpCDTIBuf:读取的CDTI表项信息或要写入的CDTI表项信息
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//******************************************************************
_BYTE FlashReadWriteCDTI(struct StruCDTI *spCDTI,_BYTE cMode)
{
  	_BYTE j,cRetCode,cChip;
   	_BYTE cCrcCode;
   	_WORD wAdd;
   	_BYTE cpCDTIBuf[LENOFCDTI];
   	_BYTE cpBuf[LENOFCDTI];
   	cChip=0;
   	wAdd=FLASH1_CDTI_ADDRESS;
   	if (cMode==ICWRITE) CompressCDTI(spCDTI,cpCDTIBuf);
   	for(j=0;j<2;j++){
   	 	if (cMode==ICREAD){
  	 		cRetCode = FlashReadBuf(wAdd,LENOFCDTI,cChip,cpCDTIBuf);
  	 		if (cRetCode==C_OK) {
  	 			// 解密
  	 			cCrcCode = Crc8(LENOFCDTI-1,cpCDTIBuf);  			//计算校验
   				if(cCrcCode==cpCDTIBuf[LENOFCDTI-1]) {				//判断校验是否正确
   					UncompressCDTI(cpCDTIBuf,spCDTI);
   					return(C_OK);
   				}
   				else
   					cRetCode = C_FLASHCRCERR;
   			}		
   			cChip=1;
     	}              
     	else{
      		cCrcCode = Crc8(LENOFCDTI-1,cpCDTIBuf);  //计算校验
	   	  	cpCDTIBuf[LENOFCDTI-1] = cCrcCode;
   		  	//加密
        	cRetCode = FlashWriteBuf(wAdd,LENOFCDTI,cChip,cpCDTIBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	
        	cRetCode = FlashReadBuf(wAdd,LENOFCDTI,cChip,cpBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	if ((cRetCode =FlashVerify(cpCDTIBuf,cpBuf,LENOFCDTI))!=C_OK) return(cRetCode); 
   	 		if(cChip ==1 ) return(C_OK);
   	 		cChip=1;
     	}
  	} 	
   	return(cRetCode);
}



//******************************************************************
//函数名:_BYTE FlashWriteCSI(_BYTE *cpCSIBuf,_BYTE cMode)
//功  能:读取FLASH中的DAT表,或写入信息到FLASH中指定的CSI表
//参  数:cpCSIBuf:读取的CSI表项信息或要写入的CSI表项信息
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//******************************************************************
_BYTE FlashReadWriteCSI(struct StruCSI *spCSI,_BYTE cMode)
{
  	_BYTE j,cRetCode,cChip;
   	_BYTE cCrcCode;
   	_WORD wAdd;
   	_BYTE cpCSIBuf[LENOFCSI];
   	_BYTE cpBuf[LENOFCSI];
   	cChip=0;
   	wAdd=FLASH1_CSI_ADDRESS;
  	if (cMode==ICWRITE) CompressCSI(spCSI,cpCSIBuf);

   	for(j=0;j<2;j++){
   	 	if (cMode==ICREAD){
  	 		cRetCode = FlashReadBuf(wAdd,LENOFCSI,cChip,cpCSIBuf);
  	 		if (cRetCode==C_OK) {
  	 			cCrcCode = Crc8(LENOFCSI-1,cpCSIBuf);  			//计算校验
   				if(cCrcCode==cpCSIBuf[LENOFCSI-1]) {			//判断校验是否正确
  					UncompressCSI(cpCSIBuf,spCSI);
   					return(C_OK);
   				}
   				else
   					cRetCode = C_FLASHCRCERR;
   			}		
   			cChip=1;
     	}              
     	else{
      		cCrcCode = Crc8(LENOFCSI-1,cpCSIBuf);  //计算校验
	   	  	cpCSIBuf[LENOFCSI-1] = cCrcCode;
        	cRetCode = FlashWriteBuf(wAdd,LENOFCSI,cChip,cpCSIBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	
        	// 回读;
        	cRetCode = FlashReadBuf(wAdd,LENOFCSI,cChip,cpBuf);
        	if (cRetCode!=C_OK) return(cRetCode);
        	if ((cRetCode =FlashVerify(cpCSIBuf,cpBuf,LENOFCSI))!=C_OK) return(cRetCode); 
   	 		if(cChip ==1 ) return(C_OK);
   	 		cChip=1;
     	}
  	} 	
   	return(cRetCode);
}

//***************************************************************************************
//函数名:_BYTE FlashReadWriteMB(_BYTE * cpMBBuf,_BYTE cIndex,_BYTE cMode)
//功  能:读取FLASH中的指纹模板,或写指纹模板信息到FLASH中指定的位置
//参  数:cpMBBuf:读取的指纹模板信息或要写入的指纹模板信息
//cMode:操作方式,0表示读,1表示写
//cIndex:指纹模板的序号,从0开始编号
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);

//**************************************************************************************
_BYTE FlashReadWriteMB(_BYTE *cpMBBuf,_BYTE cIndex,_BYTE cMode)
{
   	_BYTE cRetCode,cChip;
   	_BYTE cCrcCode;
   	_WORD wAdd;
   	_BYTE cpBuf[LENOFMB];

   	cChip=1;
   	wAdd=cIndex * LENOFMB + FLASH2_FINGER_ADDRESS;
 	if (cMode==ICREAD){
  	 	cRetCode = FlashReadBuf(wAdd,LENOFMB,cChip,cpMBBuf);
  	 	if (cRetCode!=C_OK) return(cRetCode);
  	 	//解密
  	 	cCrcCode = Crc8(LENOFMB-1,cpMBBuf);  						// 计算校验
   		if(cCrcCode!=cpMBBuf[LENOFMB-1]) return(C_FLASHCRCERR); 	// 判断校验是否正确
   	}              
    else{
      	cCrcCode = Crc8(LENOFMB-1,cpMBBuf);  //计算校验
   	  	cpMBBuf[LENOFMB-1] = cCrcCode;
   	  	//加密
        cRetCode = FlashWriteBuf(wAdd,LENOFMB,cChip,cpMBBuf);
        if (cRetCode!=C_OK) return(cRetCode);
       	// 回读;
       	cRetCode = FlashReadBuf(wAdd,LENOFMB,cChip,cpBuf);
       	if (cRetCode!=C_OK) return(cRetCode);
       	if ((cRetCode =FlashVerify(cpMBBuf,cpBuf,LENOFMB))!=C_OK) return(cRetCode); 
  	}
   	return(C_OK);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -