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

RFID编程

开发平台:

C/C++

  1. #include <Reg52.H>
  2. #include <string.h>
  3. #include <INTRINS.H>
  4. #include "RfModuleFunc.H"
  5. //各延时定义
  6. #define DELAY_TIME0 100
  7. #define DELAY_TIME1 2500
  8. #define DELAY_TIME2 3000
  9. #define DELAY_TIME3 55000
  10. #define SPI_CMD_GET_VERSION 0x32 //读机内版本号
  11. #define SPI_CMD_GET_INFO 0x34 //读取RF模块固件信息序列号
  12. #define SPI_CMD_SET_CONTROL_BIT 0x50 //设置RC500中的控制位
  13. #define SPI_CMD_CLR_CONTROL_BIT 0x51 //清除RC500中的控制位
  14. #define SPI_CMD_BUZZER 0x60 //输出驱动无源蜂鸣器信号
  15. //Mifare模块基本命令部分
  16. #define SPI_CMD_MIFARE_CONFIG 0x52 //复位且配置RC500
  17. #define SPI_CMD_MIFARE_CLOSE 0x3F //关闭RC500,使读写模块进入掉电模式
  18. #define SPI_CMD_MIFARE_REQUEST 0x41 //寻卡
  19. #define SPI_CMD_MIFARE_ANTICOLL 0x42 //防冲突
  20. #define SPI_CMD_MIFARE_ANTICOLL2 0x71 //防冲突2,允许多张卡进入
  21. #define SPI_CMD_MIFARE_SELECT 0x43 //选择卡
  22. #define SPI_CMD_MIFARE_AUTH 0x44 //开始校验密钥
  23. #define SPI_CMD_MIFARE_AUTH2 0x72 //可选择密钥区验证
  24. #define SPI_CMD_MIFARE_AUTHKEY 0x73 //直接校验密钥
  25. #define SPI_CMD_MIFARE_HALT_CARD 0x45 //停止当前卡
  26. #define SPI_CMD_MIFARE_READ 0x46 //读卡
  27. #define SPI_CMD_MIFARE_WRITE 0x47 //写卡
  28. #define SPI_CMD_MIFARE_INC 0x48 //增值操作
  29. #define SPI_CMD_MIFARE_DEC 0x49 //减值操作
  30. #define SPI_CMD_MIFARE_RESORE 0x4A //将所访问单元块的字节数保存在卡的内部寄存器中
  31. #define SPI_CMD_MIFARE_TRANS 0x4B //将卡内部寄存器的内容转输到访问快的字节数
  32. #define SPI_CMD_MIFARE_VALUE 0x70 //增减值操作
  33. #define SPI_CMD_MIFARE_LOADKEY 0x4C //改变存贮在EEPROM 中的密钥
  34. #define SPI_CMD_MIFARE_RESET_CARD 0x4E //关闭天线输出数ms 使卡复位
  35. #define SPI_CMD_MIFARE_AUTHE2KEY 0x56 //从Mifare模块的E2校验密钥
  36. #define SPI_CMD_MIFARE_CHECK_WRITE 0x53 //将所传送的数据和上一次所写的数据进行比较
  37. #define SPI_CMD_MIFARE_READ_E2 0x61 //读RC500 内EEPROM 的内容
  38. #define SPI_CMD_MIFARE_WRITE_E2 0x62 //写数据到RC500 内EEPROM
  39. //卡操作命令部分
  40. #define SPI_CMD_SET_CARD_APP_SECTOR 0x80 //设置卡扇区应用参数
  41. #define SPI_CMD_GET_CARD_APP_SECTOR 0x81 //读取卡扇区应用参数
  42. #define SPI_CMD_SET_BASE_KEY 0x82 //设置基密钥
  43. #define SPI_CMD_GET_BASE_KEY 0x83 //读取基密钥
  44. #define SPI_CMD_GET_CARD_KEY 0x84 //取得卡密钥
  45. #define SPI_CMD_IS_CARD_IN 0x85 //是否有卡进入读卡区
  46. #define SPI_CMD_READ_COMPANY_INFO 0x86 //读卡上公司信息
  47. #define SPI_CMD_READ_CARDHOLDER_INFO 0x87 //读卡上持卡人信息
  48. #define SPI_CMD_READ_BUSINESS_INFO 0x88 //读卡上交易数据(含卡恢复流程)
  49. #define SPI_CMD_CONSUME 0x89 //消费
  50. #define SPI_CMD_FILL 0x8A //充值
  51. #define SPI_CMD_READ_ORDER_DINNER_INFO 0x8B //读卡上订餐信息
  52. #define SPI_CMD_WRITE_ORDER_DINNER_INFO 0x8C //写订餐信息到卡上
  53. #define SPI_CMD_READ_TIME_COUNT_INFO 0x8D //读卡上计时消费信息
  54. #define SPI_CMD_WRITE_TIME_COUNT_INFO 0x8E //写计时消费信息到卡上
  55. #define SPI_CMD_SET_CARD_STATE 0x8F //设置卡状态
  56. //============================管脚定义====================================
  57. sbit   RF_RST   =  P2^6;
  58. sbit   RF_CS    =  P3^2;       //INT0
  59. sbit   RF_SCLK  =  P3^5;
  60. sbit   RF_SDAT  =  P3^4;
  61. #define   RF_OPEN()  IE0=0;EX0=1;
  62. #define   RF_CLOSE() EX0=0;
  63. //============================常量定义================================
  64. #define RF_BUFFER_MAX_ZIAE 64 //不能超255,否则需加长度字节数
  65. unsigned char pdata  Rf_Buffer[RF_BUFFER_MAX_ZIAE];
  66. bit  newdata  = 0;
  67. //BCC校验计算
  68. unsigned char GetBCC(unsigned char *Buffer, unsigned char Len)
  69. {
  70. unsigned char value=0;
  71. while(Len--)
  72. {
  73. value ^= *Buffer;
  74. Buffer++;
  75. }
  76. return ~value;
  77. }
  78. //外部提供延时1ms的子程序
  79. //extern Delay1ms(unsigned char _1ms);
  80. extern void  do_nop(unsigned char Count);
  81. void  Rf_Int0(void) interrupt 0 using 1  //rf_rcv(Rf_Buffer);
  82. {
  83.    unsigned char  Rf_count;
  84.    unsigned char  i,j,ch;
  85.    RF_SCLK = 0;
  86.    RF_SDAT = 1;
  87.    for(i=10;i--;);//delay;
  88.    Rf_count= 0;
  89.    while(!RF_CS)
  90.    {
  91.     for(i=0;i<8;i++)
  92.       {
  93.    RF_SCLK = 1;ch <<=1;
  94.    ch |= RF_SDAT;for(j=2;j--;);//delay;
  95.    RF_SCLK = 0;for(j=2;j--;);//delay;
  96.   }
  97. Rf_Buffer[Rf_count]= ch;
  98. if(++Rf_count>=RF_BUFFER_MAX_ZIAE)break;
  99.    }
  100.    RF_SDAT = 0;
  101.    newdata = 1;
  102. }
  103. void  Rf_Init(void)
  104. {
  105. EA  =  0;
  106. IP  &= ~0X01;     //X0优先级0
  107. //IPH &= ~0X01;
  108. IT0 = 1;        //INT1 is falling edg trig
  109. EA  =  1;
  110. RF_CS   = 1;
  111. RF_SCLK = 0;
  112. RF_SDAT = 0;
  113. // 模块复位(模块已由外部阻容电路复位)
  114. // RF_RST = 0; Delay1ms(45);
  115. // RF_RST = 1; Delay1ms(45);
  116. }
  117. unsigned char  Rf_Send(unsigned char *buf,unsigned char Count)
  118. {
  119.     unsigned char  i,j,ch;
  120. RF_CLOSE();
  121. RF_SDAT  = 1;
  122. RF_SCLK  = 0;
  123.     i=200;
  124.     while(RF_SDAT) i--;
  125. if(!i) return(RF_ERR);
  126. RF_CS  = 0;
  127.     i=200;
  128.     while(!RF_SDAT) i--;
  129. if(!i) return(RF_ERR);
  130. for(i=0;i<Count;i++)
  131.     {
  132.  ch=buf[i];
  133.  for(j=0;j<8;j++)
  134.   {
  135.    RF_SDAT = (bit)(ch&0x80);do_nop(1);
  136.    RF_SCLK = 1;do_nop(3);
  137.    RF_SCLK = 0;ch<<=1;do_nop(1);
  138.   }
  139. }
  140. RF_CS    = 1;
  141. RF_SDAT  = 0;
  142. //TR1    = 0;
  143.     return(MI_OK);
  144. }
  145. unsigned char Rf_Command(unsigned int DelayTime)
  146. {
  147. unsigned char Len,BCC_Value;
  148. Len = Rf_Buffer[LENGTH] + 3; //计算总长度
  149. Rf_Buffer[Len]=GetBCC(Rf_Buffer,Len); //计算BCC
  150. if(Rf_Send(Rf_Buffer,Len+1)!=MI_OK) return RF_ERR;   
  151. RF_OPEN();
  152. while(!newdata && DelayTime)  DelayTime--;
  153. RF_CLOSE();
  154. if(newdata==0)  return RF_ERR;  //接收超时判断
  155. newdata=0;
  156. Len = Rf_Buffer[LENGTH] + 3; //计算总长度(不含BCC)
  157. BCC_Value=GetBCC(Rf_Buffer,Len); //计算BCC
  158.     if(BCC_Value == Rf_Buffer[Len])
  159. return RF_OK;
  160. return MI_CRCERR;
  161. }
  162. //=========================卡操作基本函数=================================
  163. unsigned char mifs_request(unsigned char _Mode,unsigned char *_TagType)
  164. {
  165. Rf_Buffer[SEQNR]=1;
  166. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_REQUEST;
  167. Rf_Buffer[LENGTH]=0x01;
  168. Rf_Buffer[MODE]=_Mode;
  169. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  170. if(Rf_Buffer[STATUS]==MI_OK)
  171. {
  172.   _TagType[0]=Rf_Buffer[TAGTYPE];
  173.   _TagType[1]=Rf_Buffer[TAGTYPE+1];
  174. }
  175. return Rf_Buffer[STATUS];
  176. }
  177. unsigned char mifs_anticoll(unsigned char _Bcnt,unsigned char *_SNR)
  178. {
  179. Rf_Buffer[SEQNR]=1;
  180. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_ANTICOLL;
  181. Rf_Buffer[LENGTH]=0x01;
  182. Rf_Buffer[MODE]=_Bcnt;
  183. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  184. if(Rf_Buffer[STATUS]==MI_OK)
  185. {
  186. memcpy(_SNR,&Rf_Buffer[SERNR],4);
  187. }
  188. return Rf_Buffer[STATUS];
  189. }
  190. unsigned char mifs_select(unsigned char *_SNR,unsigned char *_Size)
  191. {
  192. Rf_Buffer[SEQNR]=1;
  193. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_SELECT;
  194. Rf_Buffer[LENGTH]=0x04;
  195. memcpy(&Rf_Buffer[SERNR],_SNR,4);
  196. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  197. if(Rf_Buffer[STATUS]==MI_OK)
  198. {
  199. *_Size=Rf_Buffer[SIZE];
  200. }
  201. return Rf_Buffer[STATUS];
  202. }
  203. unsigned char mifs_authentication(unsigned char _Mode,unsigned char _SecNr)
  204. {
  205. Rf_Buffer[SEQNR]=1;
  206. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_AUTH;
  207. Rf_Buffer[LENGTH]=0x02;
  208. Rf_Buffer[MODE]=_Mode;
  209. Rf_Buffer[SECNR]=_SecNr;
  210. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  211. return Rf_Buffer[STATUS];
  212. }
  213. unsigned char mifs_halt(void)
  214. {
  215. Rf_Buffer[SEQNR]=0;
  216. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_HALT_CARD;
  217. Rf_Buffer[LENGTH]=0x00;
  218. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  219. return Rf_Buffer[STATUS];
  220. }
  221. unsigned char mifs_read(unsigned char _Adr,unsigned char *_Data)
  222. {
  223. Rf_Buffer[SEQNR]=0;
  224. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_READ;
  225. Rf_Buffer[LENGTH]=0x01;
  226. Rf_Buffer[ADR]=_Adr;
  227. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  228. if(Rf_Buffer[STATUS]==MI_OK)
  229. memcpy(_Data,&Rf_Buffer[DATABYTES-1],16);
  230. return Rf_Buffer[STATUS];
  231. }
  232. unsigned char mifs_load_key(unsigned char _Mode,unsigned char _SecNr,unsigned char *_Nkey)
  233. {
  234. Rf_Buffer[SEQNR]=0;
  235. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_LOADKEY;
  236. Rf_Buffer[LENGTH]=0x08;
  237. Rf_Buffer[MODE]=_Mode;
  238. Rf_Buffer[SECNR]=_SecNr;
  239. memcpy(&Rf_Buffer[NKEY],_Nkey,6);
  240. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  241. return Rf_Buffer[STATUS];
  242. }
  243. unsigned char mifs_reset(unsigned char _Msec)
  244. {
  245. Rf_Buffer[SEQNR]=0;
  246. Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_RESET_CARD;
  247. Rf_Buffer[LENGTH]=1;
  248. Rf_Buffer[TIME]=_Msec;
  249. if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
  250. return Rf_Buffer[STATUS];
  251. }
  252. char SetCardApplicationSector(sttCardStruct *pstCardStruct)
  253. {
  254. Rf_Buffer[SEQNR]=0;
  255. Rf_Buffer[COMMAND]=SPI_CMD_SET_CARD_APP_SECTOR;
  256. Rf_Buffer[LENGTH]=16;
  257. memcpy(&Rf_Buffer[DATA],pstCardStruct,16);
  258. if(Rf_Command(DELAY_TIME0)!=MI_OK)return RF_ERR;
  259. return Rf_Buffer[STATUS];
  260. }
  261. char ReadCardholderInfo(unsigned char CardSerialNo[],
  262. unsigned char AuthMode,
  263. unsigned char Key[],
  264.     sttCardholderInfo *pstCardholderInfo)
  265. {
  266. Rf_Buffer[SEQNR]=0;
  267. Rf_Buffer[COMMAND]=SPI_CMD_READ_CARDHOLDER_INFO;
  268. Rf_Buffer[LENGTH]=11;
  269. memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
  270. Rf_Buffer[DATA+4] = AuthMode;
  271. memcpy(&Rf_Buffer[DATA+5],Key,6);
  272. if(Rf_Command(DELAY_TIME2)!=MI_OK) return RF_ERR;
  273. if(Rf_Buffer[STATUS]==MI_OK)
  274. memcpy(pstCardholderInfo,&Rf_Buffer[DATA],41);
  275. return Rf_Buffer[STATUS];
  276. }
  277. char ReadBusinessInfo(unsigned char CardSerialNo[],
  278.   unsigned char AuthMode,
  279.   unsigned char Key[],
  280.   sttBusinessInfo *pstBusinessInfo)
  281. {
  282. Rf_Buffer[SEQNR]=0;
  283. Rf_Buffer[COMMAND]=SPI_CMD_READ_BUSINESS_INFO;
  284. Rf_Buffer[LENGTH]=23;
  285. memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
  286. Rf_Buffer[DATA+4] = AuthMode;
  287. memcpy(&Rf_Buffer[DATA+5],Key,18);
  288. if(Rf_Command(DELAY_TIME3)!=MI_OK) return RF_ERR;
  289. if(Rf_Buffer[STATUS]==MI_OK)
  290. memcpy(pstBusinessInfo,&Rf_Buffer[DATA],44);
  291. return Rf_Buffer[STATUS];
  292. }
  293. char SetCardState(unsigned char CardSerialNo[],
  294.   unsigned char AuthMode,
  295.       unsigned char Key[],
  296.   unsigned char State)
  297. {
  298. Rf_Buffer[SEQNR]=0;
  299. Rf_Buffer[COMMAND]=SPI_CMD_SET_CARD_STATE;
  300. Rf_Buffer[LENGTH]=12;
  301. memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
  302. Rf_Buffer[DATA+4] = AuthMode;
  303. memcpy(&Rf_Buffer[DATA+5],Key,6);
  304. Rf_Buffer[DATA+11] = State;
  305. if(Rf_Command(DELAY_TIME2)!=MI_OK) return RF_ERR;
  306. return Rf_Buffer[STATUS];
  307. }
  308. char Fill(unsigned char CardSerialNo[], 
  309.   sttBusinessInfo *pstBusinessInfo)
  310. {
  311. Rf_Buffer[SEQNR]=0;
  312. Rf_Buffer[COMMAND]=SPI_CMD_FILL;
  313. Rf_Buffer[LENGTH]=20;
  314. memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
  315. memcpy(&Rf_Buffer[DATA+4],&pstBusinessInfo->stFillInfo,18);
  316. if(Rf_Command(DELAY_TIME3)!=MI_OK) return RF_ERR;
  317. if(Rf_Buffer[STATUS]==MI_OK)
  318. memcpy(pstBusinessInfo,&Rf_Buffer[DATA],22);
  319. return Rf_Buffer[STATUS];
  320. }