Помогите с RFID Mifare RC522 module
- 1
- 2
- 3
- 4
- 5
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
Чт, 21/02/2013 - 09:59
Купил такую штуку на ebay. Может программировать/считывать rfid карты
Не могу разобраться с подключением к arduino uno и не нашел никакого внятного объяснения как заставить эту штуку работать. Может кто из форумчан работал с таким устройством. Помогите, а?
RC522 UNO
MISO --> 12
SCK --> 13
SS --> 10
MOSI --> 11
GND --> GND
3.3V --> 3.3V
RST --> RESET
пример кода
http://www.grantgibson.co.uk/blog/2012/04/how-to-get-started-with-the-mifare-mf522-an-and-arduino/
Спасибо, работает
Доброго времени суток, Господа!
Купил тот же комплект, за исключением того, что у меня мега2560, а не уно! Как его запустить?
На меге http://arduino.cc/en/Main/arduinoBoardMega2560
RC522 UNO
MISO --> 50
SCK --> 52
SS --> 53
MOSI --> 51
GND --> GND
3.3V --> 3.3V
RST --> RESET
в место 53 любой пин на задать отдельно нужно
Спасибо!
Запустил считыватель с стандартным скетчем.
Только все коменты на китайском...
001
/*
002
* 文 件 名:RFID.pde
003
* 创 建 者:Dr.Leong ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
004
* 创建日期:2011.09.19
005
* 修 改 者:
006
* 修改日期:
007
* 功能描述:Mifare1 寻卡→防冲突→选卡→读写 接口
008
*/
009
// the sensor communicates using SPI, so include the library:
010
#include <SPI.h>
011
012
#define uchar unsigned char
013
#define uint unsigned int
014
015
//数组最大长度
016
#define MAX_LEN 16
017
018
/////////////////////////////////////////////////////////////////////
019
//set the pin
020
/////////////////////////////////////////////////////////////////////
021
const
int
chipSelectPin = 53;
022
const
int
NRSTPD = 5;
023
024
//MF522命令字
025
#define PCD_IDLE 0x00 //NO action;取消当前命令
026
#define PCD_AUTHENT 0x0E //验证密钥
027
#define PCD_RECEIVE 0x08 //接收数据
028
#define PCD_TRANSMIT 0x04 //发送数据
029
#define PCD_TRANSCEIVE 0x0C //发送并接收数据
030
#define PCD_RESETPHASE 0x0F //复位
031
#define PCD_CALCCRC 0x03 //CRC计算
032
033
//Mifare_One卡片命令字
034
#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态
035
#define PICC_REQALL 0x52 //寻天线区内全部卡
036
#define PICC_ANTICOLL 0x93 //防冲撞
037
#define PICC_SElECTTAG 0x93 //选卡
038
#define PICC_AUTHENT1A 0x60 //验证A密钥
039
#define PICC_AUTHENT1B 0x61 //验证B密钥
040
#define PICC_READ 0x30 //读块
041
#define PICC_WRITE 0xA0 //写块
042
#define PICC_DECREMENT 0xC0 //扣款
043
#define PICC_INCREMENT 0xC1 //充值
044
#define PICC_RESTORE 0xC2 //调块数据到缓冲区
045
#define PICC_TRANSFER 0xB0 //保存缓冲区中数据
046
#define PICC_HALT 0x50 //休眠
047
048
049
//和MF522通讯时返回的错误代码
050
#define MI_OK 0
051
#define MI_NOTAGERR 1
052
#define MI_ERR 2
053
054
055
//------------------MFRC522寄存器---------------
056
//Page 0:Command and Status
057
#define Reserved00 0x00
058
#define CommandReg 0x01
059
#define CommIEnReg 0x02
060
#define DivlEnReg 0x03
061
#define CommIrqReg 0x04
062
#define DivIrqReg 0x05
063
#define ErrorReg 0x06
064
#define Status1Reg 0x07
065
#define Status2Reg 0x08
066
#define FIFODataReg 0x09
067
#define FIFOLevelReg 0x0A
068
#define WaterLevelReg 0x0B
069
#define ControlReg 0x0C
070
#define BitFramingReg 0x0D
071
#define CollReg 0x0E
072
#define Reserved01 0x0F
073
//Page 1:Command
074
#define Reserved10 0x10
075
#define ModeReg 0x11
076
#define TxModeReg 0x12
077
#define RxModeReg 0x13
078
#define TxControlReg 0x14
079
#define TxAutoReg 0x15
080
#define TxSelReg 0x16
081
#define RxSelReg 0x17
082
#define RxThresholdReg 0x18
083
#define DemodReg 0x19
084
#define Reserved11 0x1A
085
#define Reserved12 0x1B
086
#define MifareReg 0x1C
087
#define Reserved13 0x1D
088
#define Reserved14 0x1E
089
#define SerialSpeedReg 0x1F
090
//Page 2:CFG
091
#define Reserved20 0x20
092
#define CRCResultRegM 0x21
093
#define CRCResultRegL 0x22
094
#define Reserved21 0x23
095
#define ModWidthReg 0x24
096
#define Reserved22 0x25
097
#define RFCfgReg 0x26
098
#define GsNReg 0x27
099
#define CWGsPReg 0x28
100
#define ModGsPReg 0x29
101
#define TModeReg 0x2A
102
#define TPrescalerReg 0x2B
103
#define TReloadRegH 0x2C
104
#define TReloadRegL 0x2D
105
#define TCounterValueRegH 0x2E
106
#define TCounterValueRegL 0x2F
107
//Page 3:TestRegister
108
#define Reserved30 0x30
109
#define TestSel1Reg 0x31
110
#define TestSel2Reg 0x32
111
#define TestPinEnReg 0x33
112
#define TestPinValueReg 0x34
113
#define TestBusReg 0x35
114
#define AutoTestReg 0x36
115
#define VersionReg 0x37
116
#define AnalogTestReg 0x38
117
#define TestDAC1Reg 0x39
118
#define TestDAC2Reg 0x3A
119
#define TestADCReg 0x3B
120
#define Reserved31 0x3C
121
#define Reserved32 0x3D
122
#define Reserved33 0x3E
123
#define Reserved34 0x3F
124
//-----------------------------------------------
125
126
//4字节卡序列号,第5字节为校验字节
127
uchar serNum[5];
128
129
uchar writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100};
//初始化 100元钱
130
uchar moneyConsume = 18 ;
//消费18元
131
uchar moneyAdd = 10 ;
//充值10元
132
//扇区A密码,16个扇区,每个扇区密码6Byte
133
uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
134
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
135
//{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
136
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
137
};
138
uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
139
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
140
//you can set another ket , such as " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
141
//{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
142
// but when loop, please set the sectorKeyA, the same key, so that RFID module can read the card
143
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
144
};
145
146
void
setup
() {
147
Serial
.begin(9600);
// RFID reader SOUT pin connected to Serial RX pin at 2400bps
148
// start the SPI library:
149
SPI.begin();
150
151
pinMode(chipSelectPin,OUTPUT);
// Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin
152
digitalWrite(chipSelectPin, LOW);
// Activate the RFID reader
153
pinMode(NRSTPD,OUTPUT);
// Set digital pin 10 , Not Reset and Power-down
154
digitalWrite(NRSTPD, HIGH);
155
156
MFRC522_Init();
157
}
158
159
void
loop
()
160
{
161
uchar i,tmp;
162
uchar status;
163
uchar str[MAX_LEN];
164
uchar RC_size;
165
uchar blockAddr;
//选择操作的块地址0~63
166
167
168
//寻卡,返回卡类型
169
status = MFRC522_Request(PICC_REQIDL, str);
170
if
(status == MI_OK)
171
{
172
Serial
.println(
"Find out a card "
);
173
Serial
.print(str[0],BIN);
174
Serial
.print(
" , "
);
175
Serial
.print(str[1],BIN);
176
Serial
.println(
" "
);
177
}
178
179
//防冲撞,返回卡的序列号 4字节
180
status = MFRC522_Anticoll(str);
181
memcpy(serNum, str, 5);
182
if
(status == MI_OK)
183
{
184
185
Serial
.println(
"The card's number is : "
);
186
Serial
.print(serNum[0],BIN);
187
Serial
.print(
" , "
);
188
Serial
.print(serNum[1],BIN);
189
Serial
.print(
" , "
);
190
Serial
.print(serNum[2],BIN);
191
Serial
.print(
" , "
);
192
Serial
.print(serNum[3],BIN);
193
Serial
.print(
" , "
);
194
Serial
.print(serNum[4],BIN);
195
Serial
.println(
" "
);
196
}
197
198
//选卡,返回卡容量
199
RC_size = MFRC522_SelectTag(serNum);
200
if
(RC_size != 0)
201
202
{
203
Serial
.print(
"The size of the card is : "
);
204
Serial
.print(RC_size,DEC);
205
Serial
.println(
" K bits "
);
206
}
207
208
//注册卡
209
blockAddr = 7;
//数据块7
210
status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum);
//认证
211
if
(status == MI_OK)
212
{
213
//写数据
214
status = MFRC522_Write(blockAddr, sectorNewKeyA[blockAddr/4]);
215
Serial
.print(
"set the new card password, and can modify the data of the Sector "
);
216
Serial
.print(blockAddr/4,DEC);
217
Serial
.println(
" : "
);
218
for
(i=0; i<6; i++)
219
{
220
Serial
.print(sectorNewKeyA[blockAddr/4][i],HEX);
221
Serial
.print(
" , "
);
222
}
223
Serial
.println(
" "
);
224
blockAddr = blockAddr - 3 ;
225
status = MFRC522_Write(blockAddr, writeData);
226
if
(status == MI_OK)
227
{
228
Serial
.println(
"You are B2CQSHOP VIP Member, The card has $100 !"
);
229
}
230
}
231
232
//读卡
233
blockAddr = 7;
//数据块7
234
status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);
//认证
235
if
(status == MI_OK)
236
{
237
//读数据
238
blockAddr = blockAddr - 3 ;
239
status = MFRC522_Read(blockAddr, str);
240
if
(status == MI_OK)
241
{
242
Serial
.println(
"Read from the card ,the data is : "
);
243
for
(i=0; i<16; i++)
244
{
245
Serial
.print(str[i],DEC);
246
Serial
.print(
" , "
);
247
}
248
Serial
.println(
" "
);
249
}
250
}
251
252
//消费
253
blockAddr = 7;
//数据块7
254
status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);
//认证
255
if
(status == MI_OK)
256
{
257
//读数据
258
blockAddr = blockAddr - 3 ;
259
status = MFRC522_Read(blockAddr, str);
260
if
(status == MI_OK)
261
{
262
if
( str[15] < moneyConsume )
263
{
264
Serial
.println(
" The money is not enough !"
);
265
}
266
else
267
{
268
str[15] = str[15] - moneyConsume;
269
status = MFRC522_Write(blockAddr, str);
270
if
(status == MI_OK)
271
{
272
Serial
.print(
"You pay $18 for items in B2CQSHOP.COM . Now, Your money balance is : $"
);
273
Serial
.print(str[15],DEC);
274
Serial
.println(
" "
);
275
}
276
}
277
}
278
}
279
280
//充值
281
blockAddr = 7;
//数据块7
282
status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);
//认证
283
if
(status == MI_OK)
284
{
285
//读数据
286
blockAddr = blockAddr - 3 ;
287
status = MFRC522_Read(blockAddr, str);
288
if
(status == MI_OK)
289
{
290
tmp = (
int
)(str[15] + moneyAdd) ;
291
//Serial.println(tmp,DEC);
292
if
( tmp < (
char
)254 )
293
{
294
Serial
.println(
" The money of the card can not be more than 255 !"
);
295
}
296
else
297
{
298
str[15] = str[15] + moneyAdd ;
299
status = MFRC522_Write(blockAddr, str);
300
if
(status == MI_OK)
301
{
302
Serial
.print(
"You add $10 to your card in B2CQSHOP.COM , Your money balance is : $"
);
303
Serial
.print(str[15],DEC);
304
Serial
.println(
" "
);
305
}
306
}
307
}
308
}
309
Serial
.println(
" "
);
310
MFRC522_Halt();
//命令卡片进入休眠状态
311
312
}
313
314
/*
315
* 函 数 名:Write_MFRC5200
316
* 功能描述:向MFRC522的某一寄存器写一个字节数据
317
* 输入参数:addr--寄存器地址;val--要写入的值
318
* 返 回 值:无
319
*/
320
void
Write_MFRC522(uchar addr, uchar val)
321
{
322
digitalWrite(chipSelectPin, LOW);
323
324
//地址格式:0XXXXXX0
325
SPI.transfer((addr<<1)&0x7E);
326
SPI.transfer(val);
327
328
digitalWrite(chipSelectPin, HIGH);
329
}
330
331
332
/*
333
* 函 数 名:Read_MFRC522
334
* 功能描述:从MFRC522的某一寄存器读一个字节数据
335
* 输入参数:addr--寄存器地址
336
* 返 回 值:返回读取到的一个字节数据
337
*/
338
uchar Read_MFRC522(uchar addr)
339
{
340
uchar val;
341
342
digitalWrite(chipSelectPin, LOW);
343
344
//地址格式:1XXXXXX0
345
SPI.transfer(((addr<<1)&0x7E) | 0x80);
346
val =SPI.transfer(0x00);
347
348
digitalWrite(chipSelectPin, HIGH);
349
350
return
val;
351
}
352
353
/*
354
* 函 数 名:SetBitMask
355
* 功能描述:置RC522寄存器位
356
* 输入参数:reg--寄存器地址;mask--置位值
357
* 返 回 值:无
358
*/
359
void
SetBitMask(uchar reg, uchar mask)
360
{
361
uchar tmp;
362
tmp = Read_MFRC522(reg);
363
Write_MFRC522(reg, tmp | mask);
// set bit mask
364
}
365
366
367
/*
368
* 函 数 名:ClearBitMask
369
* 功能描述:清RC522寄存器位
370
* 输入参数:reg--寄存器地址;mask--清位值
371
* 返 回 值:无
372
*/
373
void
ClearBitMask(uchar reg, uchar mask)
374
{
375
uchar tmp;
376
tmp = Read_MFRC522(reg);
377
Write_MFRC522(reg, tmp & (~mask));
// clear bit mask
378
}
379
380
381
/*
382
* 函 数 名:AntennaOn
383
* 功能描述:开启天线,每次启动或关闭天险发射之间应至少有1ms的间隔
384
* 输入参数:无
385
* 返 回 值:无
386
*/
387
void
AntennaOn(
void
)
388
{
389
uchar temp;
390
391
temp = Read_MFRC522(TxControlReg);
392
if
(!(temp & 0x03))
393
{
394
SetBitMask(TxControlReg, 0x03);
395
}
396
}
397
398
399
/*
400
* 函 数 名:AntennaOff
401
* 功能描述:关闭天线,每次启动或关闭天险发射之间应至少有1ms的间隔
402
* 输入参数:无
403
* 返 回 值:无
404
*/
405
void
AntennaOff(
void
)
406
{
407
ClearBitMask(TxControlReg, 0x03);
408
}
409
410
411
/*
412
* 函 数 名:ResetMFRC522
413
* 功能描述:复位RC522
414
* 输入参数:无
415
* 返 回 值:无
416
*/
417
void
MFRC522_Reset(
void
)
418
{
419
Write_MFRC522(CommandReg, PCD_RESETPHASE);
420
}
421
422
423
/*
424
* 函 数 名:InitMFRC522
425
* 功能描述:初始化RC522
426
* 输入参数:无
427
* 返 回 值:无
428
*/
429
void
MFRC522_Init(
void
)
430
{
431
digitalWrite(NRSTPD,HIGH);
432
433
MFRC522_Reset();
434
435
//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
436
Write_MFRC522(TModeReg, 0x8D);
//Tauto=1; f(Timer) = 6.78MHz/TPreScaler
437
Write_MFRC522(TPrescalerReg, 0x3E);
//TModeReg[3..0] + TPrescalerReg
438
Write_MFRC522(TReloadRegL, 30);
439
Write_MFRC522(TReloadRegH, 0);
440
441
Write_MFRC522(TxAutoReg, 0x40);
//100%ASK
442
Write_MFRC522(ModeReg, 0x3D);
//CRC初始值0x6363 ???
443
444
//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0
445
//Write_MFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0]
446
//Write_MFRC522(RFCfgReg, 0x7F); //RxGain = 48dB
447
448
AntennaOn();
//打开天线
449
}
450
451
452
/*
453
* 函 数 名:MFRC522_Request
454
* 功能描述:寻卡,读取卡类型号
455
* 输入参数:reqMode--寻卡方式,
456
* TagType--返回卡片类型
457
* 0x4400 = Mifare_UltraLight
458
* 0x0400 = Mifare_One(S50)
459
* 0x0200 = Mifare_One(S70)
460
* 0x0800 = Mifare_Pro(X)
461
* 0x4403 = Mifare_DESFire
462
* 返 回 值:成功返回MI_OK
463
*/
464
uchar MFRC522_Request(uchar reqMode, uchar *TagType)
465
{
466
uchar status;
467
uint
backBits;
//接收到的数据位数
468
469
Write_MFRC522(BitFramingReg, 0x07);
//TxLastBists = BitFramingReg[2..0] ???
470
471
TagType[0] = reqMode;
472
status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
473
474
if
((status != MI_OK) || (backBits != 0x10))
475
{
476
status = MI_ERR;
477
}
478
479
return
status;
480
}
481
482
483
/*
484
* 函 数 名:MFRC522_ToCard
485
* 功能描述:RC522和ISO14443卡通讯
486
* 输入参数:command--MF522命令字,
487
* sendData--通过RC522发送到卡片的数据,
488
* sendLen--发送的数据长度
489
* backData--接收到的卡片返回数据,
490
* backLen--返回数据的位长度
491
* 返 回 值:成功返回MI_OK
492
*/
493
uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData,
uint
*backLen)
494
{
495
uchar status = MI_ERR;
496
uchar irqEn = 0x00;
497
uchar waitIRq = 0x00;
498
uchar lastBits;
499
uchar n;
500
uint
i;
501
502
switch
(command)
503
{
504
case
PCD_AUTHENT:
//认证卡密
505
{
506
irqEn = 0x12;
507
waitIRq = 0x10;
508
break
;
509
}
510
case
PCD_TRANSCEIVE:
//发送FIFO中数据
511
{
512
irqEn = 0x77;
513
waitIRq = 0x30;
514
break
;
515
}
516
default
:
517
break
;
518
}
519
520
Write_MFRC522(CommIEnReg, irqEn|0x80);
//允许中断请求
521
ClearBitMask(CommIrqReg, 0x80);
//清除所有中断请求位
522
SetBitMask(FIFOLevelReg, 0x80);
//FlushBuffer=1, FIFO初始化
523
524
Write_MFRC522(CommandReg, PCD_IDLE);
//NO action;取消当前命令 ???
525
526
//向FIFO中写入数据
527
for
(i=0; i<sendLen; i++)
528
{
529
Write_MFRC522(FIFODataReg, sendData[i]);
530
}
531
532
//执行命令
533
Write_MFRC522(CommandReg, command);
534
if
(command == PCD_TRANSCEIVE)
535
{
536
SetBitMask(BitFramingReg, 0x80);
//StartSend=1,transmission of data starts
537
}
538
539
//等待接收数据完成
540
i = 2000;
//i根据时钟频率调整,操作M1卡最大等待时间25ms ???
541
do
542
{
543
//CommIrqReg[7..0]
544
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
545
n = Read_MFRC522(CommIrqReg);
546
i--;
547
}
548
while
((i!=0) && !(n&0x01) && !(n&waitIRq));
549
550
ClearBitMask(BitFramingReg, 0x80);
//StartSend=0
551
552
if
(i != 0)
553
{
554
if
(!(Read_MFRC522(ErrorReg) & 0x1B))
//BufferOvfl Collerr CRCErr ProtecolErr
555
{
556
status = MI_OK;
557
if
(n & irqEn & 0x01)
558
{
559
status = MI_NOTAGERR;
//??
560
}
561
562
if
(command == PCD_TRANSCEIVE)
563
{
564
n = Read_MFRC522(FIFOLevelReg);
565
lastBits = Read_MFRC522(ControlReg) & 0x07;
566
if
(lastBits)
567
{
568
*backLen = (n-1)*8 + lastBits;
569
}
570
else
571
{
572
*backLen = n*8;
573
}
574
575
if
(n == 0)
576
{
577
n = 1;
578
}
579
if
(n > MAX_LEN)
580
{
581
n = MAX_LEN;
582
}
583
584
//读取FIFO中接收到的数据
585
for
(i=0; i<n; i++)
586
{
587
backData[i] = Read_MFRC522(FIFODataReg);
588
}
589
}
590
}
591
else
592
{
593
status = MI_ERR;
594
}
595
596
}
597
598
//SetBitMask(ControlReg,0x80); //timer stops
599
//Write_MFRC522(CommandReg, PCD_IDLE);
600
601
return
status;
602
}
603
604
605
/*
606
* 函 数 名:MFRC522_Anticoll
607
* 功能描述:防冲突检测,读取选中卡片的卡序列号
608
* 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节
609
* 返 回 值:成功返回MI_OK
610
*/
611
uchar MFRC522_Anticoll(uchar *serNum)
612
{
613
uchar status;
614
uchar i;
615
uchar serNumCheck=0;
616
uint
unLen;
617
618
619
//ClearBitMask(Status2Reg, 0x08); //TempSensclear
620
//ClearBitMask(CollReg,0x80); //ValuesAfterColl
621
Write_MFRC522(BitFramingReg, 0x00);
//TxLastBists = BitFramingReg[2..0]
622
623
serNum[0] = PICC_ANTICOLL;
624
serNum[1] = 0x20;
625
status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
626
627
if
(status == MI_OK)
628
{
629
//校验卡序列号
630
for
(i=0; i<4; i++)
631
{
632
serNumCheck ^= serNum[i];
633
}
634
if
(serNumCheck != serNum[i])
635
{
636
status = MI_ERR;
637
}
638
}
639
640
//SetBitMask(CollReg, 0x80); //ValuesAfterColl=1
641
642
return
status;
643
}
644
645
646
/*
647
* 函 数 名:CalulateCRC
648
* 功能描述:用MF522计算CRC
649
* 输入参数:pIndata--要读数CRC的数据,len--数据长度,pOutData--计算的CRC结果
650
* 返 回 值:无
651
*/
652
void
CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
653
{
654
uchar i, n;
655
656
ClearBitMask(DivIrqReg, 0x04);
//CRCIrq = 0
657
SetBitMask(FIFOLevelReg, 0x80);
//清FIFO指针
658
//Write_MFRC522(CommandReg, PCD_IDLE);
659
660
//向FIFO中写入数据
661
for
(i=0; i<len; i++)
662
{
663
Write_MFRC522(FIFODataReg, *(pIndata+i));
664
}
665
Write_MFRC522(CommandReg, PCD_CALCCRC);
666
667
//等待CRC计算完成
668
i = 0xFF;
669
do
670
{
671
n = Read_MFRC522(DivIrqReg);
672
i--;
673
}
674
while
((i!=0) && !(n&0x04));
//CRCIrq = 1
675
676
//读取CRC计算结果
677
pOutData[0] = Read_MFRC522(CRCResultRegL);
678
pOutData[1] = Read_MFRC522(CRCResultRegM);
679
}
680
681
682
/*
683
* 函 数 名:MFRC522_SelectTag
684
* 功能描述:选卡,读取卡存储器容量
685
* 输入参数:serNum--传入卡序列号
686
* 返 回 值:成功返回卡容量
687
*/
688
uchar MFRC522_SelectTag(uchar *serNum)
689
{
690
uchar i;
691
uchar status;
692
uchar size;
693
uint
recvBits;
694
uchar buffer[9];
695
696
//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0
697
698
buffer[0] = PICC_SElECTTAG;
699
buffer[1] = 0x70;
700
for
(i=0; i<5; i++)
701
{
702
buffer[i+2] = *(serNum+i);
703
}
704
CalulateCRC(buffer, 7, &buffer[7]);
//??
705
status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
706
707
if
((status == MI_OK) && (recvBits == 0x18))
708
{
709
size = buffer[0];
710
}
711
else
712
{
713
size = 0;
714
}
715
716
return
size;
717
}
718
719
720
/*
721
* 函 数 名:MFRC522_Auth
722
* 功能描述:验证卡片密码
723
* 输入参数:authMode--密码验证模式
724
0x60 = 验证A密钥
725
0x61 = 验证B密钥
726
BlockAddr--块地址
727
Sectorkey--扇区密码
728
serNum--卡片序列号,4字节
729
* 返 回 值:成功返回MI_OK
730
*/
731
uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
732
{
733
uchar status;
734
uint
recvBits;
735
uchar i;
736
uchar buff[12];
737
738
//验证指令+块地址+扇区密码+卡序列号
739
buff[0] = authMode;
740
buff[1] = BlockAddr;
741
for
(i=0; i<6; i++)
742
{
743
buff[i+2] = *(Sectorkey+i);
744
}
745
for
(i=0; i<4; i++)
746
{
747
buff[i+8] = *(serNum+i);
748
}
749
status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);
750
751
if
((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
752
{
753
status = MI_ERR;
754
}
755
756
return
status;
757
}
758
759
760
/*
761
* 函 数 名:MFRC522_Read
762
* 功能描述:读块数据
763
* 输入参数:blockAddr--块地址;recvData--读出的块数据
764
* 返 回 值:成功返回MI_OK
765
*/
766
uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
767
{
768
uchar status;
769
uint
unLen;
770
771
recvData[0] = PICC_READ;
772
recvData[1] = blockAddr;
773
CalulateCRC(recvData,2, &recvData[2]);
774
status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);
775
776
if
((status != MI_OK) || (unLen != 0x90))
777
{
778
status = MI_ERR;
779
}
780
781
return
status;
782
}
783
784
785
/*
786
* 函 数 名:MFRC522_Write
787
* 功能描述:写块数据
788
* 输入参数:blockAddr--块地址;writeData--向块写16字节数据
789
* 返 回 值:成功返回MI_OK
790
*/
791
uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
792
{
793
uchar status;
794
uint
recvBits;
795
uchar i;
796
uchar buff[18];
797
798
buff[0] = PICC_WRITE;
799
buff[1] = blockAddr;
800
CalulateCRC(buff, 2, &buff[2]);
801
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
802
803
if
((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
804
{
805
status = MI_ERR;
806
}
807
808
if
(status == MI_OK)
809
{
810
for
(i=0; i<16; i++)
//向FIFO写16Byte数据
811
{
812
buff[i] = *(writeData+i);
813
}
814
CalulateCRC(buff, 16, &buff[16]);
815
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
816
817
if
((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
818
{
819
status = MI_ERR;
820
}
821
}
822
823
return
status;
824
}
825
826
827
/*
828
* 函 数 名:MFRC522_Halt
829
* 功能描述:命令卡片进入休眠状态
830
* 输入参数:无
831
* 返 回 值:无
832
*/
833
void
MFRC522_Halt(
void
)
834
{
835
uchar status;
836
uint
unLen;
837
uchar buff[4];
838
839
buff[0] = PICC_HALT;
840
buff[1] = 0;
841
CalulateCRC(buff, 2, &buff[2]);
842
843
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
844
}
Считывает данные с rfid-карты и "кидает" в порт. Только на мониторе порта отображается слишком много разной хрени...
В связи с этим возникли вопросы:
1.Какая инфа записана на карте?
2.Только его номер или еще что-то?
3.Можно ли на нее записать инфу и какого объема?
Пока вопросов хватит!
Я бы для выяснения возможностей записи на карту - почитал бы даташит на брелок или на карточку...
Китайские иероглифы можно попытаться скопировать в буфер и через гугловский переводчик перевести. Только там, вследствие специфики языка, перевод очень образный получается - лучше переводить на английский. :)
Хотя, например, такие вещи:
函 数 名:- переводятся с китайского достаточно однозначно как "Функции".
:)лучше переводить на английский. :)
Это все понятно, но у меня с английским не на много лучше, чем с китайским, от чего и страдаю!
Ну ничего, будем разбираться!
В строке 485 видно упоминание стардарта ISO14443 - можно его погуглить почитать.
Нашел простенький скетч и запустил считыватель на нем:
01
#include <SPI.h>
02
#include <RFID.h>
03
04
RFID rfid(53,5);
05
06
void
setup
()
07
{
08
Serial
.begin(9600);
09
SPI.begin();
10
rfid.init();
11
12
}
13
14
void
loop
()
15
{
16
if
(rfid.isCard()) {
17
18
Serial
.println(
"IS CARD"
);
19
20
if
(rfid.readCardSerial()) {
21
22
Serial
.println(
" "
);
23
Serial
.println(
"El numero de serie de la tarjeta es : "
);
24
Serial
.print(rfid.serNum[0],DEC);
25
Serial
.print(
" , "
);
26
Serial
.print(rfid.serNum[1],DEC);
27
Serial
.print(
" , "
);
28
Serial
.print(rfid.serNum[2],DEC);
29
Serial
.print(
" , "
);
30
Serial
.print(rfid.serNum[3],DEC);
31
Serial
.print(
" , "
);
32
Serial
.print(rfid.serNum[4],DEC);
33
Serial
.println(
" "
);
34
35
36
37
}
38
39
}
40
41
rfid.halt();
42
}
Только он выводит не тот код, что на самом ключе, т.е. на ключе код 1991660461, а выводит 173 , 83 , 182 , 118 , 62
1
RFID rfid(10,5);
на(для МЕГА):
1
RFID rfid(53,5);
Так, вроде разобрался!
Карта выводит последовательность: 173 , 83 , 182 , 118 , 62, пишем его в обратном порядке :62, 118, 182, 83, 173. Убираем первое число, (почему?, пока не разобрался) и остальные переводим в НЕХ и получаем: 76, B6, 53, AD. Соединяем: 76B653AD, инвертируем в DEC и получаем номер карты: 1991660461.
Результаты получены методом ТЫКА!
Можно ли как-то увеличить дальность действия считывателя RFID? Сейчас считывает на расстоянии около 3см, а надо около 15см.
Можно ли как-то увеличить дальность действия считывателя RFID? Сейчас считывает на расстоянии около 3см, а надо около 15см.
Использовать другой приемник http://www.ebay.com/itm/Integrated-mid-distance-UHF-RFID-reader-Ethernet-1-6M-ISO18000-6C-6B-EPC-Gen2-/110934066112?pt=US_Cordless_Telephones_Handsets&hash=item19d42f83c0
А он будет читать мои метки? Что-то я не нашел в описании частоту 13.56...
Да, сори, другой диапазон. Посмотри вот этот http://russian.alibaba.com/product-gs/13-56khz-handheld-mifare-reader-rfid-card-reader-debit-bts-01dm-747090914.html но это похоже критическое растояние для этого диапазона.
чтение из com порта:
http://strokescribe.com/ru/read-serial-port-excel-2007.html
нарыл в нэте вот такую штуку: http://www.ebay.com/itm/ws/eBayISAPI.dll?ViewItem&item=110918399199 написано, что с ней считывает на расстоянии 10 см.
Может кто сталкивался с подобным? Как его подключать к ардуино? На нем кроме как кондеров ничего нету.
Как его подключать к ардуино? На нем кроме как кондеров ничего нету.
Не к ардуино, а к радио-модулю вместо штатной маленькой антенны. Написано же "внешняя антенна".
А если у MF522 обрезать его родную антену и подпоять эту...?
А если у MF522 обрезать его родную антену и подпоять эту...?
Это _если_ ее не надо согласовывать... Тут надо теорию у радиолюбителей читать: что там с рабочими частотами и согласованием мощности антенны и передатчика...
Тима, подскажи пожалуйста, у тебя считыватель нормально метку (та которая как брелок) читает? Недавно купил себе точно такой же набор, карту читает, а вот "брелок" не хотит. :(
Может у брелка другой протокол, отличный от ISO14443?
Имею тоже такой считыватель - пишу библиотеку из того скетча на китайском, попутно переводя и разбираясь...
Получил сегодня такой же считыватель, интересует возможность перезаписи идущих в комплекте меток, так же так и не понял, как привести номер метки из hex в нормальный вид.
1
Serial
.println(num, НОРМАЛЬНЫЙВИД);
так попроробуйте, может компилятор вас поймет...
http://www.youtube.com/watch?v=RcyJBB4pdvk
http://www.youtube.com/watch?v=6j1auss1-kA
1
int
i;
2
long
serial;
3
for
(i=0; i<4; i++){
4
serial += rfid.serNum[i]*pow(2,8*i);
5
}
ссылка в тему http://muforum.info/forums/index.php?showtopic=1975
чтобы перевести 4 байта которые представляют собой десятичное число которое печатают на картах. 5 байт это контрольная сумма.
Спс за ссылки, но про возможность перезаписи я что то так и не въехал...
http://www.adafruit.com/datasheets/S50.pdf
Я тоже курю мануалы по карточкам ...
Купил такую штуку на ebay. Может программировать/считывать rfid карты
Serial 13.56MHZ RFID Reader/Writer Module Kits - Arduino Compatible, w/ Software
вставил этот код
01
#include <SoftwareSerial.h>
02
SoftwareSerial mySerial(2, 3);
//pin2 Rx, pin3 Tx , только нужно заменить наоборот и поставить на ардуине RX-k-TX. a TX-k-RX.
03
//в мониторе порта 14400 baud
04
05
int
CMD[64];
06
int
comlen =0;
07
int
out_flag =0;
08
09
void
setup
()
10
{
11
Serial
.begin(9600);
12
mySerial.listen();
13
Serial
.println(
"Serial number will be displayed here if a card is detected by the module:\n"
);
14
// set the data rate for the SoftwareSerial port
15
mySerial.begin(9600);
16
delay(10);
17
mySerial.write(0x02);
//Send the command to RFID, please refer to RFID manual
18
}
19
void
loop
()
// run over and over
20
{
21
22
while
(
Serial
.available())
23
{
24
int
a = SerialReadHexDigit();
25
//Serial.println(a);
26
if
(a>=0){
27
CMD[comlen] = a;
28
comlen++;
29
}
30
delay(10);
31
}
32
33
for
(
int
i=0; i<comlen; i+=2){
34
int
c = mySerial.write( CMD[i]*16 + CMD[i+1]);
35
}
36
comlen =0;
37
38
while
(mySerial.available()) {
39
byte
C = mySerial.read();
40
if
(C<16)
Serial
.print(
"0"
);
41
Serial
.print(C ,HEX);
//Display the Serial Number in HEX
42
Serial
.print(
" "
);
43
out_flag =1;
44
}
45
if
(out_flag >0) {
46
Serial
.println();
47
out_flag = 0;
48
}
49
50
}
51
52
53
54
int
SerialReadHexDigit()
55
{
56
byte
c = (
byte
)
Serial
.read();
57
if
(c >=
'0'
&& c <=
'9'
) {
58
return
c -
'0'
;
59
}
else
if
(c >=
'a'
&& c <=
'f'
) {
60
return
c -
'a'
+ 10;
61
}
else
if
(c >=
'A'
&& c <=
'F'
) {
62
return
c -
'A'
+ 10;
63
}
else
{
64
return
-1;
// getting here is bad: it means the character was invalid
65
}
66
}
подключил
RC522 UNO
VCC --> +5v
TXD --> pin2
RXD --> pin3
GND --> GND
в терменале определяет карту как: 09 G5 T5 87
а нужно чтоб определяло как: 1991660461
Заранее благодарен професионалам!
Вообщем что то замотался, а профита нет, гляньте код скетча, там по задумке часы вместе с RFID, а так же подключен буззер, код конечно унылый, я в этом не силен, но проблема именно в выводе информации на дисплей в десятеричном формате, сейчас выводится аж 14 цифр, а как добиться нормального вывода, который обычно пишется на карте (у меня кстате на карте из комплекта кода на карте нет) что то никак не въеду.
Хочу до кучи еще датчик температуры прикрутить и по кнопке на LCD шилде выводить на дисплей температуру, с этим то проблем не будет, все дело тормозит этот унылый вывод кода карты.
001
/*Подключаем библиотеки*/
002
#include <WProgram.h>
003
#include <Wire.h>
004
#include <DS1307.h>
005
#include <RFID.h>
006
#include <SPI.h>
007
#include <LiquidCrystal.h>
008
#define SS_PIN 2
009
#define RST_PIN 1
010
RFID rfid(SS_PIN, RST_PIN);
011
int
buzzPin = 3;
012
int
serNum0;
013
int
serNum1;
014
int
serNum2;
015
int
serNum3;
016
int
serNum4;
017
/*Выводы дисплея*/
018
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
019
/*Инициализация*/
020
void
setup
(){
021
Serial
.begin(9600);
022
lcd.begin(16, 2);
//Дисплей 16Х2
023
SPI.begin();
024
rfid.init();
025
lcd.setCursor(3, 0);
//Установить 3 символ 0 строки
026
lcd.print(
"Wellcome..."
);
// выводим надпись заставки
027
lcd.setCursor(2, 1);
//Установить 5 символ 1 строки
028
lcd.print(
"Arduino-Clock"
);
// выводим надпись заcтавки
029
delay(5000);
// удерживаем заставку 5 секунд
030
lcd.clear();
// Очищаем дисплей
031
032
/*
033
RTC.stop();
034
RTC.set(DS1307_SEC,00); //Установить секунды
035
RTC.set(DS1307_MIN,21); //Установить минуты
036
RTC.set(DS1307_HR,04); //Установить часы
037
RTC.set(DS1307_DOW,07); //Установить день недели
038
RTC.set(DS1307_DATE,25); //Установить дату
039
RTC.set(DS1307_MTH,8); //Установить месяц
040
RTC.set(DS1307_YR,13); //Установить год
041
RTC.start();
042
*/
043
}
044
void
(* resetFunc) (
void
) = 0;
//Сброс
045
void
loop
()
046
{
047
if
(rfid.isCard())
048
{
049
050
if
(rfid.readCardSerial()) {
051
if
(rfid.serNum[0] != serNum0
052
&& rfid.serNum[1] != serNum1
053
&& rfid.serNum[2] != serNum2
054
&& rfid.serNum[3] != serNum3
055
&& rfid.serNum[4] != serNum4
056
)
057
{
058
/* With a new cardnumber, show it. */
059
//Serial.println(" ");
060
//Serial.println("Card found");
061
serNum0 = rfid.serNum[0];
062
serNum1 = rfid.serNum[1];
063
serNum2 = rfid.serNum[2];
064
serNum3 = rfid.serNum[3];
065
serNum4 = rfid.serNum[4];
066
067
068
//* В порт ничего не выводим
069
//Serial.println(" ");
070
//Serial.println("Cardnumber:");
071
//Serial.print("Dec: ");
072
//Serial.print(rfid.serNum[0],DEC);
073
// Serial.print(", ");
074
//Serial.print(rfid.serNum[1],DEC);
075
//Serial.print(", ");
076
//Serial.print(rfid.serNum[2],DEC);
077
//Serial.print(", ");
078
//Serial.print(rfid.serNum[3],DEC);
079
// Serial.print(", ");
080
//Serial.print(rfid.serNum[4],DEC);
081
// Serial.println(" ");
082
//*
083
//Serial.print("Hex: ");
084
//Serial.print(rfid.serNum[0],HEX);
085
//Serial.print(", ");
086
//Serial.print(rfid.serNum[1],HEX);
087
//Serial.print(", ");
088
//Serial.print(rfid.serNum[2],HEX);
089
//Serial.print(", ");
090
//Serial.print(rfid.serNum[3],HEX);
091
//Serial.print(", ");
092
//Serial.print(rfid.serNum[4],HEX);
093
//Serial.println(" ");
094
095
/* Write the HEX code to the display */
096
097
lcd.setCursor(0, 0);
098
lcd.print(
"CardInfo (DEC):"
);
099
lcd.setCursor(0,1);
100
lcd.print(rfid.serNum[0], DEC);
101
102
lcd.print(rfid.serNum[1], DEC);
103
104
lcd.print(rfid.serNum[2], DEC);
105
106
lcd.print(rfid.serNum[3], DEC);
107
108
lcd.print(rfid.serNum[4], DEC);
109
//Буззер, срабатывает если карта считана...
110
analogWrite(3,20);
111
delay(500);
112
analogWrite(3,0);
113
delay(5000);
114
lcd.clear();
115
resetFunc();
//Относится к сбросу инфы...
116
}
117
else
118
{
119
/* Выводим, частота карты не совпадает*/
120
lcd.print(
"DETECT ERROR"
);
121
}
122
}
123
}
124
rfid.halt();
125
lcd.setCursor(4, 0);
126
lcd.print(RTC.
get
(DS1307_HR,
true
));
//read the hour and also update all the values by pushing in true
127
lcd.print(
":"
);
128
lcd.print(RTC.
get
(DS1307_MIN,
false
));
//read minutes without update (false)
129
lcd.print(
":"
);
130
lcd.print(RTC.
get
(DS1307_SEC,
false
));
//read seconds
131
lcd.print(
" "
);
// some space for a more happy life
132
lcd.setCursor(0, 1);
133
lcd.print(RTC.
get
(DS1307_DATE,
false
));
//read date
134
lcd.print(
"/"
);
135
lcd.print(RTC.
get
(DS1307_MTH,
false
));
//read month
136
lcd.print(
"/"
);
137
lcd.print(RTC.
get
(DS1307_YR,
false
));
//read year
138
lcd.print(
" D:"
);
139
lcd.print(RTC.
get
(DS1307_DOW,
false
));
140
}
Ещё не очень удобно тем, что в первоначальном виде скетча была проблема, приложив одну карту код считывает, а вот на вторую не реагирует, подозреваю, что можно сделать по другому, но я прописал сброс после получения данных о карте, что бы нормально читалась следущая.
Вообщем буду примного благодарен, если кто подкинет решение по выводу номера карты в десятеричном формате, а то дело на этом встало.=(
Вобщем такой вот скетчик я делаю - там есть десятичный номер.
01
// the sensor communicates using SPI, so include the library:
02
#include <SPI.h>
03
#include <RC522.h>
04
05
#define RC522_SS 53
06
#define RC522_NRST 8
07
08
RC522 MFRC522(RC522_SS,RC522_NRST);
09
10
11
//4 байта серийный номер карты, первые 5 байтов для контрольной суммы байт
12
uchar serNum[5];
13
//Сектор пароль, 16 секторов, каждый сектор 6Byte пароль
14
uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
15
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
16
//{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
17
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
18
};
19
20
void
setup
() {
21
Serial
.begin(9600);
// RFID reader SOUT pin connected to Serial RX pin at 2400bps
22
SPI.begin();
23
MFRC522.begin();
24
}
25
26
void
loop
()
27
{
28
uchar i,tmp;
29
uchar status;
30
uchar str[MAX_LEN];
31
uchar RC_size;
32
uchar blockAddr;
//Выбор операционного блока адресов от 0 до 63
33
String mynum =
""
;
34
//Найти карты, тип карты вернуться
35
if
(MFRC522.isCard())
36
{
37
Serial
.println(
"Card detected"
);
38
Serial
.print(
"0x"
);
39
Serial
.print(MFRC522.data[0],HEX);
40
Serial
.print(MFRC522.data[1],HEX);
41
Serial
.println(
" "
);
42
}
43
//Антивирус столкновения, вернуть серийный номер карты 4 байта
44
if
(MFRC522.readSerial())
45
{
46
Serial
.println(
"The card's number is : "
);
47
Serial
.print(MFRC522.data[0],HEX);
48
Serial
.print(
":"
);
49
Serial
.print(MFRC522.data[1],HEX);
50
Serial
.print(
":"
);
51
Serial
.print(MFRC522.data[2],HEX);
52
Serial
.print(
":"
);
53
Serial
.print(MFRC522.data[3],HEX);
54
Serial
.print(
":"
);
55
Serial
.print(MFRC522.data[4],HEX);
56
Serial
.println(
" "
);
57
Serial
.print(
"dec: "
);
58
Serial
.println(MFRC522.data[0]+MFRC522.data[1]*pow(2,8)+MFRC522.data[2]*pow(2,16)+MFRC522.data[3]*pow(2,24));
59
Serial
.print(
"selected size:"
);
60
Serial
.print(MFRC522.SelectTag(MFRC522.data));
61
Serial
.println(
" K bits"
);
62
// Should really check all pairs, but for now we'll just use the first
63
64
//int blockAddr = 2;
65
//uchar str[MAX_LEN];// = "Test 0000000000";
66
//Serial.print("Auth: ");
67
//Serial.println(MFRC522.Auth(PICC_AUTHENT1A,blockAddr,sectorKeyA[blockAddr/4],MFRC522.data));
68
//Serial.print("write key: ");
69
//Serial.println(MFRC522.WriteCard(blockAddr,sectorKeyA[blockAddr/4]));
70
//Serial.print("write data: ");
71
//Serial.println(MFRC522.WriteCard(blockAddr,str));
72
//Serial.print("Auth: ");
73
//Serial.println(MFRC522.Auth(PICC_AUTHENT1A,blockAddr,sectorKeyA[blockAddr/4],MFRC522.data));
74
//Serial.print("write key: ");
75
//Serial.println(MFRC522.WriteCard(blockAddr+3,sectorKeyA[blockAddr/4]));
76
//Serial.print("read card: ");
77
//Serial.println(MFRC522.ReadCard(blockAddr,str));
78
//Serial.println((char*)str);
79
//MFRC522.Halt();
80
//MFRC522.Reset();
81
delay(1000);
82
MFRC522.Halt();
83
}
84
//Serial.println(" ");
85
}
Чтение и запись толком не работает - после Auth работает и чтение и запись, но не выходит из операций с картой по Halt - хз в чем косяк. Не могу найти толклвый манул как работать с этими картами ...
Библиотека тут
Neiro, какие то комментарии к коду в библе не здоровые, я так и не понял, этот код для дублирования карточек или как?
Не компилится у меня с этой библой, она под какую версию?
У меня 1.0.5...
Не могу найти толклвый манул как работать с этими картами ...
http://www.rfidchip.info/comments.php?id=7&type=Note
http://mifare.livejournal.com/15051.html
http://www.neftocard.ru/articles/mifare/index.php
- тут не смотрели?
Neiro, какие то комментарии к коду в библе не здоровые, я так и не понял, этот код для дублирования карточек или как?
Этим кодом можно дублировать карточки с незаблокированнным на запись 0 блоком(что встречается редко). По сути это переделанный в библиотеку тот самый скетч на китайском.
У меня 1.0.5...
Библиотека под 1.0.5 зависит тока от SPI. Так как версия "живая" а яндекс диск ее постоянно синхрит то временами может не работать. Я только что проверил тест - компилится.
тут не смотрели?
да посмотрел - косой перевод мануала. Вобщем нужен мануал где были бы побайтно расписаны процедуры авторизации установки сектора - а то не доверяю я этим китайцам. Удается и записывать и считывать сектора. ключи по умочанию это 6 байт 0xFF. Вот только карта или контроллер не выходят из крипто режима.
Извиняюсь что долго не отвечал, Нэта небыло!
Брелоки тоже чтает нормально. Может на нем частота 125 кГц...?
Куда-то все пропали... :( Или у всех всё заработало?
Так, вроде разобрался!
Карта выводит последовательность: 173 , 83 , 182 , 118 , 62, пишем его в обратном порядке :62, 118, 182, 83, 173. Убираем первое число, (почему?, пока не разобрался) и остальные переводим в НЕХ и получаем: 76, B6, 53, AD. Соединяем: 76B653AD, инвертируем в DEC и получаем номер карты: 1991660461.
Результаты получены методом ТЫКА!
Угу.... 62 -CRC ну и ID читается задом наперед...... так что алгоритм правильный. Для четкости можно посчитать CRC принятого и сравнить с 62 если true - считали правильно....
Ну а вообще, учите матчасть.... не вредно изучить даташит на EM4095
Понравилась эта библиотека - https://github.com/miguelbalboa/rfid
Карты метро читает влет, на пустую карту Mifare 1K пишет.
01
/*
02
* MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
03
* The library file MFRC522.h has a wealth of useful info. Please read it.
04
* The functions are documented in MFRC522.cpp.
05
*
06
* Based on code Dr.Leong ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
07
* Created by Miguel Balboa (circuitito.com), Jan, 2012.
08
* Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
09
* Released into the public domain.
10
*
11
* Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
12
*----------------------------------------------------------------------------- empty_skull
13
* Aggiunti pin per arduino Mega
14
* add pin configuration for arduino mega
15
* <a href="http://mac86project.altervista.org/" title="http://mac86project.altervista.org/" rel="nofollow">http://mac86project.altervista.org/</a>
16
----------------------------------------------------------------------------- Nicola Coppola
17
* Pin layout should be as follows:
18
* Signal Pin Pin Pin
19
* Arduino Uno Arduino Mega MFRC522 board
20
* ------------------------------------------------------------
21
* Reset 9 5 RST
22
* SPI SS 10 53 SDA
23
* SPI MOSI 11 52 MOSI
24
* SPI MISO 12 51 MISO
25
* SPI SCK 13 50 SCK
26
*
27
* The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
28
*/
29
30
#include <SPI.h>
31
#include <MFRC522.h>
32
33
#define SS_PIN 10
34
#define RST_PIN 9
35
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Create MFRC522 instance.
36
37
void
setup
() {
38
Serial
.begin(9600);
// Initialize serial communications with the PC
39
SPI.begin();
// Init SPI bus
40
mfrc522.PCD_Init();
// Init MFRC522 card
41
Serial
.println(
"Scan PICC to see UID and type..."
);
42
}
43
44
void
loop
() {
45
// Look for new cards
46
if
( ! mfrc522.PICC_IsNewCardPresent()) {
47
return
;
48
}
49
50
// Select one of the cards
51
if
( ! mfrc522.PICC_ReadCardSerial()) {
52
return
;
53
}
54
55
// Dump debug info about the card. PICC_HaltA() is automatically called.
56
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
57
}
Да работает - тока после моих экспериментов с предыдущими либами 2 карты не читаются и не пишутся - я им похоже 0 сектор затер. ))) так что акуратнее
4ishops, каким образом с помощью этой библы записывать, я что то не пойму, сначала карту с данными надо считывать, а потом пустую прислонять или как?
И какие карты можно записывать? Насколько я понимаю, карта которая идет в комплекте (фото в первом посте) неперезаписывается?
Серийный номер у болшинства карт Mifare S50 не перезаписывается потому что так положено по стандарту. У карты есть память 1к разделенная на 15 секторов - сектора групируются по 4 блока - при этом в каждом 4 блоке хранятрся пароли для доступа к этой группе блоков. В проездных обычно используются первая и вторая группы потому что в первой группе доступно только 2 блока - в 0 блоке хранится серийник.
Вобщем записывать можно даже дествующие проездные метро - на свободное место и они при этом продолжат работать. В комплекте идут два чипа Mifare S50 полностью свободные с паролями поумочанию. Вобщем пока я игрался - толи сменил все пароли толи инфу в 0 секторе - карта перестала писаться и читаться по всем секторам. Взял карты из другово комплекта - прекрасно работают.
Теперь думаю откуда взять ключ для проездных...
4ishops, каким образом с помощью этой библы записывать, я что то не пойму, сначала карту с данными надо считывать, а потом пустую прислонять или как?
В примерах к библиотеке есть скетч Read&Write, поглядите детали в нем.
Теперь думаю откуда взять ключ для проездных...
Выше уже была ссылка на ЖЖ про клонирование Mifare карт, вся необходимая инфа для извлечения ключа там есть.
BTW на всех проездных на основе Mifare Classic используется один и тот же ключ, в этом их проблема и причина миграции на Mifare Plus (Тройка) и Ultralight (обычные карты на XX поездок).
001
/*
002
* MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
003
* The library file MFRC522.h has a wealth of useful info. Please read it.
004
* The functions are documented in MFRC522.cpp.
005
*
006
* Based on code Dr.Leong ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
007
* Created by Miguel Balboa (circuitito.com), Jan, 2012.
008
* Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
009
*
010
* Released into the public domain.
011
*
012
* This sample shows how to setup a block on a MIFARE Classic PICC to be in "Value Block" mode.
013
* In Value Block mode the operations Increment/Decrement/Restore and Transfer can be used.
014
*
015
----------------------------------------------------------------------------- empty_skull
016
017
- Aggiunti pin per arduino Mega
018
- Scritto semplice codice per la scrittura e lettura
019
020
- add pin configuration for arduino mega
021
- write simple read/write Code for new entry user
022
023
<a href="http://mac86project.altervista.org/" rel="nofollow">http://mac86project.altervista.org/</a>
024
025
----------------------------------------------------------------------------- Nicola Coppola
026
* Pin layout should be as follows:
027
* Signal Pin Pin Pin
028
* Arduino Uno Arduino Mega MFRC522 board
029
* ------------------------------------------------------------
030
* Reset 9 5 RST
031
* SPI SS 10 53 SDA
032
* SPI MOSI 11 52 MOSI
033
* SPI MISO 12 51 MISO
034
* SPI SCK 13 50 SCK
035
*
036
* The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
037
*/
038
039
#include <SPI.h>
040
#include <MFRC522.h>
041
042
#define SS_PIN 53
043
#define RST_PIN 5
044
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Create MFRC522 instance.
045
046
void
setup
() {
047
Serial
.begin(9600);
// Initialize serial communications with the PC
048
SPI.begin();
// Init SPI bus
049
mfrc522.PCD_Init();
// Init MFRC522 card
050
//Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
051
}
052
053
void
loop
() {
054
055
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
056
MFRC522::MIFARE_Key key;
057
for
(
byte
i = 0; i < 6; i++) {
058
key.keyByte[i] = 0xFF;
059
}
060
// Look for new cards
061
if
( ! mfrc522.PICC_IsNewCardPresent()) {
062
return
;
063
}
064
065
// Select one of the cards
066
if
( ! mfrc522.PICC_ReadCardSerial()) {
067
return
;
068
}
069
// Now a card is selected. The UID and SAK is in mfrc522.uid.
070
071
// Dump UID
072
Serial
.print(
"Card UID:"
);
073
for
(
byte
i = 0; i < mfrc522.uid.size; i++) {
074
Serial
.print(mfrc522.uid.uidByte[i] < 0x10 ?
" 0"
:
" "
);
075
Serial
.print(mfrc522.uid.uidByte[i], HEX);
076
}
077
Serial
.println();
078
079
// Dump PICC type
080
byte
piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
081
Serial
.print(
"PICC type: "
);
082
Serial
.println(mfrc522.PICC_GetTypeName(piccType));
083
if
( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
084
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
085
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
086
//Serial.println("This sample only works with MIFARE Classic cards.");
087
return
;
088
}
089
090
// In this sample we use the second sector (ie block 4-7). the first sector is = 0
091
// scegliere settore di lettura da 0 = primo settore
092
byte
sector = 1;
093
// block sector 0-3(sector0) 4-7(sector1) 8-11(sector2)
094
// blocchi di scrittura da 0-3(sector0) 4-7(sector1) 8-11(sector2)
095
byte
valueBlockA = 4;
096
byte
valueBlockB = 5;
097
byte
valueBlockC = 6;
098
byte
trailerBlock = 7;
099
byte
status;
100
// Authenticate using key A.
101
// avvio l'autentificazione A
102
//Serial.println("Authenticating using key A...");
103
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
104
if
(status != MFRC522::STATUS_OK) {
105
Serial
.print(
"PCD_Authenticate() failed: "
);
106
Serial
.println(mfrc522.GetStatusCodeName(status));
107
return
;
108
}
109
// Authenticate using key B.
110
// avvio l'autentificazione B
111
//Serial.println("Authenticating again using key B...");
112
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
113
if
(status != MFRC522::STATUS_OK) {
114
Serial
.print(
"PCD_Authenticate() failed: "
);
115
Serial
.println(mfrc522.GetStatusCodeName(status));
116
return
;
117
}
118
119
// Writing new value block A
120
// Scrivo i valori per il settore A
121
Serial
.println(
"Writing new value block A(4) : the first of the sector TWO "
);
122
byte
value1Block[] = { 1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16, valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
123
status = mfrc522.MIFARE_Write(valueBlockA, value1Block, 16);
124
if
(status != MFRC522::STATUS_OK) {
125
Serial
.print(
"MIFARE_Write() failed: "
);
126
Serial
.println(mfrc522.GetStatusCodeName(status));
127
}
128
/*
129
130
// Writing new value block B
131
// Scrivo i valori per il settore B
132
Serial.println("Writing new value block B");
133
byte value2Block[] = { 255,255,255,255, 0,0,0,0, 0,0,0,0, 255,255,255,255, valueBlockB,~valueBlockB,valueBlockB,~valueBlockB };
134
status = mfrc522.MIFARE_Write(valueBlockB, value2Block, 16);
135
if (status != MFRC522::STATUS_OK) {
136
Serial.print("MIFARE_Write() failed: ");
137
Serial.println(mfrc522.GetStatusCodeName(status));
138
}
139
140
// Writing new value block D
141
// Scrivo i valori per il settore C
142
Serial.println("Writing new value block C");
143
byte value3Block[] = { 255,255,255,255, 0,0,0,0, 0,0,0,0, 255,255,255,255, valueBlockC,~valueBlockC,valueBlockC,~valueBlockC };
144
status = mfrc522.MIFARE_Write(valueBlockC, value3Block, 16);
145
if (status != MFRC522::STATUS_OK) {
146
Serial.print("MIFARE_Write() failed: ");
147
Serial.println(mfrc522.GetStatusCodeName(status));
148
}
149
150
*/
151
152
153
Serial
.println(
"Read block A(4) : the first of the sector TWO"
);
154
byte
buffer[18];
155
byte
size =
sizeof
(buffer);
156
// change this: valueBlockA , for read anather block
157
// cambiate valueBlockA per leggere un altro blocco
158
status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
159
Serial
.print(
"Settore : 0 Valore :"
);
160
Serial
.println(buffer[0]);
161
Serial
.print(
"Settore : 1 Valore :"
);
162
Serial
.println(buffer[1]);
163
Serial
.print(
"Settore : 2 Valore :"
);
164
Serial
.println(buffer[2]);
165
Serial
.print(
"Settore : 3 Valore :"
);
166
Serial
.println(buffer[3]);
167
Serial
.print(
"Settore : 4 Valore :"
);
168
Serial
.println(buffer[4]);
169
Serial
.print(
"Settore : 5 Valore :"
);
170
Serial
.println(buffer[5]);
171
Serial
.print(
"Settore : 6 Valore :"
);
172
Serial
.println(buffer[6]);
173
Serial
.print(
"Settore : 7 Valore :"
);
174
Serial
.println(buffer[7]);
175
Serial
.print(
"Settore : 8 Valore :"
);
176
Serial
.println(buffer[8]);
177
Serial
.print(
"Settore : 9 Valore :"
);
178
Serial
.println(buffer[9]);
179
Serial
.print(
"Settore :10 Valore :"
);
180
Serial
.println(buffer[10]);
181
Serial
.print(
"Settore :11 Valore :"
);
182
Serial
.println(buffer[11]);
183
Serial
.print(
"Settore :12 Valore :"
);
184
Serial
.println(buffer[12]);
185
Serial
.print(
"Settore :13 Valore :"
);
186
Serial
.println(buffer[13]);
187
Serial
.print(
"Settore :14 Valore :"
);
188
Serial
.println(buffer[14]);
189
Serial
.print(
"Settore :15 Valore :"
);
190
Serial
.println(buffer[15]);
191
192
193
194
//byte value1Block[] = { 1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16, valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
195
if
(
196
buffer[0] == 1 &&
197
buffer[1] == 2 &&
198
buffer[2] == 3 &&
199
buffer[3] == 4 &&
200
buffer[4] == 5 &&
201
buffer[5] == 6 &&
202
buffer[6] == 7 &&
203
buffer[7] == 8 &&
204
buffer[8] == 9 &&
205
buffer[9] == 10 &&
206
buffer[10] == 255 &&
207
buffer[11] == 12 &&
208
buffer[12] == 13 &&
209
buffer[13] == 14 &&
210
buffer[14] == 15 &&
211
buffer[15] == 16
212
){
213
214
// sel a scrittura è uguale alla lettura allora e stato un successo !!
215
Serial
.println(
"Read block A(4) : the first of the sector TWO : success"
);
216
Serial
.println(
":-)"
);
217
218
}
else
{
219
220
// scrittura Fallita
221
Serial
.println(
"Read block A(4) : the first of the sector TWO : no match - write don't work fine "
);
222
Serial
.println(
":-( "
);
223
224
}
225
226
227
// risponde successo
228
//Serial.println(mfrc522.GetStatusCodeName(status));
229
230
// Dump the result
231
//mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
232
233
// Halt PICC
234
mfrc522.PICC_HaltA();
235
236
// Stop encryption on PCD
237
mfrc522.PCD_StopCrypto1();
238
239
240
}
Подскажите чем такую карту прочитать? Вышеуказанный RC522 её не берет... :(
Подскажите чем такую карту прочитать? Вышеуказанный RC522 её не берет... :(
Это скорее всего HID, там другая частота.
http://www.hidglobal.com/products/cards-and-credentials/hid-proximity
RFC522 совместим с картами стандарта http://ru.wikipedia.org/wiki/ISO/IEC_14443
Вот эта читать будет?
http://www.ebay.com/itm/2X-125K-RFID-rdm6300-ID-RF-UART-for-Arduino-Open-Source-Reset-Button-D13-LED-5cm-/301036583316
Подскажите чем такую карту прочитать? Вышеуказанный RC522 её не берет... :(
EmMarine карты этот модуль "не берет".
Я бы посмотрел что-то по ключевым словам proximity card reader - получится ощутимо дешевле $23.
Расскажите пожалуйста про запись , ковырял примеры , последний чтение-запись вообще не работает...
Первые два примера карты читают.
Расскажите пожалуйста про запись , ковырял примеры , последний чтение-запись вообще не работает...
Первые два примера карты читают.
Запись в сектора карты как в примере к библитеке, работает влет на пустой карте Mifare Classic 1K.
В скетче довольно подробно разжевано что он делает, что именно вам непонятно?
Спецификацию на сами карты Mifare вы смотрели? как читать/писать на них?
4ishops, спасибо за ответ.
Дело в том что пример чтение-запись не работает у меня , все остальные работают..
Открываю монитор порта подношу карту, ноль эмоций-светодиод на 13 пине не мигает, данные в порт не приходят никакие..
что он делать то должен? :)
вот пример не рабочий
001
/*
002
* MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
003
* The library file MFRC522.h has a wealth of useful info. Please read it.
004
* The functions are documented in MFRC522.cpp.
005
*
006
* Based on code Dr.Leong ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
007
* Created by Miguel Balboa (circuitito.com), Jan, 2012.
008
* Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
009
*
010
* Released into the public domain.
011
*
012
* This sample shows how to setup a block on a MIFARE Classic PICC to be in "Value Block" mode.
013
* In Value Block mode the operations Increment/Decrement/Restore and Transfer can be used.
014
*
015
----------------------------------------------------------------------------- empty_skull
016
017
- Aggiunti pin per arduino Mega
018
- Scritto semplice codice per la scrittura e lettura
019
020
- add pin configuration for arduino mega
021
- write simple read/write Code for new entry user
022
023
<a href="http://mac86project.altervista.org/" rel="nofollow">http://mac86project.altervista.org/</a>
024
025
----------------------------------------------------------------------------- Nicola Coppola
026
* Pin layout should be as follows:
027
* Signal Pin Pin Pin
028
* Arduino Uno Arduino Mega MFRC522 board
029
* ------------------------------------------------------------
030
* Reset 9 5 RST
031
* SPI SS 10 53 SDA
032
* SPI MOSI 11 52 MOSI
033
* SPI MISO 12 51 MISO
034
* SPI SCK 13 50 SCK
035
*
036
* The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
037
*/
038
039
#include <SPI.h>
040
#include <MFRC522.h>
041
042
#define SS_PIN 53
043
#define RST_PIN 5
044
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Create MFRC522 instance.
045
046
void
setup
() {
047
Serial
.begin(9600);
// Initialize serial communications with the PC
048
SPI.begin();
// Init SPI bus
049
mfrc522.PCD_Init();
// Init MFRC522 card
050
//Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
051
}
052
053
void
loop
() {
054
055
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
056
MFRC522::MIFARE_Key key;
057
for
(
byte
i = 0; i < 6; i++) {
058
key.keyByte[i] = 0xFF;
059
}
060
// Look for new cards
061
if
( ! mfrc522.PICC_IsNewCardPresent()) {
062
return
;
063
}
064
065
// Select one of the cards
066
if
( ! mfrc522.PICC_ReadCardSerial()) {
067
return
;
068
}
069
// Now a card is selected. The UID and SAK is in mfrc522.uid.
070
071
// Dump UID
072
Serial
.print(
"Card UID:"
);
073
for
(
byte
i = 0; i < mfrc522.uid.size; i++) {
074
Serial
.print(mfrc522.uid.uidByte[i] < 0x10 ?
" 0"
:
" "
);
075
Serial
.print(mfrc522.uid.uidByte[i], HEX);
076
}
077
Serial
.println();
078
079
// Dump PICC type
080
byte
piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
081
Serial
.print(
"PICC type: "
);
082
Serial
.println(mfrc522.PICC_GetTypeName(piccType));
083
if
( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
084
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
085
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
086
//Serial.println("This sample only works with MIFARE Classic cards.");
087
return
;
088
}
089
090
// In this sample we use the second sector (ie block 4-7). the first sector is = 0
091
// scegliere settore di lettura da 0 = primo settore
092
byte
sector = 1;
093
// block sector 0-3(sector0) 4-7(sector1) 8-11(sector2)
094
// blocchi di scrittura da 0-3(sector0) 4-7(sector1) 8-11(sector2)
095
byte
valueBlockA = 4;
096
byte
valueBlockB = 5;
097
byte
valueBlockC = 6;
098
byte
trailerBlock = 7;
099
byte
status;
100
// Authenticate using key A.
101
// avvio l'autentificazione A
102
//Serial.println("Authenticating using key A...");
103
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
104
if
(status != MFRC522::STATUS_OK) {
105
Serial
.print(
"PCD_Authenticate() failed: "
);
106
Serial
.println(mfrc522.GetStatusCodeName(status));
107
return
;
108
}
109
// Authenticate using key B.
110
// avvio l'autentificazione B
111
//Serial.println("Authenticating again using key B...");
112
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
113
if
(status != MFRC522::STATUS_OK) {
114
Serial
.print(
"PCD_Authenticate() failed: "
);
115
Serial
.println(mfrc522.GetStatusCodeName(status));
116
return
;
117
}
118
119
// Writing new value block A
120
// Scrivo i valori per il settore A
121
Serial
.println(
"Writing new value block A(4) : the first of the sector TWO "
);
122
byte
value1Block[] = { 1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16, valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
123
status = mfrc522.MIFARE_Write(valueBlockA, value1Block, 16);
124
if
(status != MFRC522::STATUS_OK) {
125
Serial
.print(
"MIFARE_Write() failed: "
);
126
Serial
.println(mfrc522.GetStatusCodeName(status));
127
}
128
/*
129
130
// Writing new value block B
131
// Scrivo i valori per il settore B
132
Serial.println("Writing new value block B");
133
byte value2Block[] = { 255,255,255,255, 0,0,0,0, 0,0,0,0, 255,255,255,255, valueBlockB,~valueBlockB,valueBlockB,~valueBlockB };
134
status = mfrc522.MIFARE_Write(valueBlockB, value2Block, 16);
135
if (status != MFRC522::STATUS_OK) {
136
Serial.print("MIFARE_Write() failed: ");
137
Serial.println(mfrc522.GetStatusCodeName(status));
138
}
139
140
// Writing new value block D
141
// Scrivo i valori per il settore C
142
Serial.println("Writing new value block C");
143
byte value3Block[] = { 255,255,255,255, 0,0,0,0, 0,0,0,0, 255,255,255,255, valueBlockC,~valueBlockC,valueBlockC,~valueBlockC };
144
status = mfrc522.MIFARE_Write(valueBlockC, value3Block, 16);
145
if (status != MFRC522::STATUS_OK) {
146
Serial.print("MIFARE_Write() failed: ");
147
Serial.println(mfrc522.GetStatusCodeName(status));
148
}
149
150
*/
151
152
153
Serial
.println(
"Read block A(4) : the first of the sector TWO"
);
154
byte
buffer[18];
155
byte
size =
sizeof
(buffer);
156
// change this: valueBlockA , for read anather block
157
// cambiate valueBlockA per leggere un altro blocco
158
status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
159
Serial
.print(
"Settore : 0 Valore :"
);
160
Serial
.println(buffer[0]);
161
Serial
.print(
"Settore : 1 Valore :"
);
162
Serial
.println(buffer[1]);
163
Serial
.print(
"Settore : 2 Valore :"
);
164
Serial
.println(buffer[2]);
165
Serial
.print(
"Settore : 3 Valore :"
);
166
Serial
.println(buffer[3]);
167
Serial
.print(
"Settore : 4 Valore :"
);
168
Serial
.println(buffer[4]);
169
Serial
.print(
"Settore : 5 Valore :"
);
170
Serial
.println(buffer[5]);
171
Serial
.print(
"Settore : 6 Valore :"
);
172
Serial
.println(buffer[6]);
173
Serial
.print(
"Settore : 7 Valore :"
);
174
Serial
.println(buffer[7]);
175
Serial
.print(
"Settore : 8 Valore :"
);
176
Serial
.println(buffer[8]);
177
Serial
.print(
"Settore : 9 Valore :"
);
178
Serial
.println(buffer[9]);
179
Serial
.print(
"Settore :10 Valore :"
);
180
Serial
.println(buffer[10]);
181
Serial
.print(
"Settore :11 Valore :"
);
182
Serial
.println(buffer[11]);
183
Serial
.print(
"Settore :12 Valore :"
);
184
Serial
.println(buffer[12]);
185
Serial
.print(
"Settore :13 Valore :"
);
186
Serial
.println(buffer[13]);
187
Serial
.print(
"Settore :14 Valore :"
);
188
Serial
.println(buffer[14]);
189
Serial
.print(
"Settore :15 Valore :"
);
190
Serial
.println(buffer[15]);
191
192
193
194
//byte value1Block[] = { 1,2,3,4, 5,6,7,8, 9,10,255,12, 13,14,15,16, valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
195
if
(
196
buffer[0] == 1 &&
197
buffer[1] == 2 &&
198
buffer[2] == 3 &&
199
buffer[3] == 4 &&
200
buffer[4] == 5 &&
201
buffer[5] == 6 &&
202
buffer[6] == 7 &&
203
buffer[7] == 8 &&
204
buffer[8] == 9 &&
205
buffer[9] == 10 &&
206
buffer[10] == 255 &&
207
buffer[11] == 12 &&
208
buffer[12] == 13 &&
209
buffer[13] == 14 &&
210
buffer[14] == 15 &&
211
buffer[15] == 16
212
){
213
214
// sel a scrittura è uguale alla lettura allora e stato un successo !!
215
Serial
.println(
"Read block A(4) : the first of the sector TWO : success"
);
216
Serial
.println(
":-)"
);
217
218
}
else
{
219
220
// scrittura Fallita
221
Serial
.println(
"Read block A(4) : the first of the sector TWO : no match - write don't work fine "
);
222
Serial
.println(
":-( "
);
223
224
}
225
226
227
// risponde successo
228
//Serial.println(mfrc522.GetStatusCodeName(status));
229
230
// Dump the result
231
//mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
232
233
// Halt PICC
234
mfrc522.PICC_HaltA();
235
236
// Stop encryption on PCD
237
mfrc522.PCD_StopCrypto1();
238
239
240
}
Если просто чтение работает, а запись нет, то видимо дело в самой карте Mifare.
Что за карту используете? белую чистую из набора?
PS скетч Read&Write из примеров к библиотеке 100% рабочий, нет необходимости копипастить его еще раз тут