DataFlash.C
上传用户:shyuanyi
上传日期:2008-05-24
资源大小:69k
文件大小:16k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include "my_head.h"
  2. #include "mem_addr.h"
  3. #include "DataFlash.H"
  4. //#define _DEBUG
  5. #ifdef _DEBUG
  6. #include "Debug.H"
  7. #endif
  8. #define  THE_BUFFER_ONE            0
  9. #define  THE_BUFFER_TWO            1
  10. //卡状态宏定义
  11. #define BLACKLIST_MAIN 0x12 //黑名单主表
  12. #define BLACKLIST_TEMP 0x02 //黑名单临时表
  13. #define RESUME_LIST 0x00 //卡恢复列表 
  14. extern unsigned char pdata Rf_Buffer[];//RF模块通讯接收缓冲
  15. extern sttOtherTableInfo xdata stOtherTableInfo;
  16. extern unsigned char xdata gcDateTime[7]; //全局时钟
  17. extern unsigned char  Write_To_Buffer(void *ptr,int length,bit buffer,unsigned int byteaddr);
  18. extern unsigned char  Buffer_To_Mem(bit buffer,unsigned int pageaddr);
  19. extern unsigned char  Mem_To_Buffer(bit buffer,unsigned int pageaddr);
  20. extern unsigned char  Read_From_Buffer(void *ptr,int length,bit buffer,unsigned int byteaddr);
  21. extern unsigned char  Memory_ArrayRead(void *ptr,int length,unsigned int pageaddr,unsigned int byteaddr);
  22. extern unsigned char  Read_From_Buffer(void *ptr,int length,bit buffer,unsigned int BYTEaddr);
  23. //extern unsigned char xdata UART_SendBuffer[150];//发送缓冲
  24. #ifdef _DEBUG
  25. unsigned char TempCount=0;
  26. #endif
  27. //=======================卡状态操作函数=========================
  28. //读卡状态表
  29. unsigned char ReadCardStatusTable(unsigned int PageIndex,//页序号 主表为0-939,其它只有1和2值
  30.   unsigned char *Buffer,//具体卡系列号
  31.   unsigned char Count, //个数,1-33,最多一次33个
  32.   unsigned char Status) //状态(0:解挂 2:挂失  12:主表挂失)
  33. {
  34. unsigned int iPage; //页地址
  35. unsigned int iAddr; //页内地址
  36. #ifdef _DEBUG
  37. DebugString("PageIndex=");DebugData(2,2,(unsigned char *)&PageIndex);    
  38. DebugString("Count=");DebugData(1,1,&Count);    
  39. DebugString("Status=");DebugData(1,1,&Status);    
  40. #endif
  41. if(Count > 33) return FORMAT_ERR; //参数错误
  42. switch(Status)
  43. {
  44. case RESUME_LIST: //解挂
  45. iPage = RESUMECARD_TEMP_PAGEADDR; //给页地址
  46. if(PageIndex == 0) 
  47. iAddr = 0;
  48. else if(PageIndex == 1)
  49. iAddr = 132;
  50. else
  51. return MEMADDR_ERR; //地址页超界
  52. break;
  53. case BLACKLIST_TEMP: //挂失临时表
  54. iPage = CARDSTATE_TEMP_PAGEADDR; //给页地址
  55. if(PageIndex == 0) 
  56. iAddr = 0;
  57. else if(PageIndex == 1)
  58. iAddr = 132;
  59. else
  60. return MEMADDR_ERR; //地址页超界
  61. break;
  62. case BLACKLIST_MAIN://主表挂失
  63. iPage = PageIndex / 2 + CARDSTATE_START_PAGEADDR; //计算页地址
  64. if(iPage > CARDSTATE_END_PAGEADDR) return MEMADDR_ERR; //地址页超界
  65. if(PageIndex % 2) iAddr = 132; else iAddr = 0; //计算开始地址
  66. break;
  67. default: return FORMAT_ERR; //参数错误
  68. }
  69. #ifdef _DEBUG
  70. DebugString("iPage=");DebugData(2,2,(unsigned char *)&iPage);    
  71. DebugString("iAddr=");DebugData(2,2,(unsigned char *)&iAddr); 
  72. #endif
  73.   
  74. return Memory_ArrayRead(Buffer,Count*4,iPage,iAddr);
  75. }
  76. unsigned char SaveCardStatusTable(unsigned int  PageIndex,//序号 主表为0-939,其它只有1和2值
  77.   unsigned char *Buffer, //具体卡系列号
  78.   unsigned char Count, //个数,最多一次33个
  79.      unsigned char Status) //状态(0:解挂 2:挂失  12:主表挂失)
  80. {
  81. unsigned int iPage; //页地址
  82. unsigned int iAddr; //页内地址
  83. unsigned char rst; //函数返回值
  84. if(Count > 33) return FORMAT_ERR; //参数错误
  85. switch(Status)
  86. {
  87. case RESUME_LIST: //解挂
  88. iPage = RESUMECARD_TEMP_PAGEADDR; //给页地址
  89. if(PageIndex == 0) 
  90. iAddr = 0;
  91. else if(PageIndex == 1)
  92. iAddr = 132;
  93. else
  94. return MEMADDR_ERR; //地址页超界
  95. break;
  96. case BLACKLIST_TEMP: //挂失临时表
  97. iPage = CARDSTATE_TEMP_PAGEADDR; //给页地址
  98. if(PageIndex == 0) 
  99. iAddr = 0;
  100. else if(PageIndex == 1)
  101. iAddr = 132;
  102. else
  103. return MEMADDR_ERR; //地址页超界
  104. break;
  105. case BLACKLIST_MAIN://主表挂失
  106. iPage = PageIndex / 2 + CARDSTATE_START_PAGEADDR; //计算页地址
  107. if(iPage > CARDSTATE_END_PAGEADDR) return MEMADDR_ERR; //地址页超界
  108. if(PageIndex % 2) iAddr = 132; else iAddr = 0; //计算开始地址
  109. break;
  110. default: return FORMAT_ERR; //参数错误
  111. }
  112. if(iAddr) //地址大于0时,必须先读出原Flash内数据
  113. {
  114. rst = Mem_To_Buffer(THE_BUFFER_ONE,iPage);
  115. if(rst != SUCCESS) return rst;
  116. }
  117. //写数据到Flash缓冲区
  118. rst = Write_To_Buffer(Buffer,Count * 4,THE_BUFFER_ONE,iAddr);
  119. if(rst != SUCCESS) return rst;
  120. //把Flash的缓冲区数据存到Flash的存贮区上
  121. rst = Buffer_To_Mem(THE_BUFFER_ONE,iPage);
  122. switch(Status)
  123. {
  124. case RESUME_LIST: //解挂
  125. stOtherTableInfo.iResumeCardTempTableRecordCount = PageIndex * 33;
  126. if(rst == SUCCESS) 
  127. stOtherTableInfo.iResumeCardTempTableRecordCount += Count;
  128. break;
  129. case BLACKLIST_TEMP: //挂失临时表
  130. stOtherTableInfo.iCardStatusTempTableRecordCount = PageIndex * 33;
  131. if(rst == SUCCESS) 
  132. stOtherTableInfo.iCardStatusTempTableRecordCount += Count;
  133. break;
  134. case BLACKLIST_MAIN://主表挂失
  135. stOtherTableInfo.iCardStatusMainTableRecordCount = PageIndex * 33;
  136. if(rst == SUCCESS) 
  137. stOtherTableInfo.iCardStatusMainTableRecordCount += Count;
  138. break;
  139. default: return FORMAT_ERR; //参数错误
  140. }
  141. return rst;
  142. }
  143. unsigned char ReadCardStatusList(unsigned long *plCardSerialNo, //返回的卡系列号
  144.  unsigned int Offset, //位置偏移量
  145.  unsigned char Status) //状态(0:解挂 2:挂失  12:主表挂失)
  146. {
  147. unsigned int iPage; //页地址
  148. unsigned int iAddr; //页内地址
  149. unsigned char rst;
  150. #ifdef _DEBUG
  151. DebugString("Offset=");DebugData(2,2,(unsigned char *)&Offset);    
  152. DebugString("Status=");DebugData(1,1,&Status);    
  153. #endif
  154. switch(Status)
  155. {
  156. case RESUME_LIST: //解挂
  157. if(Offset > 65) return MEMADDR_ERR;
  158. iPage = RESUMECARD_TEMP_PAGEADDR;
  159. break;
  160. case BLACKLIST_TEMP: //挂失临时表
  161. if(Offset > 65) return MEMADDR_ERR;
  162. iPage = CARDSTATE_TEMP_PAGEADDR;
  163. break;
  164. case BLACKLIST_MAIN://主表挂失
  165. iPage = CARDSTATE_START_PAGEADDR;
  166. #ifdef _DEBUG
  167. DebugString("Init iPage=");
  168. DebugData(2,2,(unsigned char *)&iPage);    
  169. #endif
  170. iPage += Offset / 66; //计算具体页地址
  171. if(iPage > CARDSTATE_END_PAGEADDR)
  172. return MEMADDR_ERR;
  173. break;
  174. default: return FORMAT_ERR; //参数错误
  175. }
  176. iAddr = Offset % 66 * 4;//计算具体页内地址
  177. #ifdef _DEBUG
  178. DebugString("iPage=");DebugData(2,2,(unsigned char *)&iPage);    
  179. DebugString("iAddr=");DebugData(2,2,(unsigned char *)&iAddr); 
  180. #endif
  181. rst = Memory_ArrayRead(plCardSerialNo,4,iPage,iAddr);
  182. #ifdef _DEBUG
  183. DebugString("Read DataFlash Result:");DebugData(1,1,&rst);
  184. #endif
  185. return rst;
  186. }
  187. unsigned char IsInCardStatusList(unsigned long lCardSerialNo, 
  188.  unsigned char Status)
  189. {
  190. unsigned long lSerialNo;
  191. short    iMin,iMax; //此处必须用符号数
  192. unsigned int iMid;
  193. unsigned char rst;
  194. #ifdef _DEBUG
  195. DebugString("lCardSerialNo=");
  196. DebugData(4,4,(unsigned char *)&lCardSerialNo);    
  197. DebugString("Status=");
  198. DebugData(1,1,&Status);    
  199. #endif
  200. //取得列表里记录数
  201. switch(Status)
  202. {
  203. case RESUME_LIST: //解挂
  204. iMax = stOtherTableInfo.iResumeCardTempTableRecordCount;
  205. break;
  206. case BLACKLIST_TEMP: //挂失临时表
  207. iMax = stOtherTableInfo.iCardStatusTempTableRecordCount;
  208. break;
  209. case BLACKLIST_MAIN://主表挂失
  210. iMax = stOtherTableInfo.iCardStatusMainTableRecordCount;
  211. break;
  212. default: return FORMAT_ERR; //参数错误
  213. }
  214. #ifdef _DEBUG
  215. DebugString("Record Count=");DebugData(4,4,(unsigned char *)&iMax);    
  216. #endif
  217. iMin=0;
  218. while(iMin < iMax)  //判断终止条件
  219. {
  220. iMid = ((unsigned int)iMin + (unsigned int)iMax) / 2; //中折
  221. #ifdef _DEBUG
  222. DebugString("iMax=");DebugData(2,2,(unsigned char *)&iMax);    
  223. DebugString("iMin=");DebugData(2,2,(unsigned char *)&iMin);    
  224. DebugString("iMid=");DebugData(2,2,(unsigned char *)&iMid);    
  225. #endif
  226. rst = ReadCardStatusList(&lSerialNo,iMid,Status);
  227. #ifdef _DEBUG
  228. DebugString("Current lSerialNo=");
  229. DebugData(4,4,(unsigned char *)&lSerialNo);    
  230. #endif
  231. if(rst != SUCCESS) return rst;//返回出错
  232. if(lSerialNo == lCardSerialNo) //找到当前卡号
  233. return SUCCESS;
  234. else if(lSerialNo < lCardSerialNo) //当前卡列号比黑名单表里的小
  235. iMin = iMid + 1; //继续找后面的数据
  236. else iMax = iMid; //继续找前面的数据
  237. }
  238. #ifdef _DEBUG
  239. DebugString("the Card SerialNo no foundrn");
  240. #endif
  241. return FAILURE; //返回未找到
  242. }
  243. unsigned char FoundCardStatusTable(unsigned long lCardSerialNo)
  244. {
  245. unsigned char rst=FAILURE; //函数返回值
  246. #ifdef _DEBUG
  247. DebugString("stOtherTableInfo Data:rn");
  248. DebugData(sizeof(sttOtherTableInfo),sizeof(sttOtherTableInfo),(unsigned char *)&stOtherTableInfo);
  249. #endif
  250. //查找挂失临时表
  251. #ifdef _DEBUG
  252. DebugString("查找挂失临时表rn");
  253. #endif
  254. rst = IsInCardStatusList(lCardSerialNo,BLACKLIST_TEMP);
  255. if(rst == SUCCESS) return rst; //若在挂失临时表里找到,直接返回
  256. if(rst != FAILURE) return rst; //返回函数操作出错
  257. //查找挂失主表
  258. #ifdef _DEBUG
  259. DebugString("查找挂失主表rn");
  260. #endif
  261. rst = IsInCardStatusList(lCardSerialNo,BLACKLIST_MAIN);
  262. if(rst == SUCCESS) 
  263. { //查找解挂临时表
  264. #ifdef _DEBUG
  265. DebugString("查找解挂临时表rn");
  266. #endif
  267. rst = IsInCardStatusList(lCardSerialNo,RESUME_LIST);
  268. if(rst == SUCCESS)
  269. return FAILURE; //若在解挂临时表里找到,直接返回
  270. else if(rst == FAILURE) return SUCCESS;
  271. }
  272. return rst; //返回没找到(FAILURE)或函数操作出错
  273. }
  274. //=========================自动充值:充值表部分函数==============================
  275. //读取充值限制信息
  276. //pstFillLimitInfo:返回充值限制信息数据结构指针
  277. //返回:见存贮器返回定义
  278. unsigned char ReadFillLimitInfo(sttFillLimitInfo *pstFillLimitInfo)
  279. {
  280. unsigned int iPage,iAddr;
  281. iPage = FILL_LIMIT_INFO_PAGEADDR;
  282. iAddr = 0;
  283. return Memory_ArrayRead(pstFillLimitInfo,sizeof(sttFillLimitInfo),iPage,iAddr);
  284. }
  285. //写充值限制信息
  286. //pstFillLimitInfo:要写入的充值限制信息数据结构指针
  287. //返回:见存贮器返回定义
  288. unsigned char WriteFillLimitInfo(sttFillLimitInfo *pstFillLimitInfo)
  289. {
  290. unsigned int iPage,iAddr;
  291. unsigned char rst;
  292. #ifdef _DEBUG
  293. for(iPage=0;iPage<30;iPage++)
  294. for(iAddr=0;iAddr<60000;iAddr++);
  295. DebugString("sttFillLimitInfo Data:rn");
  296. DebugData(12,12,(unsigned char *)pstFillLimitInfo);
  297. #endif
  298. iPage = FILL_LIMIT_INFO_PAGEADDR;
  299. iAddr = 0;
  300. rst = Write_To_Buffer(pstFillLimitInfo,
  301.   sizeof(sttFillLimitInfo),
  302.   THE_BUFFER_ONE,iAddr);
  303. if(rst != SUCCESS) return rst;
  304. //把Flash的缓冲区数据存到Flash的存贮区上
  305. return Buffer_To_Mem(THE_BUFFER_ONE,iPage);
  306. }
  307. //读充值信息表信息
  308. //iPageIndex: 包系列号0..20030
  309. //cRecordCount: 记录数
  310. //stFillPara[16/17]:充值信息表数据,偶数页为16条,奇数页为17条
  311. //返回:见存贮器返回定义
  312. unsigned char ReadFillPara(unsigned int iPageIndex,
  313.    unsigned char cRecordCount,
  314.    sttFillPara stFillPara[])
  315. {
  316. unsigned int iPage,iAddr;
  317. if(iPageIndex % 2)
  318. {
  319. if(cRecordCount > 17) return FORMAT_ERR; //参数错误
  320. iAddr = 128;
  321. }else{
  322. if(cRecordCount > 16) return FORMAT_ERR; //参数错误
  323. iAddr = 0;
  324. }
  325. iPage = iPageIndex + FILL_INFO_START_PAGEADDR;
  326. if(iPage > FILL_INFO_END_PAGEADDR) return FORMAT_ERR; //参数错误
  327. return Memory_ArrayRead(stFillPara,sizeof(sttFillPara) * cRecordCount,iPage,iAddr);
  328. }
  329. //写充值信息表信息
  330. //iPageIndex: 包系列号0..20030
  331. //cRecordCount: 记录数
  332. //stFillPara[16/17]:充值信息表数据,偶数页为16条,奇数页为17条
  333. //返回:见存贮器返回定义
  334. unsigned char WriteFillPara(unsigned int iPageIndex,
  335.     unsigned char cRecordCount,
  336.     sttFillPara stFillPara[])
  337. {
  338. unsigned int iPage,iAddr;
  339. unsigned char rst;
  340. #ifdef _DEBUG
  341. if(TempCount > 5)
  342. {
  343. for(iPage=0;iPage<30;iPage++)
  344. for(iAddr=0;iAddr<60000;iAddr++);
  345. DebugString("iPageIndex=");DebugData(2,2,(unsigned char*)&iPageIndex);
  346. DebugString("cRecordCount=");DebugData(1,1,&cRecordCount);
  347. DebugString("stFillPara Data:rn");
  348. //DebugData(16,8,(unsigned char *)stFillPara);
  349. DebugData(cRecordCount*sizeof(sttFillPara),sizeof(sttFillPara),(unsigned char *)stFillPara);
  350. }
  351. TempCount++;
  352. #endif
  353. iPage = iPageIndex / 2 + FILL_INFO_START_PAGEADDR;
  354. if(iPage > FILL_INFO_END_PAGEADDR) return FORMAT_ERR; //参数错误
  355. if(iPageIndex % 2)
  356. {
  357. if(cRecordCount > 17) return FORMAT_ERR; //参数错误
  358. iAddr = 128;
  359. }else{
  360. if(cRecordCount > 16) return FORMAT_ERR; //参数错误
  361. iAddr = 0;
  362. }
  363. if(iAddr > 0) 
  364. {
  365. rst = Mem_To_Buffer(THE_BUFFER_ONE,iPage);
  366. if(rst != SUCCESS) return rst;
  367. }
  368. #ifdef _DEBUG
  369. // DebugString("iPage=");DebugData(2,2,(unsigned char *)&iPage);
  370. // DebugString("iAddr=");DebugData(2,2,(unsigned char *)&iAddr);
  371. #endif
  372. rst = Write_To_Buffer(stFillPara,
  373.   sizeof(sttFillPara) * cRecordCount,
  374.   THE_BUFFER_ONE,iAddr);
  375. if(rst != SUCCESS) return rst;
  376. //把Flash的缓冲区数据存到Flash的存贮区上
  377. rst = Buffer_To_Mem(THE_BUFFER_ONE,iPage);
  378. stOtherTableInfo.iFillParaTableRecordCount = (iPageIndex / 2) * 33;
  379. if(iPageIndex % 2) stOtherTableInfo.iFillParaTableRecordCount += 16;
  380. if(rst == SUCCESS)
  381. stOtherTableInfo.iFillParaTableRecordCount += cRecordCount;
  382. return rst;
  383. }
  384. //查找指定卡流水号的充值信息数据
  385. //pstFillPara:传入的卡流水号和返回的具体充值信息数据
  386. //piOffSet:   返回当前卡流水号的充值信息数据所处的位置
  387. //返回:见存贮器返回定义
  388. unsigned char FoundFillPara(sttFillPara *pstFillPara,unsigned int *piOffSet)
  389. {
  390. unsigned int iPage; //页地址
  391. unsigned int iAddr; //页内地址
  392. short iMin,iMax; //此处必须用符号数
  393. unsigned int iMid;
  394. char rst;
  395. sttFillPara xdata stFillParaTemp;
  396. /* for(iPage = FILL_INFO_START_PAGEADDR;iPage < FILL_INFO_START_PAGEADDR + 4; iPage ++)
  397. {
  398. iAddr = 0;iMid=128;
  399. DebugString("iPage=");DebugData(2,2,(unsigned char*)&iPage);
  400. DebugString("iAddr=");DebugData(2,2,(unsigned char*)&iAddr);
  401. rst=Memory_ArrayRead(UART_SendBuffer,iMid,iPage,iAddr);
  402. if(rst == SUCCESS)
  403. DebugData(iMid,8,UART_SendBuffer);
  404. else
  405. DebugString("Read Memory Errorrn");
  406. iAddr = 128;iMid=136;
  407. DebugString("iPage=");DebugData(2,2,(unsigned char*)&iPage);
  408. DebugString("iAddr=");DebugData(2,2,(unsigned char*)&iAddr);
  409. rst=Memory_ArrayRead(UART_SendBuffer,iMid,iPage,iAddr);
  410. if(rst == SUCCESS)
  411. DebugData(iMid,8,UART_SendBuffer);
  412. else
  413. DebugString("Read Memory Errorrn");
  414. }
  415. */
  416. #ifdef _DEBUG
  417. DebugString("sttFillPara Data:");
  418. DebugData(8,8,(unsigned char*)pstFillPara);
  419. DebugString("充值信息表记录数:");
  420. DebugData(2,2,(unsigned char *)&stOtherTableInfo.iFillParaTableRecordCount);
  421. #endif
  422. iMax = stOtherTableInfo.iFillParaTableRecordCount;
  423. iMin = 0;
  424. while(iMin < iMax)  //判断终止条件
  425. {
  426. iMid = ((unsigned int)iMin + (unsigned int)iMax) / 2; //中折
  427. iPage = FILL_INFO_START_PAGEADDR 
  428.     + iMid / FILL_INFO_PAGE_MAX_RECORD_COUNT;
  429. iAddr = iMid % FILL_INFO_PAGE_MAX_RECORD_COUNT 
  430.     * sizeof(sttFillPara);
  431. #ifdef _DEBUG
  432. DebugString("iMax=");DebugData(2,2,(unsigned char *)&iMax);    
  433. DebugString("iMin=");DebugData(2,2,(unsigned char *)&iMin);    
  434. DebugString("iMid=");DebugData(2,2,(unsigned char *)&iMid); 
  435. DebugString("iPage=");DebugData(2,2,(unsigned char *)&iPage);
  436. DebugString("iAddr=");DebugData(2,2,(unsigned char *)&iAddr);
  437. #endif
  438. rst = Memory_ArrayRead(&stFillParaTemp,sizeof(sttFillPara),iPage,iAddr);
  439. if(rst != SUCCESS) 
  440. {
  441. #ifdef _DEBUG
  442. DebugString("Read Order Dinner Parameter From DataFlash Error.rn");
  443. #endif
  444. return rst; //出错返回
  445. }
  446. #ifdef _DEBUG
  447. DebugString("Current Record Data:");
  448. DebugData(8,8,(unsigned char*)&stFillParaTemp);
  449. #endif
  450. rst = memcmp(pstFillPara->CardIndex, stFillParaTemp.CardIndex, 3);
  451. if(rst == 0)
  452. {
  453. memcpy(pstFillPara,&stFillParaTemp,sizeof(sttFillPara));
  454. *piOffSet = iMid;
  455. return SUCCESS;
  456. }
  457. else if(rst > 0) iMin = iMid + 1; else iMax = iMid;
  458. }
  459. return UNALLOWED_CARDCLASS;
  460. }
  461. //更新充值表信息状态字为已充值状态
  462. //iOffSet:要修改的记录偏移量,即当前记录位置
  463. unsigned char UpdateFillParaStatus(unsigned int iOffSet)
  464. {
  465. unsigned int idata iPage,iAddr;
  466. unsigned char rst,i;
  467. iPage = FILL_INFO_START_PAGEADDR 
  468. + iOffSet / FILL_INFO_PAGE_MAX_RECORD_COUNT;
  469. iAddr = iOffSet % FILL_INFO_PAGE_MAX_RECORD_COUNT 
  470. * sizeof(sttFillPara) + sizeof(sttFillPara) - 1;
  471. for(i=0;i<3;i++)
  472. {
  473. rst = Mem_To_Buffer(THE_BUFFER_ONE,iPage);
  474. if(rst != SUCCESS) continue;
  475. rst = 0;
  476. rst = Write_To_Buffer(&rst,1,THE_BUFFER_ONE,iAddr);
  477. if(rst != SUCCESS) continue;
  478. //把Flash的缓冲区数据存到Flash的存贮区上
  479. rst = Buffer_To_Mem(THE_BUFFER_ONE,iPage);
  480. if(rst != SUCCESS) continue;
  481. }
  482. return rst;
  483. }