Forum: Mikrocontroller und Digitale Elektronik SD-Karte CRC 4-Bit-Modus


von Albi G. (deralbi)


Lesenswert?

Hallo.
Ich hab irgendwie ein kleines Problemchen ;-) Ich sitze am 4-Bit-Modus 
der Sd-Karten. Lesen funktioniert schon super.
Mein Problem ist eher das Schreiben. Jeder 512-Byte-Block ist per CRC 
gesichert. Ist der übermittelte CRC falsch, so wird der Block verworfen.
Der CRC-Check lässt sich leider nicht ausschalten.
Das schreiben im 1-Bit-SD-Modus funktioniert. Dort ist der CRC klar.

Im 4-Bit-Modus sagt das SD-Karten-Datenblatt:
>When the wide bus option is used, the data is transferred 4 bits at a time 
>(refer to Figure 3-8). Start and end bits, as well as the CRC bits, are 
>transmitted for every one of the DAT lines. CRC bits are calculated and >checked 
for every DAT line individually.

So wie ich das interpretiere muss man also jedes Bit, das auf einer 
Leitgun liegt in den leitungsspezifischen CRC integrieren. Auf einer 
Leitung liegen ja immer nur 2Bit eines Bytes. (4Bit-parallel interface 
halt) So benötigt man 4 Bytes, bis ein Bayte auf einer Leitung 
übertragen wurde. Diese Byte verwende ich dann für die CRC-Berechnung.
Bisher klapt es konstante Daten zu schreiben. (0x53, 0x53, 0x53, ..)
Was nicht geht: Datenmatsch. (0x88, 0xff, 0x46, 0xA5, ...)

Irgendwas ist da also Faul -> entweder an der CRC-Generierung oder an 
der CRC-Übertragung.
Ich habe daher mal einen Brute-Force-Test gemacht:
Jeweils ein Datenblock mit Nullen gefüllt und am Ende ein Byte wo nur 
ein Bit gesetzt ist. So wird eine Leitung nur ein einziges mal 
beansprucht, sodass dort der CRC ungleich 0 wird.
Der CRC wurde dann auf jeder der 4 Leitungen einfach durchgetestet.
Also um einmal eine 0x02 zu übertragen wurde auf DAT0 bis DAT3 der CRC 0 
bis 65536 übertragen während die anderen Leitungen CRC==0 hatten.
Raus kam zum schluss das hier: www.der-albi.de/Disp3.jpg

Überall wo "Test.." steht wurde kein_ CRC auf _irgendeiner Leitung 
akzeptiert. Bei 0x01 hingegen war der CRC 4129 auf DAT0 gültig.

Fazit: irgendwas stimmt nicht. Da 0x02 z.B. auf DAT1 irgendeinen 
gültigen CRC haben müsste.

Vllt hat jedmand schonmal damit herumexperimentiert und weiß mehr...!?
Ich würde den code gerne zum Schluss, wenn er funktioniert 
veröffentlichen.

MFG

von Albi G. (deralbi)


Lesenswert?

Grml. Hab nochwas vergessen:
Ich hatte noch einen weiteren Test durchgeführt:
Ich hab diesen 0-Bytes-Block-außer[511]=0x02 per CardReader auf die 
Sd-Karte geschrieben. Dann hab ich diesen Block ausgelesen.
Die SD-Karte gibt ja in dem Fall den CRC mit. Diese CRCs habe ich 
gespeichert und versucht den ausgelesenen Block mit den CRCs wieder zu 
schrieben. Nichtmal das ging.
Komisch war auch, das der CRC auf einer Leitung ankam, auf der das Bit 
gar nicht gesendet wurde. Aber wenigstens das stimmte: es war nur eine 
Dat-Line, deren CRC ungleich 0 war.
hmmh. Ich hoffe das hilft Wieter ;-)

von Albi G. (deralbi)


Lesenswert?

Hmmh nuja. Vergesst es, Leute.
Ich habs geschaft. Ich habe mit BruteForce den CRC für eine Leitung 
generiert. Diese Angabe hat mit weitergeholfen, den CRC-Algo mit der 
richtigen Reihenfolge der Bits zu füttern. So weit so gut.
Der Code kommt gleich in die Codesammlung.

MFG
...und Danke fürs Mitlesen ;-)

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.