www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MMC zum wahnsinnig werden


Autor: Loki Daelis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ihr lieben,

ich wende mich in äussester Verzweiflung an euch...
Ich probiere seit einigen Tagen eine MMC Karte mit meinem Mega16@16Mhz
(SPI Teiler 128) anzusprechen. Ich verwende AVR GCC und die MMC Lib von
Stefan Seegel.

Ich kann die MMC Karte prima initialisieren.
Sprich sie liefert bis dahin immer die richtigen antworten.

Wenn ich aber von Ihr lesen will, einen 512b Block oder einfach nur die
CID, fliege ich an folgender Funktion raus:

  unsigned char res=0xff;
  unsigned long i=0;

  while((res != 0xFE) && (i < 0xFF)) { //wait for startbyte (0xFE)
    mmc_send_byte(0xFF);
    res=SPDR;
    i++;
  }

Ich bekomme also quasi kein Go von der Karte.

Hat jemand eine Idee woran das liegen könnte?

Danke für eure Hilfe.

Autor: Loki Daelis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Ich habe jetzt rausgefunden das die Karte statt 0xFE 0x05 zurückgibt.
Ich finde nur leider nirgendwo eine Info was diese Antwort bedeutet.
Im Sandisk Sheet ist dazu auch nichts.

Hilfee!

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5 bedeutet MMC_SUCCESS, aber vor dem Auswerten muß die Bitmaske 0x1f
drauf, so dass als response 0x15 rauskommt.
Vermutlich fehlen der Karte irgendwo Wartezyklen.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kenne deine Libary nicht. Ich hab mir selber mal was
geschrieben und dort werden die Karten im SPI Mode ausgelesen. Das
funktionierte bisher mit jeder Karte, mit einer Ausnahme. Sandisk!

Ursache war das die ein paar Takte mehr brauchten bis sie sich dazu
bequemen das Response Byte rauszuschieben. Man sieht das wenn man
einfach mal mehr von der Karte liest als sie eigentlich liefern sollte
und sich die Bytes mal anschaut.

Olaf

Autor: Loki Daelis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal danke für die Tipps.

Ich werde mal noch ein paar Warezyklen einbauen.
Ich habe aber den dringenden Verdacht, das es an meiner hardware liegen
muss. Ich habe Software und Hardware SPI ausprobiert.

Und die Lib die ich verwende, wird von mehreren Usern eingesetzt...
Ich habe auch schon 3 verschieden Karten von verschiedenen Herstellern
ausprobiert.

Kann es sein das meine Signalleitungen zu lang sind?
Sind vom Controller bis zur MMC ca. 12cm Kupfer. 8cm davon über Drähte
zum MMC Board(Testschaltung).

Ist das evtl. zu lang für SPI?
Evtl. aüssere Einwirkungen?
Sollte bei 128kHz nicht so schlimm sein)
Müssen da irgendwo noch Kondensatoren an Miso,Mosi,Sck gegen Masse, zum
entstören? Hab in Referenz Schaltungen keine gefunden.

Danke.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte nicht Wartezyklen, sondern das die Karte selber etwas laenger
braucht bis sie ihr Antwortbyte schickt, das heisst man muss in der Zeit
weiter munter mit SCK klappern. Das R1 Byte kommt dann ein oder zwei
Bytes im Datenstrom versetzt, vorher sendet sie FFh.

Wenn du aber wirklich mehrere Karten von VERSCHIEDENEN Herstellern hast
so sollte es nicht daran liegen, ausserdem muessen mindestens die
einfachen dinge die CSID lesen, oder Blocklaenge auf 512Byte, klappen.
Karten von Hitachi scheinen mir am gutmuetigsten.

Ich selbst betreibe die Karte an etwa 20cm FLachbandkabel mit 200khz
SPI-Takt. In der Tat ist der Takt bei laengeren Kabeln kritisch, von
mehreren Mhz kann ich bei meiner Kabellaenge erstmal nur traeumen. Wenn
du zweifel hast mach es so langsam wie es geht und teste dann.

Mach auf jedenfall direkt an der Karte einen 100nF fuer die
Versorgungsspannung. An den anderen Leitungen sind dagegen
Kondensatoren eher schaedlich weil du damit deine Kabelqualitaet eher
verschlechterst.

BTW: Hat schon jemand eine Liste mit der Zuordnung ID-Bytes zu
hersteller gefunden? Oder kann meine noch etwas erweitern?


 switch (CID.MID) {
  case 0x06 : sprintf(dummy,"Hitachi"); break;
  case 0x00 : sprintf(dummy,"Infineon"); break;
  case 0x03 : sprintf(dummy,"Panasonic"); break;
  case 0x04 : sprintf(dummy,"Extrem Memory"); break;
  default   : sprintf(dummy,"Unbekannt %2xh",CID.MID); break;
 };

Olaf

Autor: Loki Daelis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Olaf,

das mit dem 100nf werde ich nachher mal probieren.
Aber die Taktrate hab ich momentan schon am minimmum. (Hab auch schon
mit 4Mhz Quarz probiert...)

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Olaf:  0x05: printf("SanDisk");

Gruß hagen

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
hat noch jemand die Liste der MID -> Hersteller erweitert?
Meine 128er SanDisk SD Karten sagen übrigens 0x03 und nicht 0x05.
Was ist nun richtig? Beides? Oder hat SanDisk was mit Panasonic zu
tun?
Eine 128er Traveler meldet sich übrigens mit 0x01.

Gruß,
Daniel

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.