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?
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...
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
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.
sorry, wollte nicht schlauer sein als der Entwickler selber. Habe aber oft schon solche Fälle erlebt. Weiterhin viel Erfolg!
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
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).
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
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.
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 }
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.