Forum: Mikrocontroller und Digitale Elektronik MMC zum wahnsinnig werden


von Loki Daelis (Gast)


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.

von Loki Daelis (Gast)


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!

von nobody0 (Gast)


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.

von Olaf (Gast)


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

von Loki Daelis (Gast)


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.

von Olaf (Gast)


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

von Loki Daelis (Gast)


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

von Hagen (Gast)


Lesenswert?

@Olaf:  0x05: printf("SanDisk");

Gruß hagen

von Daniel N. (bipak)


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

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.