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


von Andy (Gast)


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

von Gast (Gast)


Lesenswert?

Deine Adresse ist 1 Byte lang?

von Andy (Gast)


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

von Gast (Gast)


Lesenswert?

Aso, also ist deine Adresse 0x00000000.

von T. Stütz (Gast)


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

von Andy (Gast)


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

von kalle (Gast)


Lesenswert?

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

bräuchte nur deine mail.. :p

von Philipp Burch (not logged in) (Gast)


Lesenswert?

@kalle:

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

von Andy (Gast)


Lesenswert?

@kalle: für welchen Controller hast du das programmiert?

Andy

von kalle (Gast)


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

von mr.chip (Gast)


Lesenswert?

Hallo

Dürfte ich auch haben?

michaelbieri[ät]gmx[punkt]ch

Gruss

Michael

von mr.chip (Gast)


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

von Olaf (Gast)


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

von mr.chip (Gast)


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?

von Mockup (Gast)


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

von Olaf (Gast)


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

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.