Hallo,
ich quäle mich gerade damit ab, mittels eines LPC2378 eine SD-Karte
anzusprechen. Initialisierung der Karte klappt gut, aber das Lesen eines
512-Byte Blocks von der Karte will nicht recht klappen. Da der Arm zu
langsam ist, die Kartendaten direkt auszulesen, versuche ich es über die
GPDMA. Mein Code ist an das IAR-Example angelehnt. Tatsächlich werden
einige Daten gelesen (ca. 100-300 bytes), dann stockt der Datenfluss und
das MCI-Interface quittiert mit einem FIFO overrun. Woran kann das
liegen?
Wird der AHB durch irgendeinen anderen, höher priorisierten Transfer
blockiert, so dass die DMA nicht zum Zuge kommt? Es gibt ja allerhand
Register, den AHB über die AHB Arbiter Configuration Register zu
konfigurieren, leider verstehe ich die Bedeutung der einzelnen Bits
nicht, das User Manual schweigt sich darüber aus. Ohnehin ist die
Anwenderunterstützung seitens NXP eine Katastrophe, keine Codebeispiele,
keine brauchbaren Application Notes, wie das bei anderen
Prozessorherstellen längst Standard ist. Auf dem Netz ist auch kaum
etwas darüber vorhanden.
Kann mir irgendjemand helfen, wie ich meine SD-Karte zum Laufen kriege?
Herzlichen Dank
Mike
Hier das Codefragment:
1 | /* Ch0 set for P2M transfer from MCI FIFO to memory. */
|
2 | DMACC0SRCADDR = DMA_MCIFIFO;
|
3 | DMACC0DESTADDR = DMA_DST; // datenpuffer im USB RAM
|
4 | /* The burst size is set to 4, the size is 32 bit. */
|
5 | /* Terminal Count Int enable */
|
6 | DMACC0CONTROL = 512 | (0x02 << 12) | (0x02 << 15)
|
7 | | (0x02 << 18) | (0x02 << 21) | (1 << 27); //kein Interrupt!
|
8 | ...
|
9 | MciReadBlock(); // Befehl zum Blocklesen senden
|
10 | ...
|
11 | DMACC0CONFIGURATION = 0x10001 | (0x04 << 1) | (0x00 << 6) | (0x06 << 11);
|
12 | /* Write, block transfer, DMA, and data length */
|
13 | MCI_DATA_CTRL = ((1 << 0) | (1 << 1) | (1 << 3) | (512 << 4));
|
Warum wird bit 4 in DMACC0CONFIGURATION gesetzt. Laut Datenblatt ist
dieses Bit "reserved/do not use" ???