📄 mfrc500c.lst
字号:
217 ****************************************************************************/
218 char Mf500PiccAnticoll (unsigned char bcnt,
219 unsigned char *snr)
220 {
221 1 return Mf500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
222 1 }
223
224 char Mf500PiccCascAnticoll (unsigned char select_code,
225 unsigned char bcnt,
226 unsigned char *snr)
227 {
228 1 char status = MI_OK;
229 1 char snr_in[4]; // copy of the input parameter snr
230 1 char nbytes = 0; // how many bytes received
231 1 char nbits = 0; // how many bits received
232 1 char complete = 0; // complete snr recived
233 1 char i = 0;
234 1 char byteOffset = 0;
235 1 unsigned char snr_crc; // check byte calculation
236 1 unsigned char snr_check;
237 1 unsigned char dummyShift1; // dummy byte for snr shift
238 1 unsigned char dummyShift2; // dummy byte for snr shift
239 1
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 5
240 1
241 1
242 1 PcdSetTmo(2);
243 1
244 1 memcpy(snr_in,snr,4);
245 1
246 1 WriteRC(RegDecoderControl,0x28); // ZeroAfterColl aktivieren
247 1 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
248 1
249 1 complete=0;
250 1 while (!complete && (status == MI_OK) )
251 1 {
252 2 ResetInfo();
253 2 WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
254 2 nbits = bcnt % 8;
255 2 if (nbits)
256 2 {
257 3 WriteRC(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
258 3 nbytes = bcnt / 8 + 1;
259 3 if (nbits == 7 )
260 3 {
261 4 MInfo.cmd = PICC_ANTICOLL1; // pass command flag to ISR
262 4 WriteRC(RegBitFraming,nbits); // reset RxAlign to zero
263 4 }
264 3 }
265 2 else
266 2 {
267 3 nbytes = bcnt / 8;
268 3 }
269 2
270 2 MSndBuffer[0] = select_code;
271 2 MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
272 2
273 2 for (i = 0; i < nbytes; i++) // Sende Buffer beschreiben
274 2 {
275 3 MSndBuffer[i + 2] = snr_in[i];
276 3 }
277 2 MInfo.nBytesToSend = 2 + nbytes;
278 2 status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
279 2
280 2 // in order to solve an inconsistancy in the anticollision sequence
281 2 // (will be solved soon), the case of 7 bits has to be treated in a
282 2 // separate way
283 2 if (nbits == 7)
284 2 {
285 3 // reorder received bits
286 3 dummyShift1 = 0x00;
287 3 for (i = 0; i < MInfo.nBytesReceived; i++)
288 3 {
289 4 dummyShift2 = MRcvBuffer[i];
290 4 MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
291 4 dummyShift1 = dummyShift2;
292 4 }
293 3 MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
294 3 // recalculation of collision position
295 3 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
296 3 }
297 2 if ( status == MI_OK || status == MI_COLLERR) // no other occured
298 2 {
299 3 // R e s p o n s e P r o c e s s i n g
300 3 if ( MInfo.nBitsReceived != 40) // not 5 bytes answered
301 3 {
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 6
302 4 status = MI_BITCOUNTERR;
303 4 }
304 3 else
305 3 {
306 4 byteOffset = 0;
307 4 if ( nbits != 0 ) // last byte was not complete
308 4 {
309 5 snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
310 5 byteOffset = 1;
311 5 }
312 4 for ( i =0; i < (4 - nbytes); i++)
313 4 {
314 5 snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
315 5 }
316 4
317 4 if (status != MI_COLLERR ) // no error and no collision
318 4 {
319 5 // SerCh check
320 5 snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
321 5
322 5 snr_check = MRcvBuffer[4];
323 5 if (snr_crc != snr_check)
324 5 {
325 6 status = MI_SERNRERR;
326 6 }
327 5 else
328 5 {
329 6 complete = 1;
330 6 }
331 5 }
332 4 else // collision occured
333 4 {
334 5 bcnt = bcnt + MInfo.collPos - nbits;
335 5 status = MI_OK;
336 5 }
337 4 }
338 3
339 3 }
340 2 }
341 1 if (status == MI_OK)
342 1 {
343 2 for(i=0;i<4;i++)
344 2 {
345 3 // csn[i]=MRcvBuffer[i];
346 3 snr[i]=MRcvBuffer[i];
347 3 }
348 2
349 2 }
350 1 else
351 1 {
352 2 _nop_();
353 2 }
354 1
355 1 ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
356 1
357 1 return status;
358 1 }
359
360
361
362 /*
363 ///////////////////////////////////////////////////////////////////////
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 7
364 // M I F A R E A U T H E N T I C A T I O N
365 // calling compatible version
366 ///////////////////////////////////////////////////////////////////////
367 char Mf500PiccAuth(unsigned char key_type, // PICC_AUTHENT1A or PICC_AUTHENT1B
368 unsigned char key_addr, // key address in reader storage
369 unsigned char block) // block number which should be
370 // authenticated
371 {
372 char status = MI_OK;
373
374 status = Mf500PiccAuthE2( key_type,
375 MLastSelectedSnr,
376 key_addr,
377 block);
378 return status;
379 }
380
381 ///////////////////////////////////////////////////////////////////////
382 // A U T H E N T I C A T I O N
383 // W I T H K E Y S F R O M E 2 P R O M
384 ///////////////////////////////////////////////////////////////////////
385 char Mf500PiccAuthE2( unsigned char auth_mode, // PICC_AUTHENT1A or PICC_AUTHENT1B
386 unsigned char *snr, // 4 bytes card serial number
387 unsigned char key_sector, // 0 <= key_sector <= 15
388 unsigned char block) // 0 <= block <= 256
389 {
390 char status = MI_OK;
391 char i;
392 // eeprom address calculation
393 // 0x80 ... offset
394 // key_sector ... sector
395 // 0x18 ... 2 * 12 = 24 = 0x18
396 unsigned short e2addr = 0x80 + key_sector * 0x18;
397 unsigned char *e2addrbuf = (unsigned char*)&e2addr;
398
399 PcdSetTmo(2);
400 if (auth_mode == PICC_AUTHENT1B)
401 e2addr += 12; // key B offset
402 FlushFIFO(); // empty FIFO
403 ResetInfo();
404
405 //memcpy(MSndBuffer,e2addrbuf,2); // write low and high byte of address
406 for(i=0;i<2;i++) MSndBuffer[i]=e2addrbuf[i];
407 MInfo.nBytesToSend = 2;
408 // write load command
409 if ((status=PcdSingleResponseCmd(PCD_LOADKEYE2)) == MI_OK)
410 {
411 // execute authentication
412 status = Mf500PiccAuthState(auth_mode,snr,block);
413 }
414 return status;
415 }
416 */
417 ///////////////////////////////////////////////////////////////////////
418 // C O D E K E Y S 将密钥转换成RC500格式
419 ///////////////////////////////////////////////////////////////////////
420 char Mf500HostCodeKey( unsigned char *uncoded, // 6 bytes key value uncoded
421 unsigned char *coded) // 12 bytes key value coded
422 {
423 1 char status = MI_OK;
424 1 unsigned char cnt = 0;
425 1 unsigned char ln = 0; // low nibble
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 8
426 1 unsigned char hn = 0; // high nibble
427 1
428 1 for (cnt = 0; cnt < 6; cnt++)
429 1 {
430 2 ln = uncoded[cnt] & 0x0F;
431 2 hn = uncoded[cnt] >> 4;
432 2 coded[cnt * 2 + 1] = (~ln << 4) | ln;
433 2 coded[cnt * 2 ] = (~hn << 4) | hn;
434 2
435 2 }
436 1 return MI_OK;
437 1 }
438
439 ///////////////////////////////////////////////////////////////////////
440 //认证操作函数
441 //MCU将运算获得的数据,急复娲⒌娇ㄆ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -