Gerät mit mehreren SPI

7

Ich mag Ethernet - Karte verbinden , (W5100 HR911105A)um Arduino Leonardomit SPI und ich möchte auch zu verbinden SD - Reader. Wenn ich diese Boards separat teste, funktioniert alles. Aber wenn ich sie auf derselben Karte verbinde, schlägt das Programm bei fehlEthernet.begin();

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

#define SS_SD_CARD  4
#define SS_ETHERNET 10

const char CONFIG_FILE[] = "system.cfg";

byte C_MAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress S_IP(192,168,0,19);
IPAddress C_IP(192, 168, 0, 177);
const uint16_t  S_PORT = 8090;

EthernetClient client;

void setup() {
  Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
    pinMode(SS_SD_CARD, OUTPUT);
    pinMode(SS_ETHERNET, OUTPUT);

    digitalWrite(SS_SD_CARD, HIGH);
    digitalWrite(SS_ETHERNET, HIGH);

    digitalWrite(SS_SD_CARD, LOW);
    SD.begin(SS_SD_CARD);
    digitalWrite(SS_SD_CARD, HIGH);

    Serial.println("Setup ethernet");
    digitalWrite(SS_ETHERNET, LOW);
    if (Ethernet.begin(C_MAC) == 0) {
      Serial.println("Failed to configure Ethernet using DHCP");
      Ethernet.begin(C_MAC, C_IP);
    }
    delay(100);
    Serial.println("connectin...");
    bool result = client.connect(S_IP, S_PORT);
    Serial.println("connected");
    digitalWrite(SS_ETHERNET, HIGH);
}

void loop() {
  Serial.println("loop...");
  delay(1000);
}

Ich habe Leonardo und Mega 2560 anprobiert.

eszik.k
quelle
Wollen Sie damit sagen, dass es gut funktioniert, wenn nur der W5100 an den Leonardo angeschlossen ist, aber sobald Sie den SD-Reader angeschlossen haben, funktioniert er nicht mehr? Es ist auch SPI, nicht ISP. ISP steht für In-System Programmer, was etwas völlig anderes ist.
per1234
Ja, das sage ich. Wenn ich beide Geräte an SPI anschließe, funktioniert nur der Kartenleser und liest Daten von der Karte, und das Ethernet fällt an der genannten Stelle aus. Aber wenn ich nur das Ethernet verbinde, funktioniert es.
eszik.k
Wenn Sie wie beschrieben einzeln testen, sind die SS-Pin-Nummern gleich (4 und 10)?
Nick Gammon
Welchen SD-Reader verwenden Sie? Können Sie die genaue Verkabelung beschreiben?
Nick Gammon

Antworten:

3

Einige Kartenleser (sowie Anzeigetafeln mit integriertem SD-Sockel) verwenden 10-kOhm-Widerstände in Reihe zu den CS-, DIN- und CLK-Leitungen, um eine kostengünstige Übersetzung von 5 V auf 3,3 V durchzuführen. Dies ist wirklich nicht die beste Lösung, insbesondere in Bezug auf die Geschwindigkeit (wir haben überprüft, dass dies normalerweise die maximale SPI-Geschwindigkeit auf etwa 1 MHz begrenzt).

