Forum: Mikrocontroller und Digitale Elektronik SD/MMC Karte Adressierung


von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hallo Zusammen

ich versuche derzeit eine SD/MMC Karte mit meinem eZ80 Development Kit
anzusteuern. Hartware, Karte, Software funktionieren gut.
Nur beim lesen der Karte ist mir aufgefallen das sich bei bestimmten
Adressen die Karte falsche Daten ausgibt.
Beim lesen im (READ SINGLE BLOCK) 512Byte:
    CMD17:  51.00.00.0E.00.01 und 51.00.00.10.00.01 wie
            51.00.00.1E.00.01 und 51.00.00.20.00.01.. usw.
sind die Daten gleich werden doppelt ausgelesen.
Die folgenden Daten sind dann immer um 512Byte verschoben.
Hat das jemand eine Idee wo der Denkfehler liegt?

Gruß
Hansjörg.

: Verschoben durch User
von Jim M. (turboj)


Lesenswert?

Unter Windoof hat man oft das Problem dass man die Karte nur als Admin 
komplett auslesen kann - und selbst dann geht das nicht über den 
Laufwerksbuchstaben (der steht nur für die FAT Partition). Das kann 
einen stark verwirren.

Ach ja: SD und SDHC haben unterschiedliche Blockaddressen. Ist das eine 
<2GB Karte?

von Ketan (Gast)


Lesenswert?

Jim M. schrieb:

> Unter Windoof hat man oft das Problem dass man die Karte nur als Admin
> komplett auslesen kann - und selbst dann geht das nicht über den
> Laufwerksbuchstaben (der steht nur für die FAT Partition). Das kann
> einen stark verwirren.

Kannst du nicht Windows schreiben? Musst du wie ein zurückgebliebener 
Windoof schreiben? Was hat Windows überhaupt mit dem obigen Problem zu 
tun? Der TO hat eine "eZ80 Development Kit".

von Brue W. (brue)


Lesenswert?

Was du genau mit "sind die Daten gleich werden doppelt ausgelesen." 
meinst kann ich nicht nachvollziehen.

Wichtig waere aber mal zu wissen was fuer eine Karte verwendest, handelt 
es sich um eine SDSC (Standard capacity) wird eine Byte Adressierung 
verwendet, bei grösseren Karten (SDHC SDXC) sind es Sektoradressen (1 
Sektor = 512 Bytes).

Gruss
brue

von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Brue W. schrieb:
> Was du genau mit "sind die Daten gleich werden doppelt ausgelesen."
> meinst kann ich nicht nachvollziehen.
>
> Wichtig waere aber mal zu wissen was fuer eine Karte verwendest, handelt
> es sich um eine SDSC (Standard capacity) wird eine Byte Adressierung
> verwendet, bei grösseren Karten (SDHC SDXC) sind es Sektoradressen (1
> Sektor = 512 Bytes).
>
> Gruss
> brue

Hi brue, ich beschäftige mich erst neu mit Softwareanwendungen.
Aber Doofschwätzer haben hier nichts zu suchen. Ich glaube den Anderen 
hier
ist die Sache schon wichtig.
Zu meinem anliegen.
Ich teste gerade mit einer MMC plus 2GB Premium Karte.
Der effekt ist dass ich bei der Adresse CMD17.00.00.0E.00... die 
gleichen Daten erhalte wie bei .00.00.10.00... und bei .00.00.1E.00. und 
.00.00.20.00. usw.
Ich addiere zur Adress 512 = 200H und lese 512Byte aus. Die Daten sind 
bis zur genannten Adresse ok. dann in .0E.00. und  .10.00. gleich.
was mach ic falsch??

Gruss
Hansjörg

von Dr. Sommer (Gast)


Lesenswert?

Sicher dass die Daten auf der Karte nicht einfach so sind und sich 
wiederholen? Wie geprüft? Was soll denn an der Adresse liegen (FAT?)? 
Welches API/Library nutzt du, wie sieht dein Code aus?

von Jim M. (turboj)


Lesenswert?

Hansjörg W. schrieb:
> was mach ic falsch??

Dumpe mal den Sektor 0 und schau Dir an was so in der Partitionstabelle 
steht. Vor der 1. Partition ist meistens freier Platz für z.B. 
irgendwelchen Boot Code - da kann also auch mal was doppelt kommen.

Und wie oben erwähnt sieht man das unter Windows OS nur als Admin und 
braucht AFAIK Tools von einem Dritthersteller - ich lese daher solche 
Sachen gerne unter Linux aus, aber YMMV.

von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hallo,
ich schreibe den Code in .ASM aus meinem eZ80 Development (eZ80F91)
Kit Board. Habe keine Software zum zeigen auf dem PC.
Kann das Prinzip kurz darstellen:
Ich benutze einen Zähler 16Bit high und einen 8Bit low.

        ld hl,0000h  ; high Adr.
        ld e,01h     ; low Adr. Start
loop1:  inc e        ; low 8Bit n+1
        cp lowmax    ; low Adr. Max  (20h)
        jp nc,loop2
        inc hl       ; high 16Bit n+1
        ld e,01
