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