Andere Kartenleser (wie dieser http://modtronix.com/mod-sdcard-l5.html ) verwenden nur 10 k-Ohm-Widerstände als Pull-up für 3,3 V. Daher verbinden Sie alle SD-Kartenleitungen mit der Leonardo-Karte, die 5-V-Pegel hat. Dies führt zu schwerwiegenden Problemen mit der SD-Karte oder dem Leonardo-Board. Wenn Ihr Kartenleser in diesen zweiten Fall fällt, empfehle ich Ihnen, einen Widerstandsteiler (1k + 1,5k) in Reihe in jede Eingangsleitung der SD-Karte einzufügen: DIN, CLK, CS. In den folgenden Schemata zeige ich nur für die CLK-Zeile, natürlich müssen Sie dies dreimal wiederholen. Eine viel bessere Idee wäre ein Level-Übersetzer-IC.

schematisch

simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab

nächster Hack
quelle
2

Wenn Sie einen ähnlichen SD-Kartenleser wie unten haben (oder den gleichen, aber mit einer Micro-SD-Karte), hatte ich genau das gleiche Problem.

Es funktioniert als einzelnes Gerät auf SPI, jedoch nicht zusammen mit einem anderen SPI-Gerät.

Sie können entweder eine SD-Recorder-Protokarte oder einen Mikrocontroller mit mehreren SPIs verwenden.

SD-Ausbruch

Ein Beispiel für den SD-Recorder, den ich verwendet habe und der mit einem anderen SPI-Gerät an einem SPI-Port funktioniert.

Nachteile: größer, teurer Pro: hat einen RTC- und Proto-Raum.

SD-Rekorder

Michel Keijzers
quelle
Ja, ich habe einen ähnlichen Kartenleser wie Sie gezeigt haben. Ich hoffe, es gibt eine Lösung für dieses Problem. ebay.com/itm/…
eszik.k
Ich habe bis vor kurzem das SD-Recorder-Shield verwendet, aber ich wechsle zu STM32, das über mehrere SPI-Ports verfügt, sodass ich wahrscheinlich keinen einfachen SD-Kartenleser wie einen Port und andere Peripheriegeräte (wie ein RF) verwenden kann (nicht ausprobiert) Radio) zu einem anderen SPI.
Michel Keijzers
2
@MichelKeijzers - Ich habe noch nie ein SPI-Gerät verwendet (war schon immer ein I2C-Kind), aber ich dachte, Sie haben den CS-Lead verwendet, um zu steuern, was die Nachricht erhält. Nach dem, was Sie gesagt haben, gehe ich davon aus, dass mehr dahinter steckt.
Code Gorilla
4
@CodeGorilla Sie haben Recht, der CS (Chip Select oder SS: Slave Select) entscheidet, wer die Nachricht erhält. Normalerweise ist einer der CS-Pins niedrig und die anderen hoch. Das SPI-Gerät mit CS Low Pin kann mit dem Master kommunizieren. Alle MISOs und MOSIs müssen gekoppelt sein, und einige Geräte (wie der billige SD-Kartenleser) unterstützen dies nicht ... Ich kenne den Grund nicht.
Michel Keijzers
0

Ich vermute, der Grund liegt in der Gestaltung der Ein- / Ausgänge. Der W5100 scheint eine 3v3-Karte mit 5-V-kompatiblen Eingängen zu sein, ebenso wie der Link, den Sie an den SD-Reader gesendet haben. Dies hängt jedoch davon ab, wie diese Ein- / Ausgänge ausgelegt sind Das heißt, sie werden nicht "gut" mit anderen Boards im selben Bus spielen, obwohl SPI dafür ausgelegt ist.

Je nachdem, wo das Problem liegt, gibt es einige mögliche Lösungen, wenn (wie ich vermute) das Problem die Ausgabe von den Geräten zurück an das Arduino ist (dh Sie können darauf schreiben, aber nicht von ihnen lesen), die Sie durch Verbinden bestätigen können alle Leitungen parallel, aber nur eine der seriellen Leitungen wieder mit dem Arduino verbinden und prüfen, ob es funktioniert, dann die serielle Leitung auf das andere Gerät austauschen und prüfen. Unter der Annahme, dass beide Geräte in dieser Konfiguration funktionieren, müssen Sie nur das Rücksignal korrigieren. Der einfachste Weg, dies zu tun, wäre die Verwendung von zwei Drei-Zustands-Puffern.

Daher wird das Rücksignal nur dann mit dem Arduino verbunden, wenn diese Geräteauswahlleitung aktiv ist. und ansonsten hochohmig (getrennt), programmgesteuertes Trennen eines Geräts vom Bus.

James Kent
quelle