Forum: Mikrocontroller und Digitale Elektronik MMC Single Block Read geht nicht


von Daniel R. (daniel_r)


Lesenswert?

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

von john (Gast)


Lesenswert?

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

von Daniel R. (daniel_r)


Lesenswert?

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

von john (Gast)


Lesenswert?

bei mir kommt das 0xfe, je nach karte, zwischen 1-30 bytes später

eigentlich ist 512 standard

von Daniel R. (daniel_r)


Lesenswert?

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

von Daniel R. (daniel_r)


Lesenswert?

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

von Daniel R. (daniel_r)


Lesenswert?

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...

von Irosenhagen (Gast)


Lesenswert?

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.

von Daniel R. (daniel_r)


Lesenswert?

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

von fubu (Gast)


Lesenswert?

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.

von Irosenhagen (Gast)


Lesenswert?

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.

von Irosenhagen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.