Mein Display hab ich durch eure Hilfe zum laufen bekommen, doch schon
hab ich das nächste Problem:
Jetzt wollte ich den SD Kartenslot mal testen, aber irgendwie funzt das
nicht richtig. Ich nutze die mitgelieferten Beispiele aus der Lib mit
einem ESP32.
Hier mein Code:
1
/*
2
SD card basic file example
3
4
This example shows how to create and destroy an SD card file
5
The circuit:
6
* SD card attached to SPI bus as follows:
7
** MOSI - pin 11
8
** MISO - pin 12
9
** CLK - pin 13
10
** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)
11
12
created Nov 2010
13
by David A. Mellis
14
modified 9 Apr 2012
15
by Tom Igoe
16
17
This example code is in the public domain.
18
19
*/
20
#include<SPI.h>
21
#include<SD.h>
22
23
constintchipSelect=4;
24
25
FilemyFile;
26
27
voidsetup(){
28
// Open serial communications and wait for port to open:
29
Serial.begin(9600);
30
while(!Serial){
31
;// wait for serial port to connect. Needed for native USB port only
32
}
33
34
Serial.print("Initializing SD card...");
35
36
if(!SD.begin(chipSelect)){
37
Serial.println("initialization failed!");
38
while(1);
39
}
40
Serial.println("initialization done.");
41
42
if(SD.exists("example.txt")){
43
Serial.println("example.txt exists.");
44
}else{
45
Serial.println("example.txt doesn't exist.");
46
}
47
48
// open a new file and immediately close it:
49
Serial.println("Creating example.txt...");
50
myFile=SD.open("example.txt",FILE_WRITE);
51
myFile.close();
52
53
// Check to see if the file exists:
54
if(SD.exists("example.txt")){
55
Serial.println("example.txt exists.");
56
}else{
57
Serial.println("example.txt doesn't exist.");
58
}
59
60
// delete the file:
61
Serial.println("Removing example.txt...");
62
SD.remove("example.txt");
63
64
if(SD.exists("example.txt")){
65
Serial.println("example.txt exists.");
66
}else{
67
Serial.println("example.txt doesn't exist.");
68
}
69
70
myFile=SD.open("/");
71
72
printDirectory(myFile,0);
73
74
Serial.println("done!");
75
}
76
77
voidprintDirectory(Filedir,intnumTabs){
78
while(true){
79
80
Fileentry=dir.openNextFile();
81
if(!entry){
82
// no more files
83
break;
84
}
85
for(uint8_ti=0;i<numTabs;i++){
86
Serial.print('\t');
87
}
88
Serial.print(entry.name());
89
if(entry.isDirectory()){
90
Serial.println("/");
91
printDirectory(entry,numTabs+1);
92
}else{
93
// files have sizes, directories do not
94
Serial.print("\t\t");
95
Serial.println(entry.size(),DEC);
96
}
97
entry.close();
98
}
99
}
100
101
102
voidloop(){
103
// nothing happens after setup finishes.
104
}
Die Inizialisierung der Karte wird laut seriellem Monitor erfolgreich
abgeschlossen. Doch ein lesen oder schreiben einer Datei funktioniert
nicht. Die Verzeichnissstruktur der Karte wird jedoch erfolgreich
dargestellt. Ich nutze eine Mikro SD Karte mit 2GB in einem SD Adapter.
Hat jemand eine Idee woran das liegen könnte?
Vielen Dank im vorraus
Michael
Vielleicht sind ja einfach nur die Leitungen zwischen Deinem Arduino und
dem Display/SD-Slot zu lang.
Funktioniert denn der Schritt des Bestimmens, ob die Datei existiert?
Nein, ich habe die Datei manuell auf der Karte erstellt, aber die
Rückmeldung ist immer "example.txt doesn't exist", obwohl sie am Ende in
der printDirectory Routine angezeigt wird.
Es wird nie eine Datei erstellt.
Kabellänge sind maximal 15cm bei einem Querschnitt von 0,25mm²
Ist das zu lang? Kann die Geschwindigkeit der SPI verringert werden?
Michael schrieb:> Ist das zu lang?
Ich würd's einfach kürzer machen.
Aber das ist nicht die Ursache Deines Problems; wenn das Lesen des
Directories funktioniert, geht entschieden zu viel, als daß es an der
Verdrahtung liegen könnte.
Hast Du mal probiert, den Dateinamen mit Pfad anzugeben, d.h. statt
"example.txt" ein "/example.txt"?
So geht der Tag gut los! Gleich mal den Tip von Rufus umgesetzt und
schon gibt's ein Erfolgserlebnis! So kann ich Dateien lesen und
schreiben.
Vielen Dank!
Grüße Michael
Hallo,
das Directory-Handling ist relativ spät in die SD-Lib gekommen,
Rufus Τ. F. (rufus) hat ja schon den richtigen Hinweis gegeben.
Der Pfad muß immer mit dem Directory angegeben werden, / ist eben das
Root-Directory.
Eigenlich auch bei z.B. if (SD.exists("/streamliste.txt")), warum er es
bei einigen Funtionen auch ohne den / richtig ausführt, müßte man in der
Lib nachschauen.
Gruß aus Berlin
Michael
Michael schrieb:> So geht der Tag gut los! Gleich mal den Tip von Rufus umgesetzt und> schon gibt's ein Erfolgserlebnis
Das ist für mich eine interessante Rückmeldung. Bisher hatte ich immer
erst bei mehr als 20cm in Erwägung gezogen, dass eventuell die Leitungen
zu lang sind.
Wundern tun mich hier auch die Reihenwiderstände zwischen den
Datenleitungen.
Einen Pullup an den Datenleitungen braucht es dazu normalerweise auch.
Erstaunlich, daß das so funktioniert.
Rufus Τ. F. schrieb:> Stefanus F. schrieb:>> Das ist für mich eine interessante Rückmeldung.>> Das bezog sich auf die Pfadangabe, nicht die Leitungslänge.
Ach so. Pacepalm. Völlig falsch verstanden.
Hallo,
Andreas B. schrieb:> Wundern tun mich hier auch die Reihenwiderstände zwischen den> Datenleitungen.
Die haben dort 1k, vermutlich eigebaut, damit die SD-Karte bei
versehtlichen 5V Pegeln nicht gleich das Zeitliche segnet.
Eine Serienterminierung ergibt sich damit auch noch irgendwie, das hilft
dann wieder den langen Leitungen.
> Einen Pullup an den Datenleitungen braucht es dazu normalerweise auch.> Erstaunlich, daß das so funktioniert.
Nicht zwingend. /CS sollte einen haben, damit die Karte nicht im Chaos
versinkt, wenn der Pin noch im TriState ist.
Die SD-Card Sachen aus deChina-Ecke sind da meist etwas fragwürdig in
dieser Hinsicht. Allerdings gehen mit solchen Aufbauten und fast 20cm
DuPont-Strippen 20MHz SPI-Clock (fast immer) noch stabil.
Ich flashe bei Experimenten mit fragwürdiger Verdrahtung dann mit dem
SD-Test aus den Demos. Wenn der ein paarmal durchläuft bleibts es
vorerst mal so...
Gruß aus Berlin
Michael
Michael U. schrieb:> Wenn der ein paarmal durchläuft bleibts es> vorerst mal so...
Viele Karten haben die Pullups bereits eingebaut. Wundere Dich also
nicht, wenn es bei einer anderen Karte nicht mehr funktioniert.
Stefanus F. schrieb:> oder ganz> entfernen.
genau so. Die sind schlicht überflüssig.
Hallo,
Andreas B. schrieb:> Viele Karten haben die Pullups bereits eingebaut. Wundere Dich also> nicht, wenn es bei einer anderen Karte nicht mehr funktioniert.
solcher möglichen Probleme bin ich mir durchaus bewußt.
Andreas B. schrieb:> Michael U. schrieb:>> Wenn der ein paarmal durchläuft bleibts es>> vorerst mal so...>> Viele Karten haben die Pullups bereits eingebaut. Wundere Dich also> nicht, wenn es bei einer anderen Karte nicht mehr funktioniert.>> Stefanus F. schrieb:>> oder ganz>> entfernen.>> genau so. Die sind schlicht überflüssig.
ich bin da wohl zu pragmatisch: hier laufen 3 Displays mit SD-Card in
dieser Beziehung unverändert, inzwischen aber mit kurzen Verbindungen,
also löte ich nicht... ;-)
Kritischer sehe ich einzelne SD-Card-Module am ESP, die haben teilweise
recht abenteuerliche Beschaltungen drauf.
Gruß aus Berlin
Michael