📄 rc522.lst
字号:
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE RC522
OBJECT MODULE PLACED IN RC522.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RC522.C
stmt level source
1 #include <intrins.h>
2 #include "lpcreg.h"
3 #include "main.h"
4 #include "mfrc522.h"
5 #define MAXRLEN 18
6
7 /////////////////////////////////////////////////////////////////////
8 //功 能:寻卡
9 //参数说明: req_code[IN]:寻卡方式
10 // 0x52 = 寻感应区内所有符合14443A标准的卡
11 // 0x26 = 寻未进入休眠状态的卡
12 // pTagType[OUT]:卡片类型代码
13 // 0x4400 = Mifare_UltraLight
14 // 0x0400 = Mifare_One(S50)
15 // 0x0200 = Mifare_One(S70)
16 // 0x0800 = Mifare_Pro(X)
17 // 0x4403 = Mifare_DESFire
18 //返 回: 成功返回MI_OK
19 /////////////////////////////////////////////////////////////////////
20 char PcdRequest(unsigned char req_code,unsigned char *pTagType)
21 {
22 1 char status;
23 1 unsigned int unLen;
24 1 unsigned char ucComMF522Buf[MAXRLEN];
25 1 // unsigned char xTest ;
26 1 ClearBitMask(Status2Reg,0x08);
27 1 WriteRawRC(BitFramingReg,0x07);
28 1
29 1 // xTest = ReadRawRC(BitFramingReg);
30 1 // if(xTest == 0x07 )
31 1 // { LED_GREEN =0 ;}
32 1 // else {LED_GREEN =1 ;while(1){}}
33 1 SetBitMask(TxControlReg,0x03);
34 1
35 1 ucComMF522Buf[0] = req_code;
36 1
37 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
38 1 // if(status == MI_OK )
39 1 // { LED_GREEN =0 ;}
40 1 // else {LED_GREEN =1 ;}
41 1 if ((status == MI_OK) && (unLen == 0x10))
42 1 {
43 2 *pTagType = ucComMF522Buf[0];
44 2 *(pTagType+1) = ucComMF522Buf[1];
45 2 }
46 1 else
47 1 { status = MI_ERR; }
48 1
49 1 return status;
50 1 }
51
52 /////////////////////////////////////////////////////////////////////
53 //功 能:防冲撞
54 //参数说明: pSnr[OUT]:卡片序列号,4字节
55 //返 回: 成功返回MI_OK
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 2
56 /////////////////////////////////////////////////////////////////////
57 char PcdAnticoll(unsigned char *pSnr)
58 {
59 1 char status;
60 1 unsigned char i,snr_check=0;
61 1 unsigned int unLen;
62 1 unsigned char ucComMF522Buf[MAXRLEN];
63 1
64 1
65 1 ClearBitMask(Status2Reg,0x08);
66 1 WriteRawRC(BitFramingReg,0x00);
67 1 ClearBitMask(CollReg,0x80);
68 1
69 1 ucComMF522Buf[0] = PICC_ANTICOLL1;
70 1 ucComMF522Buf[1] = 0x20;
71 1
72 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
73 1
74 1 if (status == MI_OK)
75 1 {
76 2 for (i=0; i<4; i++)
77 2 {
78 3 *(pSnr+i) = ucComMF522Buf[i];
79 3 snr_check ^= ucComMF522Buf[i];
80 3 }
81 2 if (snr_check != ucComMF522Buf[i])
82 2 { status = MI_ERR; }
83 2 }
84 1
85 1 SetBitMask(CollReg,0x80);
86 1 return status;
87 1 }
88
89 /////////////////////////////////////////////////////////////////////
90 //功 能:选定卡片
91 //参数说明: pSnr[IN]:卡片序列号,4字节
92 //返 回: 成功返回MI_OK
93 /////////////////////////////////////////////////////////////////////
94 char PcdSelect(unsigned char *pSnr)
95 {
96 1 char status;
97 1 unsigned char i;
98 1 unsigned int unLen;
99 1 unsigned char ucComMF522Buf[MAXRLEN];
100 1
101 1 ucComMF522Buf[0] = PICC_ANTICOLL1;
102 1 ucComMF522Buf[1] = 0x70;
103 1 ucComMF522Buf[6] = 0;
104 1 for (i=0; i<4; i++)
105 1 {
106 2 ucComMF522Buf[i+2] = *(pSnr+i);
107 2 ucComMF522Buf[6] ^= *(pSnr+i);
108 2 }
109 1 CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
110 1
111 1 ClearBitMask(Status2Reg,0x08);
112 1
113 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
114 1
115 1 if ((status == MI_OK) && (unLen == 0x18))
116 1 { status = MI_OK; }
117 1 else
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 3
118 1 { status = MI_ERR; }
119 1
120 1 return status;
121 1 }
122
123 /////////////////////////////////////////////////////////////////////
124 //功 能:验证卡片密码
125 //参数说明: auth_mode[IN]: 密码验证模式
126 // 0x60 = 验证A密钥
127 // 0x61 = 验证B密钥
128 // addr[IN]:块地址
129 // pKey[IN]:密码
130 // pSnr[IN]:卡片序列号,4字节
131 //返 回: 成功返回MI_OK
132 /////////////////////////////////////////////////////////////////////
133 char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
134 {
135 1 char status;
136 1 unsigned int unLen;
137 1 unsigned char i,ucComMF522Buf[MAXRLEN];
138 1
139 1 ucComMF522Buf[0] = auth_mode;
140 1 ucComMF522Buf[1] = addr;
141 1 for (i=0; i<6; i++)
142 1 { ucComMF522Buf[i+2] = *(pKey+i); }
143 1 for (i=0; i<6; i++)
144 1 { ucComMF522Buf[i+8] = *(pSnr+i); }
145 1 // memcpy(&ucComMF522Buf[2], pKey, 6);
146 1 // memcpy(&ucComMF522Buf[8], pSnr, 4);
147 1
148 1 status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
149 1 if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
150 1 { status = MI_ERR; }
151 1
152 1 return status;
153 1 }
154
155 /////////////////////////////////////////////////////////////////////
156 //功 能:读取M1卡一块数据
157 //参数说明: addr[IN]:块地址
158 // pData[OUT]:读出的数据,16字节
159 //返 回: 成功返回MI_OK
160 /////////////////////////////////////////////////////////////////////
161 char PcdRead(unsigned char addr,unsigned char *pData)
162 {
163 1 char status;
164 1 unsigned int unLen;
165 1 unsigned char i,ucComMF522Buf[MAXRLEN];
166 1
167 1 ucComMF522Buf[0] = PICC_READ;
168 1 ucComMF522Buf[1] = addr;
169 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
170 1
171 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
172 1 if ((status == MI_OK) && (unLen == 0x90))
173 1 // { memcpy(pData, ucComMF522Buf, 16); }
174 1 {
175 2 for (i=0; i<16; i++)
176 2 { *(pData+i) = ucComMF522Buf[i]; }
177 2 }
178 1 else
179 1 { status = MI_ERR; }
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 4
180 1
181 1 return status;
182 1 }
183
184 /////////////////////////////////////////////////////////////////////
185 //功 能:写数据到M1卡一块
186 //参数说明: addr[IN]:块地址
187 // pData[IN]:写入的数据,16字节
188 //返 回: 成功返回MI_OK
189 /////////////////////////////////////////////////////////////////////
190 char PcdWrite(unsigned char addr,unsigned char *pData)
191 {
192 1 char status;
193 1 unsigned int unLen;
194 1 unsigned char i,ucComMF522Buf[MAXRLEN];
195 1
196 1 ucComMF522Buf[0] = PICC_WRITE;
197 1 ucComMF522Buf[1] = addr;
198 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
199 1
200 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
201 1
202 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
203 1 { status = MI_ERR; }
204 1
205 1 if (status == MI_OK)
206 1 {
207 2 //memcpy(ucComMF522Buf, pData, 16);
208 2 for (i=0; i<16; i++)
209 2 { ucComMF522Buf[i] = *(pData+i); }
210 2 CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
211 2
212 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
213 2 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -