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

📄 i2cic.c

📁 AT91fr40162的FLASH读写程序
💻 C
字号:
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include <stdio.h>

//***********************************************************************************
//写入信息到IC卡中
//其中:
//函数的返回值为C_OK或C_NOTOK
//wAddress:读写或写入信息在IC卡中的起始地址
//wLength:读取或写入信息的长度
//cpBlockBuf:读取或待写入的信息
//***********************************************************************************
_BYTE ICWriteBlock(_WORD wAddress,_WORD wLength,_BYTE *cpBlockBuf)
{
	_BYTE cRetCode;
    AT91_I2C_LineOpen(&I2C_line, I2C_line.dwI2CSpeed,0,I2CICCARD);
	cRetCode = I2CWriteBlock(wAddress,wLength,0,cpBlockBuf,I2CICCARD);
    AT91_I2C_LineClose(&I2C_line);
    return(cRetCode);
}   	

//***********************************************************************************
//读取信息到IC卡中
//其中:
//函数的返回值为C_OK或C_NOTOK
//wAddress:读写或写入信息在IC卡中的起始地址
//wLength:读取或写入信息的长度
//cpBlockBuf:读取或待写入的信息
//***********************************************************************************
_BYTE ICReadBlock(_WORD wAddress,_WORD wLength,_BYTE *cpBlockBuf)
{
	_BYTE cRetCode;
    AT91_I2C_LineOpen(&I2C_line, I2C_line.dwI2CSpeed,0,I2CICCARD);
	cRetCode =I2CReadBlock(wAddress,wLength,0,cpBlockBuf,I2CICCARD);
    AT91_I2C_LineClose(&I2C_line);
    return(cRetCode);
    
}

//**********************************************
//有卡插入返回C_OK
//否则返回C_NOTOK
//**********************************************
_BYTE ICCheckCardInsert(void)
{
 	if ((MY_PIO_PDSR & IC_IN) == 0)
 		return(C_OK);
 	else	
  		return(C_NOIC); 
}

//********************************************************************************
//函数名:_BYTE ICReadWriteCardID(_BYTE *cpBuf,_BYTE cMode)
//功  能:读取或写入CardID文件的静态信息到IC卡中的CardID文件中
//参  数:cpBuf:读取或待写入的CardID静态信息
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//*******************************************************************************
_BYTE ICReadWriteIDEF(_BYTE *cpBuf,_BYTE cMode)
{
   	_BYTE cRetCode,cCrcCode;
   	_WORD wAdd;
   	_BYTE cpVerifyBuf[LENOFIDEF];

   	cRetCode = ICCheckCardInsert();
   	if (cRetCode!=0) return(cRetCode);
   	wAdd=IC_IDEF_ADDRESS;
   	if(cMode==ICREAD){
   	 	cRetCode = ICReadBlock(wAdd,LENOFIDEF,cpBuf);
		if (cRetCode!=C_OK) return(cRetCode);
		// 解密
		UnCode(cpBuf,LENOFIDEF);
   	 	cCrcCode = Crc8(LENOFIDEF-1,cpBuf);  					//计算校验
   	 	if(cCrcCode!=cpBuf[LENOFIDEF-1]) return(C_ICCRCERR);		//判断校验是否正确
   	 	return(C_OK);		;
  	}
  	else {
  		cCrcCode = Crc8 (LENOFIDEF-1,cpBuf);  //计算校验
   	 	cpBuf[LENOFIDEF-1] = cCrcCode;
		DeCode(cpBuf,LENOFIDEF);
   	 	cRetCode = ICWriteBlock(wAdd,LENOFIDEF,cpBuf);
   	 	if (cRetCode!=C_OK) return(cRetCode);
   	 	//DelayMCK4(3000);
   	 	cRetCode = ICReadBlock(wAdd,LENOFIDEF,cpVerifyBuf);
   	 	if (cRetCode!=C_OK) return(cRetCode);
   	 	cRetCode = FlashVerify(cpBuf,cpVerifyBuf,LENOFIDEF);
   	 	if (cRetCode!=C_OK) return(C_ICVERIFYERR);
   	 	return(C_OK);
  	}	
}


