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

📄 dataflash.c

📁 一个具体的项目程序
💻 C
📖 第 1 页 / 共 2 页
字号:


#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 + -