mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Block-Lesen von SD-Karte klappt nicht


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem: ich kann meine SD-Karte ansprechen und
Register wie CID, CSD usw. auslesen. Wenn ich versuche einen Datenblock
von der Karte zu lesen, kriege ich ständig 0x20 zurück, was laut Doku
"Address Error" heißen soll. Also, das heißt für mich, dass ich eine
falsche Adresse schicke, aber in der Doku steht nichts darüber, wie man
die Karte adressiert. Ich schicke folgendes Kommando:
"READ_SINGLE_BLOCK" (CMD17), "0x00" (soll Adresse Null heißen).

Was mache ich falsch.

Andy

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Adresse ist 1 Byte lang?

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie meinst du das, meine Funktione sieht folgendermaßen aus:

unsigned char SD_WriteCommand(unsigned char cmd, unsigned long data,
unsigned char crc)
{
  unsigned char i, temp;



  SPI_SendeByte(0x40 | cmd);
  SPI_SendeByte(data >> 24 & 0xFF);
  SPI_SendeByte(data >> 16 & 0xFF);
  SPI_SendeByte(data >>  8 & 0xFF);
  SPI_SendeByte(data & 0xFF);
  SPI_SendeByte(crc);


  SPI_SendeByte(DUMMY);    // 8 Dummy-Clocks senden

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aso, also ist deine Adresse 0x00000000.

Autor: T. Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch mal mit CMD16 SET_BLOCKSIZE selbige auf 512 zu setzen einige
MMC-Cards wollen unbedingt mit 512 arbeiten und kennen nix anderes

Gruss

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wie ich bis jetzt das Ganze verstanden habe, sind die Adresse für einen
 bestmmten Block immer das Vielfache von 512, also ich beginne mit 0,
dann kommt 512, 1024 usw. Wenn ich aber versuche Block 0 auszulesen,
also auf der Karte der MBR, kriege ich nicht das, was ich mit einem
Hex-Editor auf dem PC von der Karte lese.

Also, wie oben bereits erwähnt, kann ich mit meiner
SD_WriteCommand(..)-Funktion die Karte resetten, initialisieren, CID
und andere Register auslesen.

Andy

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du willst kann ich dir meine sd/mmc assembler routinen schicken, da
geht alles einwandfrei ^^

bräuchte nur deine mail.. :p

Autor: Philipp Burch (not logged in) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@kalle:

Würdest du das auch für mich tun? philipp_burch@gmx.ch
Danke!

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@kalle: für welchen Controller hast du das programmiert?

Andy

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atmega16 mit hardware spi, is aber natürlich auf jeden anderen (avr)
controller mit hardware spi portierbar.

@philipp: sorry hab dich ganz vergessen ^^ ich such gleich mal :p

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Dürfte ich auch haben?

michaelbieri[ät]gmx[punkt]ch

Gruss

Michael

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmals

Der Code von Ulrich Radig (www.ulrichradig.de) scheint mir ebenfalls
sehr zweckmässig und einfach zu bedienen.

Was mich in dem Zusammenhang noch interessieren würde: Wie kann man die
SD-Cards - ohne Dateisystem - auf dem PC auslesen? Oder kommt man nicht
darum herum, die Daten von der eigenen Schaltung auslesen zu lassen und
z.B. per serielle Schnittstelle an den PC zu senden?

Gruss

Michael

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

@mr.chip:
Unter Linux einfach /dev/sd* öffnen und lesen/schreiben.

Unter Windoze kommt man über "\\.\i:" (i der laufwerksbuchstabe
der SD-card) an das raw-device, dazu muß man aber ein eigenes program
schreiben oder suchen.

Ein 'floppy' raw write für NT gibt es irgendwo im netz (NTRawwrite.c
wenn ich mich richtig entsinne), das kann man dan entsprechened
abänderen zum lesen.

Olaf

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Unter Windoze kommt man über "\\.\i:" (i der laufwerksbuchstabe
der SD-card) an das raw-device, dazu muß man aber ein eigenes program
schreiben oder suchen.

Achso. Mit Java sähe dies dann etwa so aus(?):

FileInputStream in = new FileInputStream("\\.\i:");
in.read(...);

Oder heisst es FileReader?

Autor: Mockup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder man benutzt das programm winhex, http://www.winhex.de/
damit kannst du in der trial version auf die platte/mmc schauen.
hardware technisch.
ich finde es gut.
mfg

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"\\\\.\\i:" da ein \ in C/Java escaped werden muß, so daß ein
\ im string auftaucht. Weiter ist ein Stream wohl falsch, da es ein
"block-device" ist.

Sollte wohl eher von der 'RandomAccessFile' class abhängen.

Olaf

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.