www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S256 / SDCard / SPI / Clock


Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte gerne von meiner SD-Karte blockweise (denke das sind 
512B/Block) Daten lesen. Ich habe das Olimex AT91SAM7P256. Auf dem Board 
ist schon der SD-Karten-Slot vorhanden. Angesteuert wird das Ganze über 
SPI. Dazu habe ich mir den Democode von Olimex heruntergeladen und mal 
probiert, den ersten Block zu laden. Vorher habe ich das Buffer-Array 
geleert. Es kommt scheinbar was an (Daten im Array nach Leerung und 
Lesen des ersten Blocks). Allerdings nicht das, was ich in HxD sehe, 
wenn ich die Karte direkt am PC ansehe. (eigentlich sollte so 
FAT16-Gedöns zu begin stehen). Nur nochmal zur Erinnerung: mir reicht 
das blockweise Lesen. Ich brauche kein Filesystem.

Nachdem der Buffer (512B) nur am Anfang Zeichen aufweist, habe ich das 
gefühl, dass es sich ähnlich zu RS232 verhält, wenn ich eine zu hohe 
oder zu niedrige Baudrate einstelle.

Gibt es bei SPI auch sowas ähnliches wie ne Baudrate, die ggf. falsch 
eingestellt sein könnte?

Hat jemand ein Minimalbeispiel um SD zu initialisieren und den ersten 
Block von Karte zu lesen?

Ansonsten bin ich froh um jeden Hinweis.

Hat es irgendwelche Auswirkungen, wenn ich das Board zum Entwickeln via 
USB am PC hängen habe? Weil bei mir ist es so, dass ich immer via SAM-BA 
die Binaries "hochlade" und dann im Speicher ausführe, um nicht jedesmal 
das EEPROM zu programmieren.

Viele Grüße,
Peter

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frohe Weihnachten an alle!

ich habe jetzt mal die MMC-Funktionen aus dem MP3 Playerprojekt hier 
getestet. Leider ohne Erfolg.

Was ich getestet habe:
// Initialisieren
uart0_init();
disk_initialize();

// Buffer löschen
for (x=0; x<512; x++)
{
    mmc_buffer[x] = 255;
}

// ersten Block lesen
if (disk_read(mmc_buffer, 0, 1) == RES_ERROR)
{
    uart0_puts("error");
}
    else
{
    uart0_puts("ok");
}
Leider kommt im Buffer lange 00 00 00 00 und zwischendurch sind ein paar 
andere Werte vorhanden (die allerdings so nicht auf der SD-Karte sind). 
Die disk_read gibt "ok" zurück. Wenn ich die Karte rausziehe und das 
Selbe mache, kommt richtigerweise "error" an.

Hmm, weiß jetzt nicht so recht, wie ich weiter vorgehen kann. Habe schon 
mit verschiedenen Einstellungen in den MMC-Funktionen "gespielt". 
Allerdings hat sich nichts geändert.

Kann mir bitte jemand einen Tip geben, welche Schritte ich unternehmen 
könnte, um den Block zu lesen?

Kann es sein, dass der AT91SAM7S256 sich anders verhält, wenn das 
Programm aus dem SRAM ausgeführt wird und die USB-Verbindung zum PC 
besteht. Muss die MMC-Funktion im EEPROM ausgeführt werden? Kann ich an 
SPI auch so ne Art Baudrate einstellen? Würde gerne ein paar "Schrauben" 
zum drehen haben...

Ciao und schöne Feiertage!
Peter

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

das Thema SD-Karte scheint auch "gegessen" zu sein. Allerdings habe ich 
noch ein paar Fragen zu dem Thema offen:

@Michael: habe den Link von Dir probiert. Was ich seltsam fand: die 
SD-Karte hat genau das Selbe wie bei meinem ursprünglichen Code 
zurückgegeben. Im Nachhinein nach ein paar Tests fand ich heraus, dass 
die Rückgabe wohl richtig war.

Hier nun zu meiner Frage: Wieso bekomme ich wenn ich den 1. Sektor (oder 
Block oder wie man das auch immer nennen möchte) mit

sd_readsector(y, mmc_buffer, 0, 0);
y ist ja scheinbar LBA? Hat das was besonderes zu bedeuten? Fängt doch 
bei 0 an, oder?


in den Buffer lese etwas anderes, als ich mit HxD sehe, wenn ich die 
Karte "Low-Level" öffne und mir 0x00000000 - ansehe?

Das Komische ist, dass scheinbar ganz zu Beginn Daten auf der Karte 
stehen, die ich mit HxD so nicht auf der Karte finden konnte. Ich hab 
mal testweise ein paar mehr Blöcke eingelesen und via Terminal 
zugesehen. Dann kamen auch irgendwann die Daten, die mir HxD als Sector 
0 verkaufen möchte. Wie kann denn sowas sein?

Die Blöcke auf der SD-Karte sind doch immer 512 Bytes groß, oder?

Und die liegen doch nacheinander auf der Karte, oder ist das nicht so?

Falls ein Block von der SD-Karte als fehlerhaft markiert wird, würde der 
dann überhaupt gelesen werden können? (Ich frage nur, um auszuschließen, 
dass die ersten Ausgaben, die ich über HxD nicht finden konnte nicht 
etwa fehlerhafte Blöcke sind)

Also es wäre sehr nett, wenn der Ein oder Andere hier noch ein wenig 
Licht ins Dunkle bringen könnte.

Vielen Dank,
Peter

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>in den Buffer lese etwas anderes, als ich mit HxD sehe, wenn ich die
>Karte "Low-Level" öffne und mir 0x00000000 - ansehe?

Lies mal was zum Thema Bootsektor, MBR Master Boot Record
und Partitionstabelle. Dann wird dir einiges klar.

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Holger,

ich glaube nicht, dass mich diese Antwort zufrieden stellt. Will mich 
auch gar nicht beklagen, aber für mich hört sich das unterm Strich so an 
wie "machs richtig, dann funktionierts auch". Damit kann ich leider nix 
anfangen, sorry.

Daten hin oder her. Auf der Karte sollten Daten stehen. Sektor 0 in HxD 
ist scheinbar nicht das Gleiche wie Sektor 0 via AT91SAM7 - Code.

Gruß,
Peter

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sektor 0 in HxD
>ist scheinbar nicht das Gleiche wie Sektor 0 via AT91SAM7 - Code.

Genau so ist es;) Der AT91SAM7 liest den richtigen Sektor 0.
HxD den Sektor 0 des logischen Laufwerks. Das ist aber nicht unbedingt
Sektor 0 der SD sondern oft irgendwas so ab Sektor 32. Wie gesagt,
mach dich mal zu den Themen die ich oben angegeben habe schlau.

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Holger,

wenn das so ist, wie Du es geschrieben hast, dann reicht mir das schon 
als Info, da ich sowieso nur Sektoren lesen möchte. Wenn die dann auch 
noch "in Reihe" liegen, dann ist das alles OK für mich. Ich will ja kein 
Filesystem.

Kennst Du zufällig ein PRG, das auf einer Windows-Kiste auch "den 
richtigen Sektor 0" lesen kann?

Danke und Viele Grüße,
Peter

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm das Programm "Winhex", damit kannst du dir unter Windows sowohl 
physikalische Laufwerke als auch logische Laufwerke anschauen.
Was du suchst ist ein Editor, der physikalische Laufwerke anzeigen kann.

Es macht aber schon Sinn, sich mal mit der Materie Filesystem zu 
beschaeftigen, auch wenn du es vielleicht nicht brauchst.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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