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
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.