📄 flash.c
字号:
//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 + -