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