3x MFRC522 per SPI verbinden

Hallo,

ich habe ein kleines Projekt vor mir. Ich habe 3 MFRC522, die bei Ansprechen mir die das jeweilige Modul anzeigen sollen. Die 3 Module sollen über SPI verbunden werden. Mein momentanes Problem ist, das ich nicht genau weiss, wie ich die 3 Module adressieren muss bzw.wie das funktioniert. Momentan teste ich es an einem Modul und es funktioniert. Sobald ich einen zweiten parallel dazu schalte geht nichts mehr. Es geht mir hauptsächlich darum wie ich die 3 Module per SPI verbinden und adressieren muss, das bei Ansprechen eines Moduls eine Antwort kommt. Soweit ich weiss braucht jedes Modul einen eigenen SDA.
Ich verwende einen Arduino UNO R3. Die nötige Bibiothek habe ich auch.

Es wäre cool, wenn ein Profi mir da weiterhelfen könnte.

Vielen Dank schon mal

SPI hat keine Adressen. Jedes Modul braucht eine eigene Chip Select/Slave Select Leitung und wird über diese angesprochen.

Clock und Daten gehen auf alle parallel.

okay, keine Adressen.

So wie du sagst hab ich es ja verkabelt. Jedes Modul ein eigenen SDA und der Rest parallel. Allerdings wie finde ich heraus, welches der Module angesprochen wurde. Oder funktioniert das überhaupt gar ned?
Wie gesagt, mit einem Modul per SPI geht, jedoch 2 nicht.

Danke Dir schon mal füs helfen.

Chip Select ist Low Aktiv. Das heißt die jeweilige Leitung muss vor dem Zugriff Low sein und die der anderen Devices High. Nach dem Zugriff setzt man sie dann wieder auf High.

Da musst du mal schauen ob das die Bibliothek für dich macht. Es kann sein, dass du da beim Erstellen des jeweiligen Objektes einfach den CS/SS/SDA/NSS Pin (da gibt es viele Bezeichnungen) angeben kannst.

Post mal einen Link zur Bibliothek. Dann kann man mal in den Quelltext schauen. Oft wird da aber auch einfach der Hardware CS Pin (10 auf dem UNO) genommen und in Software geschaltet. Wenn es dann in der Bibliothek nicht vorgesehen ist, dass du mehrere Module damit betreiben kannst hast ein Problem.

ach du meinst das ich quasi jedes Modul einzel nacheinander abfrage bis eins antwortet?

Ok, kein Problem. Es ist wie ich gedacht hatte. Der CS Pin wird beim Konstruktor angegeben:

MFRC522(byte chipSelectPin, byte resetPowerDownPin);

Dann hast du für jedes Modul ein Objekt.

Siehe Beispiele für ein Modul:

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

Das kann man auch so schreiben:

MFRC522 mfrc522(10, 9);

Und so kannst du dir auch mehrere Objekte der MFRC522 Klasse anlegen, jeweils mit einem anderen CS/SS Pin.

Reset Pin braucht mal wohl auch, aber da wird auch einer für alle Module gehen.

meinst du das so?

#define RFID1 10
#define RFID2 8
#define RFID2 7
#define RST_PIN 9

MFRC522 mfrc5221 (RFID1, RST_PIN); // Create MFRC522 instance.
MFRC522 mfrc5222 (RFID2, RST_PIN);
MFRC522 mfrc5223 (RFID3, RST_PIN);

Ja :slight_smile:

Wobei die Objekt-Namen etwas verwirrend sind. Geht aber natürlich. Geschmackssache

okay, freut mich das mal was richtig ist.

Ja ich beschäftige mich grad mal einen Monat mit der Materie.

wie würde das den ein Profi formulieren?

Das ist nur Kosmetik.

Könnte man z.B. so machen:

mfrc522_1
mfrc522_2
mfrc522_3

Dann kann man die IC Bezeichnung und die Modul Nummer auseinander halten

Oder auch:

mfrc1
mfrc2
mfrc3

Oder vielleicht:

module1
module2
module3

Oder

rfid1
rfid2
rfid3

ich hab da ein beispiel programm aus der Bibiothek. Und wollte das mal auf 2 Module umschreiben. Leider reagiert der 2. überhaupt nicht.

#include <SPI.h>
#include <MFRC522.h>

#define RFID_1 10
#define RFID_2 8

#define RST_PIN 9
MFRC522 mfrc522_1(RFID_1, RST_PIN);	// Create MFRC522 instance.
MFRC522 mfrc522_2(RFID_2, RST_PIN);  


void setup() {
	Serial.begin(9600);	// Initialize serial communications with the PC
	SPI.begin();			// Init SPI bus
	mfrc522_1.PCD_Init();	// Init MFRC522 card
        mfrc522_2.PCD_Init();	// Init MFRC522 card
	Serial.println("Scanne Karte......");
       
}

void loop() {
	// Look for new cards
	if ( ! mfrc522_1.PICC_IsNewCardPresent()) 
          {
		return;
	  }

	// Select one of the cards
	if ( ! mfrc522_1.PICC_ReadCardSerial()) 
        {
		return;
	}

       

	// Dump debug info about the card. PICC_HaltA() is automatically called.
	mfrc522_1.PICC_DumpToSerial(&(mfrc522_1.uid));




    if ( ! mfrc522_2.PICC_IsNewCardPresent()) 
          {
		return;
	  }

	// Select one of the cards
	if ( ! mfrc522_2.PICC_ReadCardSerial()) 
        {
		return;
	}

       

	// Dump debug info about the card. PICC_HaltA() is automatically called.
	mfrc522_2.PICC_DumpToSerial(&(mfrc522_2.uid));  

}

Natürlich nicht. Das musst du von der Logik her anders machen. Jedesmal wenn in loop() return gemacht wird fängt die Funktion von an und das dahinter wird nie ausgeführt.

if (mfrc522_1.PICC_IsNewCardPresent() &&  mfrc522_1.PICC_ReadCardSerial() ) 
{
    mfrc522_1.PICC_DumpToSerial(&(mfrc522_1.uid));
}

haha das hast du recht.

es funktioniert. Vielen Dank

Ich werde erstmal testen mit meinen neuen erkenntnissen.

Ich hoff du stehst mir für weitere Probleme zur Seite.

Vielen vielen Dank.