📄 dataflash.c
字号:
#include "my_head.h"
#include "mem_addr.h"
#include "DataFlash.H"
//#define _DEBUG
#ifdef _DEBUG
#include "Debug.H"
#endif
#define THE_BUFFER_ONE 0
#define THE_BUFFER_TWO 1
//卡状态宏定义
#define BLACKLIST_MAIN 0x12 //黑名单主表
#define BLACKLIST_TEMP 0x02 //黑名单临时表
#define RESUME_LIST 0x00 //卡恢复列表
extern unsigned char pdata Rf_Buffer[];//RF模块通讯接收缓冲
extern sttOtherTableInfo xdata stOtherTableInfo;
extern unsigned char xdata gcDateTime[7]; //全局时钟
extern unsigned char Write_To_Buffer(void *ptr,int length,bit buffer,unsigned int byteaddr);
extern unsigned char Buffer_To_Mem(bit buffer,unsigned int pageaddr);
extern unsigned char Mem_To_Buffer(bit buffer,unsigned int pageaddr);
extern unsigned char Read_From_Buffer(void *ptr,int length,bit buffer,unsigned int byteaddr);
extern unsigned char Memory_ArrayRead(void *ptr,int length,unsigned int pageaddr,unsigned int byteaddr);
extern unsigned char Read_From_Buffer(void *ptr,int length,bit buffer,unsigned int BYTEaddr);
//extern unsigned char xdata UART_SendBuffer[150];//发送缓冲
#ifdef _DEBUG
unsigned char TempCount=0;
#endif
//=======================卡状态操作函数=========================
//读卡状态表
unsigned char ReadCardStatusTable(unsigned int PageIndex,//页序号 主表为0-939,其它只有1和2值
unsigned char *Buffer,//具体卡系列号
unsigned char Count, //个数,1-33,最多一次33个
unsigned char Status) //状态(0:解挂 2:挂失 12:主表挂失)
{
unsigned int iPage; //页地址
unsigned int iAddr; //页内地址
#ifdef _DEBUG
DebugString("PageIndex=");DebugData(2,2,(unsigned char *)&PageIndex);
DebugString("Count=");DebugData(1,1,&Count);
DebugString("Status=");DebugData(1,1,&Status);
#endif
if(Count > 33) return FORMAT_ERR; //参数错误
switch(Status)
{
case RESUME_LIST: //解挂
iPage = RESUMECARD_TEMP_PAGEADDR; //给页地址
if(PageIndex == 0)
iAddr = 0;
else if(PageIndex == 1)
iAddr = 132;
else
return MEMADDR_ERR; //地址页超界
break;
case BLACKLIST_TEMP: //挂失临时表
iPage = CARDSTATE_TEMP_PAGEADDR; //给页地址
if(PageIndex == 0)
iAddr = 0;
else if(PageIndex == 1)
iAddr = 132;
else
return MEMADDR_ERR; //地址页超界
break;
case BLACKLIST_MAIN://主表挂失
iPage = PageIndex / 2 + CARDSTATE_START_PAGEADDR; //计算页地址
if(iPage > CARDSTATE_END_PAGEADDR) return MEMADDR_ERR; //地址页超界
if(PageIndex % 2) iAddr = 132; else iAddr = 0; //计算开始地址
break;
default: return FORMAT_ERR; //参数错误
}
#ifdef _DEBUG
DebugString("iPage=");DebugData(2,2,(unsigned char *)&iPage);
DebugString("iAddr=");DebugData(2,2,(unsigned char *)&iAddr);
#endif
return Memory_ArrayRead(Buffer,Count*4,iPage,iAddr);
}
unsigned char SaveCardStatusTable(unsigned int PageIndex,//序号 主表为0-939,其它只有1和2值
unsigned char *Buffer, //具体卡系列号
unsigned char Count, //个数,最多一次33个
unsigned char Status) //状态(0:解挂 2:挂失 12:主表挂失)
{
unsigned int iPage; //页地址
unsigned int iAddr; //页内地址
unsigned char rst; //函数返回值
if(Count > 33) return FORMAT_ERR; //参数错误
switch(Status)
{
case RESUME_LIST: //解挂
iPage = RESUMECARD_TEMP_PAGEADDR; //给页地址
if(PageIndex == 0)
iAddr = 0;
else if(PageIndex == 1)
iAddr = 132;
else
return MEMADDR_ERR; //地址页超界
break;
case BLACKLIST_TEMP: //挂失临时表
iPage = CARDSTATE_TEMP_PAGEADDR; //给页地址
if(PageIndex == 0)
iAddr = 0;
else if(PageIndex == 1)
iAddr = 132;
else
return MEMADDR_ERR; //地址页超界
break;
case BLACKLIST_MAIN://主表挂失
iPage = PageIndex / 2 + CARDSTATE_START_PAGEADDR; //计算页地址
if(iPage > CARDSTATE_END_PAGEADDR) return MEMADDR_ERR; //地址页超界
if(PageIndex % 2) iAddr = 132; else iAddr = 0; //计算开始地址
break;
default: return FORMAT_ERR; //参数错误
}
if(iAddr) //地址大于0时,必须先读出原Flash内数据
{
rst = Mem_To_Buffer(THE_BUFFER_ONE,iPage);
if(rst != SUCCESS) return rst;
}
//写数据到Flash缓冲区
rst = Write_To_Buffer(Buffer,Count * 4,THE_BUFFER_ONE,iAddr);
if(rst != SUCCESS) return rst;
//把Flash的缓冲区数据存到Flash的存贮区上
rst = Buffer_To_Mem(THE_BUFFER_ONE,iPage);
switch(Status)
{
case RESUME_LIST: //解挂
stOtherTableInfo.iResumeCardTempTableRecordCount = PageIndex * 33;
if(rst == SUCCESS)
stOtherTableInfo.iResumeCardTempTableRecordCount += Count;
break;
case BLACKLIST_TEMP: //挂失临时表
stOtherTableInfo.iCardStatusTempTableRecordCount = PageIndex * 33;
if(rst == SUCCESS)
stOtherTableInfo.iCardStatusTempTableRecordCount += Count;
break;
case BLACKLIST_MAIN://主表挂失
stOtherTableInfo.iCardStatusMainTableRecordCount = PageIndex * 33;
if(rst == SUCCESS)
stOtherTableInfo.iCardStatusMainTableRecordCount += Count;
break;
default: return FORMAT_ERR; //参数错误
}
return rst;
}
unsigned char ReadCardStatusList(unsigned long *plCardSerialNo, //返回的卡系列号
unsigned int Offset, //位置偏移量
unsigned char Status) //状态(0:解挂 2:挂失 12:主表挂失)
{
unsigned int iPage; //页地址
unsigned int iAddr; //页内地址
unsigned char rst;
#ifdef _DEBUG
DebugString("Offset=");DebugData(2,2,(unsigned char *)&Offset);
DebugString("Status=");DebugData(1,1,&Status);
#endif
switch(Status)
{
case RESUME_LIST: //解挂
if(Offset > 65) return MEMADDR_ERR;
iPage = RESUMECARD_TEMP_PAGEADDR;
break;
case BLACKLIST_TEMP: //挂失临时表
if(Offset > 65) return MEMADDR_ERR;
iPage = CARDSTATE_TEMP_PAGEADDR;
break;
case BLACKLIST_MAIN://主表挂失
iPage = CARDSTATE_START_PAGEADDR;
#ifdef _DEBUG
DebugString("Init iPage=");
DebugData(2,2,(unsigned char *)&iPage);
#endif
iPage += Offset / 66; //计算具体页地址
if(iPage > CARDSTATE_END_PAGEADDR)
return MEMADDR_ERR;
break;
default: return FORMAT_ERR; //参数错误
}
iAddr = Offset % 66 * 4;//计算具体页内地址
#ifdef _DEBUG
DebugString("iPage=");DebugData(2,2,(unsigned char *)&iPage);
DebugString("iAddr=");DebugData(2,2,(unsigned char *)&iAddr);
#endif
rst = Memory_ArrayRead(plCardSerialNo,4,iPage,iAddr);
#ifdef _DEBUG
DebugString("Read DataFlash Result:");DebugData(1,1,&rst);
#endif
return rst;
}
unsigned char IsInCardStatusList(unsigned long lCardSerialNo,
unsigned char Status)
{
unsigned long lSerialNo;
short iMin,iMax; //此处必须用符号数
unsigned int iMid;
unsigned char rst;
#ifdef _DEBUG
DebugString("lCardSerialNo=");
DebugData(4,4,(unsigned char *)&lCardSerialNo);
DebugString("Status=");
DebugData(1,1,&Status);
#endif
//取得列表里记录数
switch(Status)
{
case RESUME_LIST: //解挂
iMax = stOtherTableInfo.iResumeCardTempTableRecordCount;
break;
case BLACKLIST_TEMP: //挂失临时表
iMax = stOtherTableInfo.iCardStatusTempTableRecordCount;
break;
case BLACKLIST_MAIN://主表挂失
iMax = stOtherTableInfo.iCardStatusMainTableRecordCount;
break;
default: return FORMAT_ERR; //参数错误
}
#ifdef _DEBUG
DebugString("Record Count=");DebugData(4,4,(unsigned char *)&iMax);
#endif
iMin=0;
while(iMin < iMax) //判断终止条件
{
iMid = ((unsigned int)iMin + (unsigned int)iMax) / 2; //中折
#ifdef _DEBUG
DebugString("iMax=");DebugData(2,2,(unsigned char *)&iMax);
DebugString("iMin=");DebugData(2,2,(unsigned char *)&iMin);
DebugString("iMid=");DebugData(2,2,(unsigned char *)&iMid);
#endif
rst = ReadCardStatusList(&lSerialNo,iMid,Status);
#ifdef _DEBUG
DebugString("Current lSerialNo=");
DebugData(4,4,(unsigned char *)&lSerialNo);
#endif
if(rst != SUCCESS) return rst;//返回出错
if(lSerialNo == lCardSerialNo) //找到当前卡号
return SUCCESS;
else if(lSerialNo < lCardSerialNo) //当前卡列号比黑名单表里的小
iMin = iMid + 1; //继续找后面的数据
else iMax = iMid; //继续找前面的数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -