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