loop2: ld d,00h
        add hl,hl   ;*2
        add hl,hl   ;*4
        add hl,hl   ;*8
        add hl,hl   ;*16
        add hl,hl   ;*32
        add hl,de   ; high mit low Adr. addieren
        REPT 9
        sla hl_de   ; Shift um 9* links und erhalte n+512(200h)

        call SD/MMC_command

        jp loop1

von Dr. Sommer (Gast)


Lesenswert?

SD-Karten Zugriff in Assembler? Weil das in C schon so einfach ist?

Hansjörg W. schrieb:
> Habe keine Software zum zeigen auf dem PC.
Dann lade dir mal HxD runter, das kann Datenträger (auch SD-Karten) 
direkt öffnen. Da kannst du dann zur gewünschten Adresse springen und 
gucken was da tatsächlich ist. https://mh-nexus.de/de/hxd/

von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hi, Herr Dr Sommer ich habe da ein Problem.
dieser Hexeditor ist gut. Zeigt mir die Daten auf der MMC (PC Daten) 
richtig an. Nun irritiert mich die Adress Ausgabe. Im Datendlatt der 
SD/MMC ist die Aussage, die Adr. muss grösser 512Byte also > 1FFH = 0200 
sein. 02.00, 04.00, 06.00. Im Hexeditor zeigt es mir > 0FH = 00.10 an. 
01, 20, 30,...
Die MMC Karte läst in meinem System auch kein Zugriff kleiner xx.x2.00 
zu. Lesefehler, also innerhalb der 512Byts.Ich kann nur mit Adresse
grösser xx.xx.x2.00 / .x4.00/ .x6.00/.x8.00 zugreifen. Der Hexeditor 
greift mit xx.xx.xx.10/ .xx.20/ .xx.30/ .xx.40 zu.
Muss ich da die Blockgrösse von 512Byte verändern ??

von Dr. Sommer (Gast)


Lesenswert?

Hansjörg W. schrieb:
> Im Datendlatt der
> SD/MMC ist die Aussage, die Adr. muss grösser 512Byte also > 1FFH = 0200
> sein.
Das musst du falsch verstanden haben. Der Speicher fängt ab 0 an. Da 
befindet sich der Master Boot Record (MBR). Darauf folgt eine endlose 
Folge von Bytes, die (aus logischer Sicht) erstmal nicht strukturiert 
sind. Lediglich die Zugriffe müssen an Grenzen von 512Bytes ausgerichtet 
sein, aber 0 ist ja auch eine. Du kannst auch die Daten an schrägen 
Adressen wie 1365 o.ä. lesen, indem du eben die 512 Bytes ab Adresse 
1024 liest und von den gelesenen Daten das Byte 1365-1024=341 nimmst.
Bei HxD sieht man davon nichts, weil das alles der SD-Karten-Leser bzw. 
dessen Treiber vom PC erledigt. Dort wird nur die Folge an Bytes 
dargestellt, auch wenn der Lesezugriff im Hintergrund an 
512-Byte-Grenzen ausgerichtet war.

Hansjörg W. schrieb:
> Die MMC Karte läst in meinem System auch kein Zugriff kleiner xx.x2.00
> zu.
Auch bei Adresse 0 nicht? Dann ist die Karte kaputt oder du machst was 
falsch. Wie soll man sonst den MBR auslesen?

von Noch einer (Gast)


Lesenswert?

Würde ich doch zuerst mal eine andere Karte eines anderen Herstellers 
ausprobieren. Nächster Test wäre dann mit einem Linux Hexeditor.

Erst wenn 2 Karten und 2 BS den selben verwirrenden Unfug machen nach 
einem Denkfehler suchen.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Bist du sicher, dass der 2. Block gleichen Inhalts von der Karte kommt? 
Ich habe das auch mal so gemacht. Da passierte das auch. Ich kam dan 
drauf, dass der vermeintliche 2.gleiche Block gleichen Inhalts gar nicht 
von der SD kam sondern aus dem Pufferund das lesen in wirklicket mit 
einer Fehlermeldung abgebrochen wurde, zB wegen Nichtbeachten banalen 
Blockadressierungsfehlern. ...

von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hi, Danke erst mal für die zahlreiche Unterstützung. Als Einsteiger hat 
man es nicht leicht.
Dann werde ich mal den teste mit verschiedene Karten machen.
Habe dazu mal alte MMC Karten rausgesucht mit verschiedener Grösse.
32MB, 512MB, 1GB, 2GB. Gibt es bereiche die man nicht überschreiben 
darf?
wie z.B. Sec 0. Die Adressierungsart ist aber nicht Grössenabhängig?.
Das Verhalten sollte soweit gleich sein??

: Bearbeitet durch User
von Ch.G. (Gast)


Lesenswert?

