Hallo, ich habe ein Problem mit der Ansteuerung meiner MMC-Karte. Diese hängt am SPI-Bus von meinem ATmega16. Die gesamte Schaltung läuft auf 3,0V. Ich habe also keinerlei Levelshifter, oder Transistoren oder Spannungsteiler an den Leitungen. Die Leitungslänge beträgt ca 5 cm. Der SPI Clock beträgt 125KHz. Der SPI ist richtig initialisiert... Ich möchte einen Block der MMC auslesen. Dies klappt allerdings nicht. Die Initialisierung klappt und ich kann CID und CSD ohne Probleme auslesen. Mein Programm ist selbst geschrieben(jedoch nach Ulrich Radigs Vorlage), allerdings in Assembler. Ich habe mir auch schon alle Beiträge, die man im Forum findet, wenn man MMC in die Suche eingibt durchgelesen, jedoch konnte ich keine Hinweise finden, die meinem Problem entsprechen. Dort lag es meistens am Clock oder an der Spannung. Irgendwas muss ich wohl falsch machen... nur was? Mein Programm sieht so aus: Die MMC wird initialisiert(CMD0 und dann CMD1). Danach wird CID ausgelesen und die Kartengröße auf einem LCD dargestellt. Dann sende ich CMD17 mit Argument 0x00000000, damit Block 0 ausgelesen wird. Dann versuche ich 32 Byte zu lesen(Jedoch habe ich zuvor die Blocklänge nicht festgelegt, um auszuschließen, dass dort was schiefläuft. Aber das ist ja egal, weil ich ja nur einen Block lesen will...was danach ist ist ja wurst). Also: Nachdem ich CMD17 (0x51,0x00,0x00,0x00,0x00,0xFF) gesendet habe warte ich, bis von der MMC was anderes als 0xFF kommt. Dann müsste ja eigentlich das Startbyte 0xFE und dann die Daten kommen oder?? Ich erhalte jedoch immer abwechselnd sieben 0xFF und dann ein 0x01(also: 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0x01 usw.). Das Startbyte kommt einfach nicht...auch nicht, wenn ich in einer Endlosschleife darauf warte. Zwischen den einzelnen Kommandos sende ich immer ein paar FFs. Chip Select ist während den Transaktionen selbstverständlich low(aktiv). Ach ja: Die MMC ist neu von Reichelt: 128MB takeMS. Mir fällt wirklich nichts mehr ein, was es sein könnte. Kann mir bitte jemand den genauen Ablauf eines Single-Block-Reads erklären? Weiß vielleicht jemand noch einen Rat? Vielen Dank schon mal. Gruß Daniel
das sieht alles gut aus. das 0x01 ist das R1. danach sollte eigentlich das 0xfe startbyte kommen. versuch dochmal vor dem lesen die blocklength auf 512 zu setzten (direkt nach dem init. so mache ich das
Vielen Dank für die Antwort! >das sieht alles gut aus. das 0x01 ist das R1. danach sollte eigentlich >das 0xfe startbyte kommen. Da bin ich aber erleichtert...Wie lange geht es dann ungefähr bis FE kommt? >versuch dochmal vor dem lesen die blocklength auf 512 zu setzten >(direkt nach dem init. so mache ich das OK, das werd ich mal versuchen... Ist nicht standardmäßig schon 512 Byte voreingestellt? Gruß Daniel
bei mir kommt das 0xfe, je nach karte, zwischen 1-30 bytes später eigentlich ist 512 standard
Ich habe nun versucht die blocklength auf 512Bytes zu stellen und danach einen Block auszulesen, jedoch ohne Erfolg. Ich bekomme wieder sieben 0xFFs und ein 0x01. Ich habe auch Delays zwischen den Befehlen eingefügt. Ich weiß nicht mehr weiter. Die Spannung ist auch stabil(Labornetzteil, und zwar ein Richtiges). Kann sowas auch an der Karte liegen? Ich hab leider keine andere da um es zu probieren. Gruß Daniel
Ich bin jetzt ein Stückchen weiter gekommen :) Nachdem ich jetzt das CID Register nicht mehr auslese, bevor ich den Block lese, kommt jetzt ein Startbyte 0xFE. Nur das Problem ist jetzt, dass nach dem Startbyte nur 0x00 kommt. Die Blocklänge einzustellen funktioniert. Wenn ich sie auf 8 habe, bekomme ich 8 0x00 zurück, wenn ich sie auf 32 habe bekomme ich 32 0x00 zurück. Die Karte ist randvoll mit Daten(Musik, Text,pdfs)... Da müsste doch mal was anderes als 0x00 kommen. Ich habe auch schon willkürlich gewählte Blockadressen genommen(Vielfache von 32, bei 32 Byte Blocklength). Was könnte es denn jetzt noch sein? Gruß Daniel
Hallo, ich habe jetzt nochmal alles in meiner Macht stehende versucht. Es geht aber immer noch nicht viel. Wenn ich einen Block lesen will krieg ich das Startbyte, aber dann nur 0x00... Weiß denn wirklich niemand mehr etwas? Gibt es sonst noch was Bestimmtes zu beachten? Ich weiß echt nicht mehr weiter...
Ahoi, hat jemand ne Lösung für das Problem? Unsere Karte verhält sich ähnlich. Init geht, CID und CSD kommen rüber, auf den Befehl zum Auslesen von Block 0 antwortet sie zunächst mit 0x00, dann sollte ja ein paar Takte später das 0xFE kommen. Aber SO bleibt danach auf 1. Probiert haben wir lesen über CMD 11, 17 und 18. 11 erkennt unsere Karte gar nicht erst an und bei den anderen Beiden zeigt sich obiges Verhalten.
Hallo, ich habe das Problem damals gelöst bekommen. Eigentlich war es bei mir gar kein Fehler im eigentlichen Sinn. Soviel ich noch weiß hatte ich damals versehentlich einen Block ausgelesen, der konstant auf 0x00 war, wenn mich nicht alles täuscht. Also einfach mal mit der Adresse irgendwo mitten rein springen und auslesen. Daniel
hallo, ich könnte euch einen funktionierenden code geben, der auf nem Atmega32 super funzt. euer problem könnte an vielem liegen, vor allem an schlechtem code! gruss fabi.
Mh, es kommt ja keine 0x00, sondern erst eine 0x00 als Bestätigung für das Read-Commando und dann aber kein Data-Start sondern nur 0xFF. Außerdem sollte im MBR doch Inhalt vorhanden sein ;) Bei dem Code haben wir uns an die verlinkten Beispiel (Ulrich Radig usw.) gehalten.
Also gerade nochmal überprüft: CSD und CID stimmen definitiv. Die Karte schickt im CSD die richtige Größe (256MB) und im CID das richtige Herstellungsdatum. Die Kommandos und der Code sollten also funktionieren, nur beim Block Read fängt sie nicht an Daten zu senden. Das Kommando wird wieder mit 0x00 bestätigt, aber ab dann kommen nur noch 0xFF. Kein 0xFE als Startzeichen und keine Daten.
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.