Forum: Mikrocontroller und Digitale Elektronik Arduino und Mikro SD Karte


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

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
const int chipSelect = 4;
24
25
File myFile;
26
27
void setup() {
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
void printDirectory(File dir, int numTabs) {
78
  while (true) {
79
80
    File entry =  dir.openNextFile();
81
    if (! entry) {
82
      // no more files
83
      break;
84
    }
85
    for (uint8_t i = 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
void loop() {
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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Michael (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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"?

von Michael (Gast)


Lesenswert?

Das mach ich morgen mal, heute komm ich leider nicht mehr dazu....

von Michael (Gast)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Andreas B. (bitverdreher)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefanus F. schrieb:
> Das ist für mich eine interessante Rückmeldung.

Das bezog sich auf die Pfadangabe, nicht die Leitungslänge.

von Stefan F. (Gast)


Lesenswert?

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.

von Michael U. (amiga)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

Ich würde die Serien-Widerstände auf 100 Ohm reduzieren oder ganz 
entfernen.

von Andreas B. (bitverdreher)


Lesenswert?

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.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.