Ich mag Ethernet - Karte verbinden , (W5100 HR911105A)
um Arduino Leonardo
mit 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.
Antworten:
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.
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
quelle
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.
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.
quelle
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.
quelle