Forum: Mikrocontroller und Digitale Elektronik MSP430: Kommunikation mit MMC funktioniert nicht richtig :-(


von Rolf Freitag (Gast)


Angehängte Dateien:

Lesenswert?

Also ich habe nun alle Funktionen und Defines nach der 
MultiMediaCard-Spezifikation von SanDisk erstellt, die MMC-FAQ 
durchgelesen und auch mit einem Oszi überprüft, dass die Signale zur MMC 
genau den Timing-Diagrammen von SanDisk entsprechen, aber es 
funktioniert immer noch nicht richtig :-(
Der Stand (Anhang, da steht auch die Verdrahtung in mmc.h) ist 
folgender: Das Lesen der Register funktioniert meistens, das Lesen der 
Daten meist nur beim ersten Mal,
das Schreiben (Daten/Register) sehr selten, Initialisieren und setzen 
der Blocklaenge fast immer.

Ich habe so ziemlich alles ausprobiert, also z. B. CS ständig auf low, 
Frequenz geändert, Betrieb mit/ohne Quarz usw. aber das bringt 
bestenfalls keine Verschlechterung, obwohl der MSP430F149 mit der MMC 
mittels SPI kommuniziert und es deshalb zuverlässig sein sollte.
Mit dem Oszi sehe ich aber, dass die Karte meist keine Daten liefert.

Woran kann es liegen dass es nicht funktioniert?

von Klaus Sperlich (Gast)


Lesenswert?

Hallo Rolf,
schwer zu sagen, woran es liegt. Bei vielen Entwicklungen hat sich oft 
das unscheinbarste als Problemfall herausgestellt: die 
Spannungsversorgung.
Ein Elko (1o µF + 100nF über die Spannungsversorgung) wirkt oft Wunder.
probiers einfach mal...

von Lanius (Gast)


Lesenswert?

hab zur Zeit auch Probleme mit einem F149, läuft nur wenn er will...
Resetbeschaltung, Quartz alles probiert, ich finde den Fehler nicht, 
entweder er läuft und alles funktioniert, oder er läuft nicht und 
nichtmal Reset hilft....
Nach ein paar Versuchen geht es dann einfach wieder grübel

von Rolf Freitag (Gast)


Lesenswert?

Also die Spannungsversorgung kann es nicht sein, denn direkt neben dem 
MC sind 100 nF keram. + 1000 uF Elko und mit dem Oszilloskop habe ich 
auch die Versorgungsspannung der MMC überprüft.

von Klaus Sperlich (Gast)


Lesenswert?

sorry, wollte nicht schlauer sein als der Entwickler selber.
Habe aber oft schon solche Fälle erlebt.
Weiterhin viel Erfolg!

von Jochen Albrecht (Gast)


Lesenswert?

Hallo Rolf,

ich habe ein ähnliches Problem mit der MMC Karte:

Das beschreiben funktioniert bei mir einwandfrei, das Lesen der Register 
auch, aber das Lesen der Daten funktioniert überhaupt nicht.

Bei der Überprüfung mit dem Oszi sehe ich eindeutig meine gesendeten 
Befehle, z.B. SPDR = 0x4A für das Auslesen des CID
Registers, aber wenn ich einen Lese Befehl eingebe, z.B. SPDR = 0x52 für 
Multiple Block Read, dann kommen keine Daten, sondern allenfalls eine 
0x04. Dies steht laut Datenblatt für einen Illegal Command.

Irgendwie erkennt er den Lese-Befehl nicht.

Hast Du das Problem schon gelöst ??

Gruß Jochen

von Rolf Freitag (Gast)


Lesenswert?

Also ich habe bei TI nachgefragt und nun kümmert sich dort jemand darum. 
Es wird dann eine Release Note o. Ä. geben.

Übrigens zeigen die Karten nach einigem Debugen I/O-Errors, obwohl nach 
der Spezifikation ungültige Befehle schlimmstenfalls eine einmalige 
Fehlermeldung produzieren dürften. Wie ich feststellen musste, ist das 
nicht das einzige, was nicht der Beschreibung von Sandisk entspricht 
(auch bei Karten von Sandisk).

von Jochen Albrecht (Gast)


Angehängte Dateien:

Lesenswert?

Mit der Beschreibung hast Du recht. Es sind sehr viele Fehler darin 
enthalten. Hast Du eine Ahnung ob es irgendwo Applicationen mit C-Code 
gibt ? Es muß doch schon irgendjemand gelungen sein, Daten aus MMC 
Karten zu lesen ! ;-))

Ich hab Dir mal den Code zum Beschreiben der Karte angehängt.
Dies sind aber nur die 2 Funktionen zum initialisieren und dann der 
CMD25.

Vielleicht hilft es Dir weiter.

Gruß Jochen

von Rolf Freitag (Gast)


Lesenswert?

Aha, danke.
Also ich habe C-Code u. Hardware-Pläne gefunden im "Final Report CS-401 
Solid State MP3 Player"; das müsste man mit Google oder Metager schnell 
finden. Mit pdf2text kann man den Code extrahieren.
Es ist zwar nicht jede einzelne verwendete Funktion dokumentiert, aber 
der Name sagt wohl aus, wofür die jeweils sind.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Das Lesen funktioniert bei mir einwandfrei (32MB-Karte von Infineon).

void mmc_read_block(addr32_t block)
{
  SPI_WRITE(0x40 + MMC_READ_SINGLE_BLOCK);
  SPI_WRITE(block.c[3]);
  SPI_WRITE(block.c[2]);
  SPI_WRITE(block.c[1]);
  SPI_WRITE(block.c[0]);
  SPI_WRITE(0x00);

  mmc_wait_response(0x00);
  mmc_wait_response(0xFE);

  // hier kommen die Daten

}

von Rolf Freitag (Gast)


Lesenswert?

Tja, bei mir funktioniert es (der gleich Code) fast, d. h. response 0x00 
und 0xfe kommen wie auch die Daten, aber mir ist aufgefallen, dass die 
letzten Bytes, also Nr. 7 bzw. 15 bzw. 512 gelegentlich nicht stimmen, 
weil die sich ändern (trotz korrektem response der Karte)! Manchmal ist 
das in nur 1% der Fälle so, obwohl das Initialisieren problemlos 
funktioniert.
Mit Fehlerkorrektur könnte man das beseitigen, aber ohne auch nur ein 
Bit schreiben zu können nützt mir das nichts.
Also ich bin da erstmal fertig und hoffe, dass bei TI herausgefunden 
wird woran es liegt.

Vielleicht ist es ein Bug im UART1 oder im IAR-Compiler; keine Ahnung.

von Rolf Freitag (Gast)


Lesenswert?

Korrektur: Ich meine mit dem letzten der letzten Bytes natürlich Byte 
511 statt 512.

@Jochen:
Für welchen Prozessor und welchen Compiler ist der Code?
SPCR usw. kenne ich nämlich nicht.

von Jochen Albrecht (Gast)


Lesenswert?

Ist für einen Atmega128 und IAR Compiler.

Gruß  Jochen

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.