mikrocontroller.net

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


Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: john (Gast)
Datum:

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

eigentlich ist 512 standard

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Irosenhagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fubu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Irosenhagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Irosenhagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.