//********************************************************************************
//函数名:_BYTE ICReadWriteBIEFBaseInfo(SBIEF_1 *sBaseInfo,_BYTE cMode)
//功  能:读取或写入BIEF文件的静态信息到IC卡中的BIEF文件中
//参  数:sBaseInfo:读取或待写入的BIEF静态信息
//cMode:操作方式,0表示读,1表示写
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//*******************************************************************************
_BYTE ICReadWriteBIEFBaseInfo(SBIEF_1 *sBaseInfo,_BYTE cMode)
{
   	_BYTE cRetCode,cCrcCode;
   	_WORD wAdd;
   	_BYTE cpBuf[LENOFBIEFBASEINFO];
   	_BYTE cpVerifyBuf[LENOFBIEFBASEINFO];
   	
   	cRetCode = ICCheckCardInsert();
   	if (cRetCode!=0) return(cRetCode);
   	wAdd=IC_BIEF_ADDRESS;
   	if(cMode==ICREAD){
   	 	cRetCode = ICReadBlock(wAdd,LENOFBIEFBASEINFO,cpBuf);
		if (cRetCode!=C_OK) return(cRetCode);
		// 解密
   	 	cCrcCode = Crc8(LENOFBIEFBASEINFO-1,cpBuf);  					//计算校验
   	 	if(cCrcCode!=cpBuf[LENOFBIEFBASEINFO-1]) {
   	 		cRetCode = C_NOTOK;
   	 		return(C_ICCRCERR);		//判断校验是否正确
   	 	}	
   	 	ICUncompressBIEFBaseInfo(cpBuf,sBaseInfo);
   	 	return(C_OK);		;
  	}
  	else {
   	 	ICCompressBIEFBaseInfo(sBaseInfo,cpBuf);
  		cCrcCode = Crc8 (LENOFBIEFBASEINFO-1,cpBuf);  //计算校验
   	 	cpBuf[LENOFBIEFBASEINFO-1] = cCrcCode;
   	 	//加密
   	 	cRetCode = ICWriteBlock(wAdd,LENOFBIEFBASEINFO,cpBuf);
   	 	if (cRetCode!=C_OK) return(cRetCode);
   	 	//DelayMCK4(3000);
   	 	//cRetCode = ICReadBlock(wAdd,LENOFBIEFBASEINFO,cpBuf);
   	 	cRetCode = ICReadBlock(wAdd,LENOFBIEFBASEINFO,cpVerifyBuf);
   	 	if (cRetCode!=C_OK) return(cRetCode);
   	 	cRetCode = FlashVerify(cpBuf,cpVerifyBuf,LENOFBIEFBASEINFO);
   	 	if (cRetCode!=C_OK) return(C_ICVERIFYERR);
   	 	return(C_OK);
  	}	
   return(C_OK);
}


//*******************************************************************************
//函数名:_BYTE ICReadWriteIC_BIEF_ADDRESS(SBIEF_2 *sTrainInfo,_BYTE cMode,_BYTE *cCopy)
//功  能:读取或写入BIEF文件的训练信息到IC卡中的BIEF文件中
//参  数:sTrainInfo:读取或待写入的BIEF训练信息
//cMode:操作方式,0表示读,1表示写
//cCopy:在读操作时,返回读取成功的训练信息是哪一份训练信息,1、2表示第一、二份;
//       在写操作时,表示哪一份训练信息优先写入;
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//********************************************************************************
_BYTE ICReadWriteBIEFTrainInfo(SBIEF_2 *sTrainInfo,_BYTE cMode,_BYTE *cCopy)
{
   	_BYTE i,cRetCode,cCrcCode;
   	_WORD wAdd;
   	_BYTE cpBuf[LENOFBIEFTRAININFO];
   	_BYTE cpVerifyBuf[LENOFBIEFTRAININFO];

   	cRetCode = ICCheckCardInsert();
   	if (cRetCode!=0) return(cRetCode);
   	if(cMode==ICWRITE){
		ICCompressBIEFTrainInfo(sTrainInfo,cpBuf);
		for (i=0;i<2;i++) {								// 写两份
			if (i==0) {
   				if(*cCopy==1)
   	   				wAdd=IC_BIEF_TRAININFO_ADDRESS;
    			else
   	   				wAdd=IC_BIEF_TRAININFO_ADDRESS+LENOFBIEFTRAININFO;
			}
			else {
   				if(*cCopy==1)
   	   				wAdd=IC_BIEF_TRAININFO_ADDRESS+LENOFBIEFTRAININFO;
    			else
   	   				wAdd=IC_BIEF_TRAININFO_ADDRESS;
			}
  	 		cCrcCode = Crc8(LENOFBIEFTRAININFO-1,cpBuf);  	//计算校验
   	 		cpBuf[LENOFBIEFTRAININFO-1] = cCrcCode;
   	 		//加密
   	 		cRetCode = ICWriteBlock(wAdd,LENOFBIEFTRAININFO,cpBuf);
   	 		if (cRetCode!=C_OK) return(cRetCode);
   	 		//DelayMCK4(3000);
   	 		// 回读
   	 		cRetCode = ICReadBlock(wAdd,LENOFBIEFTRAININFO,cpVerifyBuf);
   	 		if (cRetCode!=C_OK) return(cRetCode);
   	 		cRetCode = FlashVerify(cpBuf,cpVerifyBuf,LENOFBIEFTRAININFO);
   	 		if (cRetCode!=C_OK) return(C_ICVERIFYERR);
  	 	}
  	 	return(C_OK);
   	}
   	else {
		for (i=0;i<2;i++) {									// 读两次,任意一份成功则成功
			if (i==0) 
   	   			wAdd=IC_BIEF_TRAININFO_ADDRESS;
     		else
   	   			wAdd=IC_BIEF_TRAININFO_ADDRESS+LENOFBIEFTRAININFO;
			cRetCode = ICReadBlock(wAdd,LENOFBIEFTRAININFO,cpBuf);
   	 		if (cRetCode==C_OK) {
  				//解密
   	 			cCrcCode = Crc8(LENOFBIEFTRAININFO-1,cpBuf);  			// 计算校验
   	 			if (cCrcCode==cpBuf[LENOFBIEFTRAININFO-1]) {				// 如果校验正确
					*cCopy = i+1;
					ICUncompressBIEFTrainInfo(cpBuf,sTrainInfo);
   	 				return(C_OK);
   	 			}
   	 			else 
   	 				cRetCode = C_ICCRCERR;
   	 		}		
		}
		return(cRetCode);
   	}
}


