Hallo, ich benutze Ulrichs Routine im SPIMode um eine SD Karte auf einem ATmega8 anzusteuern (ohne FAT). Leider funktioniert noch nicht einmal die Initialisierung. Um die Signale auf einem Oszilloskop darstellen zu können, sende ich ständig CMD0, mit kleinen Pausen zwischen drinn. Ich benutze fürs Senden (µC->SD) Spannungsteiler als Pegelwandler. Für den Empfang (SD->µC) habe ich, um auf Nummer sicher zu gehen, 2NPN Transistoren genommen. Also das CMD0 kommt 100%ig bei der SD Karte an. Die SD Karte antwortet aber nicht mit 0x01. Ich habe 3 Verschiedene Karten ausprobiert. Diese Antworten alle unterschiedlich: (Mit Oszi gemessen und µC bestätigt dies) SanDisk 128MB -> Direkt 0xFE SanDisk 128MB (Selbe Modell) erst nach einmaligem 0xFF -> 0xC0. extrememory 1GB -> Direkt 0xFE Was mich etwas stutzig macht ist, dass nach jedem geschriebenem Byte, die MOSI Leitung nach der fallenden Flanke des Taktes vom letzten Bit, für einen viertel Takt etwa high ist. Eigentlich sollte die SD Karte damit ja kein problem haben, da dieses Signal ja nicht bei einer steigenden Flanke anliegt. Liegt anscheind daran, dass die MOSI high ist, wenn keine Daten gesendet werden. Ich konnte leider nirgendwo finden, was 0xFE bzw. 0xC0 bedeuten. Ausser das 0xFE wohl das Startbit beim lesen eines Blocks ist. Aber soweit bin ich ja noch nichtmals... Das Thema war zwar schon oft da, aber irgendwie scheint es ja doch immer wieder neue Phänomene zu geben. Freue mich über jede Hilfe! Gruß, Daniel
Probier es mal mit einer sehr niedrigen SPI-Clk Frequenz, z.B. 10kHz.
Danke für den Tip. Hab den SPI Takt schon aufs Minimum gesetzt. Ich komm einfach nicht weiter. Habe jetz sogar schon die Pegelwandlung mit Transistoren aufgebaut. Hat aber absolut nichts gebracht. Morgen kommt mein ATMega8L. Den werde ich dann mal direkt mit 3.3V betreiben. Wobei ich eigentlich nicht mehr drann glaube, dass es ein Signalproblem ist. Vielleicht hat ja hier doch noch jemand eine zündende Idee. Gruß, Daniel
Beim Ulrich auf der Homepage gibts eine Timingtabelle, hälst du die Timings ein? Das ist nämlich sehr wichtig. Und was deine Pegel angeht, stimmen sie immer?
Das mit dem Timing werde ich mir nochmal angucken. Die Pegel sehen gut aus. Ich werde mal sehen, ob ich ein Foto schiessen kann.
ich habe es vor kurzem programmiert und habe festgestellt, das nach dem ich das Kommando übertragen habe, ich mindestens 8 Clocks warten muss, bevor ich mit einer Antwort rechnen kann, aber 16 Clocks sind bereits zu viel.
Hmm, schreibe ich mmc_write_byte(0xFF); zwischen schreiben und lesen, meldet mir die Karte 0x07 zurück.. Vielleicht kommen wir nun der Sache was näher? Muss mich nun erstmal um andere Arbeit kümmern. Werde später nochwas weiter forschen :) Gruß, Daniel
HA! JA! Mit dem ATMega8L mit 3,3V betrieben, kann ich nun alle Karten mit der Version von Ulrich (ohne jegliche Timing-Änderungen) auslesen. Was noch ganz wichtig is, damit der Spaß funktioniert: Der ISP Adapter darf nicht angeschlossen sein! Vielleicht hilft das ja dem ein oder anderen. Es grüßt, ein fröhlicher Daniel ;)
Gratuliere! Das Problem hättest Du auch einfacher lösen können. Als Du im ersten Posting schriebst "Ich benutze fürs Senden (µC->SD) Spannungsteiler als Pegelwandler" wollte ich Dich schon darauf aufmerksam machen, dass es damit bei mir Probleme gab. Ich hatte sogar schon den Link herausgesucht. <http://www.mikrocontroller.net/forum/read-1-312491.html#321153> Aber aufgrund Deiner Behauptung "Also das CMD0 kommt 100%ig bei der SD Karte an." dachte ich dann, Du hast schon alles mit einem Oszi nachgeprüft, insbesondere auch die Flankensteilheit. > Der ISP Adapter darf nicht angeschlossen sein! Vielleicht hilft das > ja dem ein oder anderen. Wenn die SD-Karte (wie auch der ISP) an Port B hängen, klingt das logisch.
Da hast du recht. Auf die Flankensteilheit, hab ich gar nicht geachtet. Mit sowas hatte nicht gerechnet. Deinen Beitrag habe ich auch bei meiner Suche gefunden. Und danach dann auch die MMC Spec. Die ich total misinterpretiert hab, wie ich grade festgestellt hab ;) Dort steht Max Clock Rise Time -> 10ns und bei Min Clock Rise Time steht nichts. Ich hab das so verstanden, dass es nicht schneller als 10ns werden darf. Aber das macht bei ner Flankenanstiegszeit ja gar keinen Sinn, da irgend ein Limit zu setzen, wie schnell es maximal sein darf... Also absofort vertrau ich den Forenbeiträgen mehr als meinem Verstand ;) Ein Vorteil hat es aber, dass ich da so lange drann rumgdoktort hab. Ich habe nun Verstanden, wie der ganze Kram funktioniert. Gruß, Daniel
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.