C RC522 (Arduino HW.: RFID RC522)

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo liebe Community,

Hat einer von euch schon Erfahrungen mit der Hardware oder den Chip machen dürfen?
In erster Linie geht es darum, eine RFID Karte zu beschreiben. Das Lesen hat schon mal geklappt...
Code könnte ich auch posten :)

@ all

Schon mal ein schönes Wochenende ;)
 
Hi,

kannst Du vorweg mal generelles zu Deinem Versuchsaufbau schreiben/zeigen?
Deine Hardware scheint den MFRC522 mit periphärer Beschaltung zu enthalten, mit verwendetem SPI (der Chip könnte auch UART oder I²C).

Elektor hatte im Rahmen seiner ABO-Umstellung "Mitgliedskarten" verteilt, die einen NFC enthalten, Ende letzten Jahres im Rahmen eines Gewinnspieles (STM) eine weitere Karte.
Ab dem Winter-Doppelheft (1/16) finden sich diverse Artikel, die sich mit diesen Karten beschäftigen - da ich kein Lesegerät besitze, habe ich diese Artikel nur recht grob überflogen. AFAIK gings aber stellenweise auch ums beschreiben.
 
Hey LotadaC,

Also das Board ist son Standart Arduino Entwicklungsboard ->
http://www.watterott.com/de/Mifare-1356Mhz-RC522-RFID-Card-Reader-Module
Das Board betreibe ich via. SPI (so ist es default auch Hardwaremäßig Konfiguriert!)

Hier ein Bild von meinem Versuchsaufbau, nichts besonderes ARDUINO NANO (CLONE) mit einem Mega168P.

20160925_131239.jpg


Das Problem was ich aktuell habe, ist das ich mich zwar einloggen kann auf der Karte aber keinen Sektor so richtig lesen kann.
Bzw. ich bekomme Daten zurück weiß aber nicht ob diese "richtig" sind. Daher wollte ich mal was auf der Karte schreiben, genau an diesen Sektor (4), dass schlägt aber fehl, warum auch immer.

Um auf der Karte was schreiben zu können, braucht man ja einen Schlüssel (Autoriesierungsschlüssel), diese sind für KeyA und KeyB bei den Mifare Classic 1K Karten default 0xFF.

Also muss ich es jetzt hin bekommen die Karte bzw. einen Sektor davon zu beschreiben.

Was ich noch nicht ganz verstanden habe, diese RFID Karten haben wohl eine UID (Eindeutige Identifierungsnummer) und eine Seriennummer?
Oder ist die Seriennummer = der Identifizierungsnummer ???
 

Anhänge

  • rfid.jpg
    rfid.jpg
    500,3 KB · Aufrufe: 6
Zuletzt bearbeitet:
Habe jetzt mal ein bischen tiefer geforscht...
Bei dem lesen läuft auch schon was falsch...
Hier zu sehen ist die Routine zum lesen der Mifare x Karten ->




CodeBox C

[I]uint8_t[/I] mfrc522_read_block([I]uint8_t[/I] blockAddr, [I]uint8_t[/I] *recvData)

{

[I]uint8_t[/I] status;
[I]uint32_t[/I] unLen;




recvData[0] = PICC_READ;
recvData[1] = blockAddr;
mfrc522_calculateCRC(recvData,2, &recvData[2]);
status = mfrc522_to_card(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);

char Buffer[20];
[I]sprintf[/I](Buffer,"unLen = %"[I]PRIu32[/I],unLen);  

uart_puts(Buffer);
uart_puts("\r\n");

if ((status != CARD_FOUND) || (unLen != 0x90)) // 0x90 = 144

{
status = ERROR;
}

return status;


}





Bei der Variablen "unLen" bekomme ich ständig nur eine 0x04 zurück. Das heißt irgendwas läuft total falsch... Bloß was?

Hier ist die Funktion die die komplette Kommunikation mit dem Chip handelt... Vill. weiß einer von euch, was falsch läuft?



CodeBox C

/*


send command to rc522 to card

*/

[I]uint8_t[/I] mfrc522_to_card([I]uint8_t[/I] cmd, [I]uint8_t[/I] *send_data, [I]uint8_t[/I] send_data_len, [I]uint8_t[/I] *back_data, [I]uint32_t[/I] *back_data_len)


