mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino und Mikro SD Karte


Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
/*
   SD card basic file example

  This example shows how to create and destroy an SD card file
  The circuit:
  * SD card attached to SPI bus as follows:
  ** MOSI - pin 11
  ** MISO - pin 12
  ** CLK - pin 13
  ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

  created   Nov 2010
  by David A. Mellis
  modified 9 Apr 2012
  by Tom Igoe

  This example code is in the public domain.

  */
#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;

File myFile;

void setup() {
   // Open serial communications and wait for port to open:
   Serial.begin(9600);
   while (!Serial) {
     ; // wait for serial port to connect. Needed for native USB port only
   }

   Serial.print("Initializing SD card...");

   if (!SD.begin(chipSelect)) {
     Serial.println("initialization failed!");
     while (1);
   }
   Serial.println("initialization done.");

   if (SD.exists("example.txt")) {
     Serial.println("example.txt exists.");
   } else {
     Serial.println("example.txt doesn't exist.");
   }

   // open a new file and immediately close it:
   Serial.println("Creating example.txt...");
   myFile = SD.open("example.txt", FILE_WRITE);
   myFile.close();

   // Check to see if the file exists:
   if (SD.exists("example.txt")) {
     Serial.println("example.txt exists.");
   } else {
     Serial.println("example.txt doesn't exist.");
   }

   // delete the file:
   Serial.println("Removing example.txt...");
   SD.remove("example.txt");

   if (SD.exists("example.txt")) {
     Serial.println("example.txt exists.");
   } else {
     Serial.println("example.txt doesn't exist.");
   }

  myFile = SD.open("/");

  printDirectory(myFile, 0);

  Serial.println("done!");
}

void printDirectory(File dir, int numTabs) {
  while (true) {

    File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      break;
    }
    for (uint8_t i = 0; i < numTabs; i++) {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numTabs + 1);
    } else {
      // files have sizes, directories do not
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
    entry.close();
  }
}


void loop() {
   // nothing happens after setup finishes.
}

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

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Michael (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

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

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

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefanus F. (stefanus)
Datum:

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

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.