//*******************************************************************************
//函数名:_BYTE ICReadWriteBIEFTimeInfo(SBIEF_3 *sTimeInfo,_BYTE cMode,_BYTE *cCopy)
//功  能:读取或写入BIEF文件的买钟信息到IC卡中的BIEF文件中
//参  数:sTimeInfo:读取或待写入的BIEF训练信息
//cMode:操作方式,0表示读,1表示写
//cCopy:在读操作时,返回读取成功的训练信息是哪一份训练信息,1、2表示第一、二份;
//       在写操作时,表示哪一份训练信息优先写入;
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//********************************************************************************
_BYTE ICReadWriteBIEFTimeInfo(SBIEF_3 *sTimeInfo,_BYTE cMode,_BYTE *cCopy)
{
   	_BYTE i,cRetCode,cCrcCode;
   	_WORD wAdd;
   	_BYTE cpBuf[LENOFBIEFTIMEINFO];
   	_BYTE cpVerifyBuf[LENOFBIEFTIMEINFO];

   	cRetCode = ICCheckCardInsert();
   	if (cRetCode!=0) return(cRetCode);
   	if(cMode==ICWRITE){
		ICCompressBIEFTimeInfo(sTimeInfo,cpBuf);
		for (i=0;i<2;i++) {								// 写两份
			if (i==0) {
   				if(*cCopy==1)
   	   				wAdd=IC_BIEF_TIMEINFO_ADDRESS;
    			else
   	   				wAdd=IC_BIEF_TIMEINFO_ADDRESS+LENOFBIEFTIMEINFO;
			}
			else {
   				if(*cCopy==1)
   	   				wAdd=IC_BIEF_TIMEINFO_ADDRESS+LENOFBIEFTIMEINFO;
    			else
   	   				wAdd=IC_BIEF_TIMEINFO_ADDRESS;
			}
  	 		cCrcCode = Crc8(LENOFBIEFTIMEINFO-1,cpBuf);  	//计算校验
   	 		cpBuf[LENOFBIEFTIMEINFO-1] = cCrcCode;
   	 		//加密
   	 		cRetCode = ICWriteBlock(wAdd,LENOFBIEFTIMEINFO,cpBuf);
   	 		if (cRetCode!=C_OK) return(cRetCode);
   	 		//DelayMCK4(3000);
   	 		// 回读
   	 		cRetCode = ICReadBlock(wAdd,LENOFBIEFTIMEINFO,cpVerifyBuf);
   	 		if (cRetCode!=C_OK) return(cRetCode);
   	 		cRetCode = FlashVerify(cpBuf,cpVerifyBuf,LENOFBIEFTIMEINFO);
   	 		if (cRetCode!=C_OK) return(C_ICVERIFYERR);
  	 	}
  	 	return(C_OK);
   	}
   	else {
		for (i=0;i<2;i++) {									// 读两次,任意一份成功则成功
			if (i==0) 
   	   			wAdd=IC_BIEF_TIMEINFO_ADDRESS;
     		else
   	   			wAdd=IC_BIEF_TIMEINFO_ADDRESS+LENOFBIEFTIMEINFO;
			cRetCode = ICReadBlock(wAdd,LENOFBIEFTIMEINFO,cpBuf);
   	 		if (cRetCode==C_OK) {
  				//解密
   	 			cCrcCode = Crc8(LENOFBIEFTIMEINFO-1,cpBuf);  			// 计算校验
   	 			if (cCrcCode==cpBuf[LENOFBIEFTIMEINFO-1]) {				// 如果校验正确
					*cCopy = i+1;
					ICUncompressBIEFTimeInfo(cpBuf,sTimeInfo);
   	 				return(C_OK);
   	 			}
   	 			else 
   	 				cRetCode = C_ICCRCERR;
   	 		}		
		}
		return(cRetCode);
   	}
}