{

[I]uint8_t[/I] status = ERROR;

[I]uint8_t[/I] irqEn = 0x00;

[I]uint8_t[/I] waitIRq = 0x00;

[I]uint8_t[/I] lastBits = 0;

[I]uint8_t[/I] n = 0;

[I]uint8_t[/I] tmp = 0;

[I]uint32_t[/I] i = 0;

switch (cmd)

{

case MFAuthent_CMD: //Certification cards close


{

irqEn = 0x12;

waitIRq = 0x10;

break;

}

case Transceive_CMD: //Transmit FIFO data


{

irqEn = 0x77;

waitIRq = 0x30;

break;

}

default:

break;

}



//mfrc522_write(ComIEnReg, irqEn|0x80); //Interrupt request


n=mfrc522_read(ComIrqReg);

mfrc522_write(ComIrqReg,n&(~0x80));//clear all interrupt bits


n=mfrc522_read(FIFOLevelReg);

mfrc522_write(FIFOLevelReg,n|0x80);//flush FIFO data




mfrc522_write(CommandReg, Idle_CMD); //NO action; Cancel the current cmd???


//Writing data to the FIFO


for (i=0; i<send_data_len; i++)

{


mfrc522_write(FIFODataReg, send_data[i]);


}

//Execute the cmd


mfrc522_write(CommandReg, cmd);

if (cmd == Transceive_CMD)

{


n=mfrc522_read(BitFramingReg);

mfrc522_write(BitFramingReg,n|0x80);


}




//Waiting to receive data to complete


i = 2000; //i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms???


do


{

//CommIrqReg[7..0]


//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq


n = mfrc522_read(ComIrqReg);

i--;

}

while ((i!=0) && !(n&0x01) && !(n&waitIRq));

tmp=mfrc522_read(BitFramingReg);

mfrc522_write(BitFramingReg,tmp&(~0x80));



if (i != 0)

{


if(!(mfrc522_read(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr


{

status = CARD_FOUND;

if (n & irqEn & 0x01)

{


status = CARD_NOT_FOUND; //??


}

if (cmd == Transceive_CMD)

{

n = mfrc522_read(FIFOLevelReg);

lastBits = mfrc522_read(ControlReg) & 0x07;

if (lastBits)

{


*back_data_len = ([I]uint32_t[/I])(n-1)*8 + ([I]uint32_t[/I])lastBits;


}

else


{


*back_data_len = ([I]uint32_t[/I])n*8;


}

if (n == 0)

{


n = 1;


}

if (n > MAX_LEN)

{


n = MAX_LEN;


}



//Reading the received data in FIFO


for (i=0; i<n; i++)

{


back_data[i] = mfrc522_read(FIFODataReg);


}

}

}

else


{


status = ERROR;


}



}



//mfrc522_setBitMask(ControlReg,0x80); //timer stops


//mfrc522_write(CommandReg, PCD_IDLE);


return status;


}

 

Anhänge

  • rfid_read_error.jpg
    rfid_read_error.jpg
    64,3 KB · Aufrufe: 5
Zuletzt bearbeitet:
Warum überhaupt 0x90 bzw. 144 ?
Sind es etwa 18 Bytes ?

144 / 8 (Bits) = 18 Bytes ?
Könnte das der Grund für die 0x90 sein? Werden immer 18 Bytes von der Karte empfangen?
 
Hallo Janiiix,

durch die Textformatierung im Sourcecode ist dieser schwer zu lesen (hatte ich in einem anderen Thema schon mal erwähnt). Den Fehler kann man eigentlich auch so garnicht finden, da viele Funktionen verwendet werden, die unbekannt sind. Besser wäre es vielleicht, wenn du dein aktuelles Projekt hochlädtst. Du hast wahrscheinlich auch einige Funktionen aus einem Arduino Projekt übernommen, von denen man ausgehen kann, dass sie validiert und fehlerfrei sind. Welche sind das, Quelle zum Source?

Dirk :ciao:
 
Hallo Dirk,

die mfrc522.c ist eigentlich die, die alles erledigt.
Die UID der Karte kann ich erfolgreich lesen, genau so wie die Speichergröße.
Das einloggen in den Sektor klappt auch. Nur eben das lesen passt nicht.

Gestern habe ich herausgefunden, dass im FIFO Level Register nur ein Byte enthalten ist (also eins ist verfügbar!)


CodeBox C
0Ah FIFOLevelReg number of bytes stored in the FIFO buffer Table 41 on page 44


Im weiteren, konnte ich feststellen, dass im ControlReg eine 0x04 drinn steht. Das ist der Grund warum es auch an der if Abfrage


CodeBox C
if ((status != CARD_FOUND) || (unLen != 0x90)) // 0x90 = 144 // @ mfrc522_read_block
{
     status = ERROR;
}


scheitert. Entweder hat die Karte ein defekt oder es ist irgendwas anderes faul. Die Bibliotheken habe ich wie du schon erwähnt hast von einem Arduino Projekt übernommen und auf meine Bedürfnisse angepasst.
 

Anhänge

  • mfrc522.c
    11,6 KB · Aufrufe: 3

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)