Hansjörg W. schrieb:
> Gibt es bereiche die man nicht überschreiben
> darf?
> wie z.B. Sec 0.
...nein, du darfst die komplette Karte beschreiben wie du lustig bist, 
ABER dann darf man natürlich nicht mehr erwarten das ein sich vorher auf 
der Karte befindliches Dateisystem noch funktioniert bzw richtig gelesen 
werden kann, kommt halt drauf welche Blöcke du überschreibst wie z.B. 
Sektor 0, das ist der MBR und da steht die Partitionstabelle drin, ohne 
die, kein Zugriff mit Windows etc. mehr möglich da "defektes" 
Dateisystem

Die Adressierungsart ist aber nicht Grössenabhängig?.
wie Bruce W schon oben erwähnte: es gibt die Byte- und 
Sektor-Adressierung, je nach "größe" / Typ der Karte.

von Ch.G. (Gast)


Lesenswert?

... die LBA Sektoren sind eigentlich immer 512 byte aligned, ABER können 
auch andere Größen annehmen, da gibts aber irgendwo ein Feld entweder im 
Descriptor der Karte, im MBR oder im ersten Sektor der jeweiligen 
Partition, weis ich jetzt leider nicht mehr auswendig....

von Ch.G. (Gast)


Lesenswert?

Ch.G. schrieb:
> ... die LBA Sektoren sind eigentlich immer 512 byte aligned, ABER können
> auch andere Größen annehmen, da gibts aber irgendwo ein Feld entweder im
> Descriptor der Karte, im MBR oder im ersten Sektor der jeweiligen
> Partition, weis ich jetzt leider nicht mehr auswendig....

... oder ich hab mich jetzt ganz verhaspelt und das bezog sich nur auf 
die Sektoren der FATs, und die Karte wird immer in 512 byte 
Blöcken(Sektoren) addressiert (also byte-adresse / 512) oder nur die 
byte-addresse wenn die Karte es nicht anders kann.

von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hi Ch.G, dann werde ich mal loslegen muss mein Programm dazu etwas 
abändern.
Ich werde dann das Ergebniss euch mitteilen.
Klasse Infoaustausch.

Beitrag #5152561 wurde vom Autor gelöscht.
von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hi zusammen, hab den Fehler gefunden beim Shift von high Adr. nach linke
habe ich 5mal hl Register Add statt nur 3mal. Dadurch entstand eine 
Adresslücke leerbereich der sich doppelt ausgewirkt hat. Somit habe ich 
immer beim übergang eine Adresse zweimal ausgelesen.

Neue Adressberechnung high+low:

        ld hl,0000h  ; high Adr.
        ld e,01h     ; low Adr. Start
loop1:  inc e        ; low 8Bit n+1
        cp lowmax    ; low Adr. Max  (20h)
        jp nc,loop2
        inc hl       ; high 16Bit n+1
        ld e,01
loop2: ld d,00h
        add hl,hl   ;*2
        add hl,hl   ;*4
        add hl,hl   ;*8
        add hl,de   ; high mit low Adr. addieren
        REPT 9
        sla hl_de   ; Shift um 9* links und erhalte n+512(200h)

        call SD/MMC_command

        jp loop1

Ich werde jetzt noch einige tests mit SD-Karten machen und versuchen 
FAT16 zu lesen.
Falls jemand mehr zu meinem Projekt wissen will kann mit Hardware Info 
helfen.Das ganze soll ein Foto Bilderrahmen werden. Der Weg dahin wird 
noch steinig genug sein.

von Adam P. (adamap)


Lesenswert?

Hey Hansjörg Winterhalter,

nur so aus neugier...steuerst du die SD mit SPI oder mit 4/8-bit an?
Und warum bitte in ASM?

von Hansjörg W. (Firma: --) (winielektronik)


Lesenswert?

Hi adamap,

> "Und warum bitte in ASM?"

ich mache seit vielen Jahren Entwicklung im bereich peripherie 
Micocontroller
Vor etwa 5Jahren bekam ich von Zilog ein eZ80F Development Kit für die 
unterstützung an einem selbstfahrendes Autonomes Fahrzeug. Alle versuche 
es in einer Hochsprache zu entwickeln schlugen bei allen beteiligten 
fehl. Ich schrieb meine Testprogramme schon immer in .ASM und versuchte 
es auch in diesem Projekt mit dem eZ80F91 Compilert auch in .ASM.
Bingo, in der halben Zeit geschrieben, nur 10% Speicherbedarf, 
Ausreichende Performence. Was will man mehr.
Das Programm für die SD/MMC Karte schrieb ich in .ASM in einem halben 
Tag.
Programmgrösse mit Initialisierung der Hardware 1,2Kb. Das muss nicht 
die Einsteinlösung sein, ist für mich ein guter alternative.
Programm ist für jeden Überschaubar, kann diese als Funktionen in C 
einbinden. Somit sind alle möglichkeiten offen und ich kann in kürze 
alles einzeln durchtesten.

> "Und warum bitte in ASM?"

Die Ansteuerung mache ich über die SPI des eZ80F91 auf einer 
Prototypenplatine. Ich muss jetzt doch noch ein bediener-Display dazu 
machen um es einfacher zu Handhaben. ( habe noch einige Toshiba 128X128 
LCD) mal schauen.

 um


Ich kann jetzt bereits die Speicherkarte linear ansprechen und Programme 
Speichern und abrufen.

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.