//*****************************************************************************************
//函数名:_BYTE ICReadWriteDIEF(_BYTE cCardType,_WORD cIndex,_BYTE *cpBuf,_BYTE cMode)
//功  能:读取或写入一条日志信息到IC卡中的DIEF文件
//参  数:cpBuf:读取或待写入的BIEF买钟信息;
//cMode:操作方式,0表示读,1表示写;
//cIndex:拟读写入日志的编号,从0开始编号;
//cCardType:卡类型,只是学员卡还时教练员卡,其中0x02表示教练员卡,0x03表示学员卡;
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//*****************************************************************************************
_BYTE ICReadWriteDIEF(_BYTE cCardType,_WORD cIndex,_BYTE *cpBuf,_BYTE cMode)
{
	_BYTE cRetCode,cCrcCode;
   	_WORD wAdd;
   	_BYTE cLenOfLog;

   	cRetCode = ICCheckCardInsert();
   	if (cRetCode!=0) return(cRetCode);
   	if(cCardType==0x02)
   		cLenOfLog=LENOFCOACHLOG;
   	if(cCardType==0x03)
   		cLenOfLog=LENOFSTUDENTLOG;
   	wAdd=IC_DIEF_ADDRESS+cIndex*cLenOfLog;
   	if(cMode==ICREAD) {
   	 	cRetCode = ICReadBlock(wAdd,cLenOfLog,cpBuf);
   	 	// 解密
  		cCrcCode = Crc8(cLenOfLog-1,cpBuf);  //计算校验
   	 	if (cCrcCode != cpBuf[cLenOfLog-1]) return(C_ICCRCERR) ;
  	}
  	else {
  		cCrcCode = Crc8(cLenOfLog-1,cpBuf);  //计算校验
   	 	cpBuf[cLenOfLog-1] = cCrcCode;
   	 	//加密
   	 	cRetCode = ICWriteBlock(wAdd,cLenOfLog,cpBuf);
   	 	if (cRetCode!=C_OK) return(cRetCode);
  	}
  	return(C_OK);
}

//*****************************************************************************************
//函数名:_BYTE ICReadBIEF
//功  能:读取BIEF文件的内容
//参  数:
//        csBaseInfo:  指向BIEFBaseInfo结构类型的指针,用来返回读取的BIEF文件基本信息的内容;
//        csTrainInfo: 指向IC_BIEF_ADDRESS结构类型的指针,用来返回读取的BIEF文件训练信息的内容;
//        csTimeInfo: 指向BIEFTimeInfo结构类型的指针,用来返回读取的BIEF文件买钟信息的内容;
//返回值:函数执行成功,返回值为C_OK,否则返回错误码(见错误码表);
//*****************************************************************************************
_BYTE ICReadBIEF(SBIEF_1 *csBaseInfo,SBIEF_2 *csTrainInfo,SBIEF_3 *csTimeInfo)
{
	_BYTE cRetCode;
	_BYTE cCopy;
	cRetCode = ICReadWriteBIEFBaseInfo(csBaseInfo,ICREAD);
	if (cRetCode!=C_OK) return(cRetCode);
	cRetCode = ICReadWriteBIEFTrainInfo(csTrainInfo,ICREAD,&cCopy);
	if (cRetCode!=C_OK) return(cRetCode);
	cRetCode = ICReadWriteBIEFTimeInfo(csTimeInfo,ICREAD,&cCopy);
	return(cRetCode);
}


//**********************************************
//打开或关闭IC卡电源
//**********************************************
void ICPower(int iOnOff)
{
	if (iOnOff ==ON) { 
	 	gcpCPLDReg[4] &= ~CPLD_IC_RST;
	    pCPLD[8] = gcpCPLDReg[4];	//IC_RST=0
	    gcpCPLDReg[3] |= CPLD_IC_PWREN;
	    pCPLD[6] = gcpCPLDReg[3];	//IC_POWER=1
 	}	
 	else {
	    gcpCPLDReg[3] &= ~CPLD_IC_PWREN;
	    pCPLD[6] = gcpCPLDReg[3];	//IC_POWER=0
	}	
}

⌨️ 快捷键说明

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