Arduino mit MFRC522-Reader

Arduino mit MFRC522-Reader

Lesen des Versionsregisters

Wir stellen uns einmal ganz unwissend und versuchen nun, das Register zu lesen. Die Methode SPI.transfer(value) liefert laut Dokumentation auch einen Rückgabewert.

Was würden Sie von dem folgendem Programm halten?



Im setup-Bereich starten wir die serielle Schnittstelle, über die unser Arduino mit dem PC verbunden ist. Er muss uns ja schließlich mitteilen können, welche Informationen er vom MFRC erhalten hat.

Außerdem müssen wir das SPI-Interface aktivieren.

Im Hauptteil, der Endlosschleife loop(), rufen wir die Methode SPI.transfer auf und speichern das Ergebnis in der Variablen bVersion.

Der etwas kryptisch anmutende Übergabewert setzt sich wie folgt zusammen:

Zunächst schieben wir die Adresse 0x37 um eins nach links (37<<1) und danach führen wir eine Oder-Verbindung mit der Bit-Maske "1000.0000" durch. Dadurch wird das Bit D7 gesetzt und sagen dem MFRC damit, dass wir das Register lesen wollen. Das Ergebnis geben wir über die serielle Schnittstelle aus.

So funktioniert es aber noch nicht und wir erinnern uns vielleicht, dass die Chip-Select-Leitung ja noch gesetzt werden musste. Wir ändern unser Programm folgendermaßen ab:


Wir definieren unseren Chip-Select-Pin am Aschluss 10, legen ihn als Ausgang fest und ziehen ihn konstant auf Low-Potenzial. Damit ist der Anschluss des Readers ständig aktiviert. Wir kompilieren das Programm erneut und laden es in den Arduino und erhalten jetzt die foglende Ausgabe:


Den Wert "146" hätten wir jetzt vielleicht nicht erwartet, aber die Versionsbezeichnung war in einem hexadezimalen Format angegeben. Wenn Sie die Ausgabezeile wie folgt erweitern: Serial.println(bVersion, HEX);, dann sehen wir dieses Bild:


Wir haben es also mit einem Chip der Version 2.0 zu tun und die Kommunikation funktioniert offenbar auch.

Wenn Sie jetzt aber doch das Gefühl haben: "Irgendetwas stimmt hier noch nicht..." liegen Sie ganz richtig. Wir haben nur eine einzige SPI-Übertragung durchgeführt und dem Reader-Chip lediglich gesagt, dass er uns Daten senden soll aber wann geschieht das? Die Antwort ist: Der Befehl befindet sich in einer loop-Schleife und wird immer wieder ausgeführt. Das heißt beim ersten Aufruf sagen wir dem MFRC522, das wir das Register 0x37 lesen wollen und beim 2. und allen folgenden Aufrufen lesen wir das Ergebnis, das uns der MFRC522 auf den SPI-Bus gelegt hat. Der Übergabeparameter ist dabei egal. Wenn wir die Abfrage im setup-Teil durchgeführt hätten, müsste sie z. B. wie folgt lauten:

spi.transfer((0x37<<1) | 0x80);
bVersion = spi.transfer(0x00);

Aber es gibt noch einen Punkt, den wir bislang nicht beachtet haben, obwohl es offensichtlich funktioniert. Wir haben nämlich unseren "Chip- oder Slave-Select-Pin" noch nicht angesteuert. Ich hebe diesen Punkt extra hervor, weil ich selbst lange Zeit so gearbeitet habe und die Schaltung plötzlich nicht mehr funktionierte. Offensichtlich hatte ich am Anfang einfach nur Glück und der Anschluss blieb auf High-Potenzial. Irgendwann kam es aber doch zum "Floaten" und er veänderte seinen Pegel. Solche Fehler sind extrem schwer zu finden, weil wir ja offensichtlich nichts geändert haben.

Wir ergänzen unser Programm am Anfang also um die Zeile:

#define resetPin 9

und im Setup-Teil um:

pinMode(resetPin, OUTPUT);
digitalWrite(resetPin, HIGH);

Damit wäre eine sichere Kommunikation zwischen dem Arduino und dem MFRC522 sichergestellt.