📄 i2cic.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 + -