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.
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.
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.
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));
}