Danke!
Über das Projekt bin ich inzwischen auch gestolpert!
http://elm-chan.org/fsw/ff/00index_e.html
Ist eine ANSI C umsetzung der FAT16...FAT32 Dateisystemzugriffe, macht
einen guten Eindruck... nur richtig verstanden was in die besagten 3
Funktionen hinein muss hab ich bisher noch nicht (zu viel gleichzeitig
im Kopf).
Die meisten Projekte erfordern, dass man selbst die Zugriffe auf das
jeweilige Speichermedium programmiert, dazu sehr hilfreich ist diese
seite, die die Initialisierung der SD-Card ganz gut beschreibt:
http://elm-chan.org/docs/mmc/mmc_e.html
Nur klappen will das bei mir einfach nicht! Der Mikrocontroller sendet
CS, CLK und MOSI Signale, jedoch kommt von der Speicherkarte nichts
zurück. Das macht noch nicht einmal einen Unterschied ob die SD-Card
eingeschoben ist oder nicht, die datenleitung bleibt immer auf LOW was
dann zu 0x00 bytes führt...
Nun heißt es Fehlersuche :( Spinnt die Karte? Ist die MISO Leitung
irgendwo unterbrochen oder kommen andere Signale nicht an der Karte an?
Sind Pins an der Karte vertauscht? Oder gitbs doch einen Softwarefehler?
Das wäre nun halt auch wieder ein enormer vorteil, wenn sich eine
fertige Funktion finden würde, die getestet ist so dass ich weiß wo ich
den fehler zu suchen habe... sitzte hier nun auch schon wieder einen Tag
davor und dreh mich im Kreis grr...
Nunja, vllt. fällt euch in den Codesequenzen etw. auf:
*SPI0 des LPC2138 initialisieren*
1 | S0SPCCR = 0xF0; // muss gerade zahl und >= 8 sein
|
2 |
|
3 | S0SPCR = 0x0020; // 0:1 = nicht benutzen
|
4 | // 2 = '0' für 8Bit Modus
|
5 | // [0h] 3 = CPHA '0' fuer SD Cards
|
6 | // 4 = CPOL '0' fuer SD Cards
|
7 | // 5 = '1' damit Master
|
8 | // 6 = '0' erst MSB übertragen
|
9 | // [2h] 7 = '0' Keine Interrupts
|
10 | // 8:11 = '0'
|
11 | // 12:15 = reserved
|
µC läuft mit 48MHz, damit sollte der SPI Tackt bei 200kHz liegen.
schreiben eines Bytes auf SPI0
1 | char SSEL_SD(char ch)
|
2 | {
|
3 | S0SPDR = ch; // Byte ch schreiben
|
4 | for (int i=0; i<500000 && ((S0SPSR&0x8)!=0); i++); // warten bis daten gesendet sind oder zähler abgelaufen...
|
5 |
|
6 | return S0SPDR&0xFF; // empfangene Daten zurück geben
|
7 | }
|
das liegt in einem eingenen Unterprogramm, was jetzt wie folgt
aufgerufen wird:
1 | SSEL_SD(1); // SDC CS auf high
|
2 | for (int j=0; j<10; j++) sd_Send(0xFF); // SD auf datenempfang vorbereiten
|
3 |
|
4 |
|
5 | SSEL_SD(0); // SDC CS auf Low für Datenempfang
|
6 |
|
7 | // GO_IDLE_STATE senden
|
8 | sd_Send(GO_IDLE_STATE);
|
9 | sd_Send(0x00);
|
10 | sd_Send(0x00);
|
11 | sd_Send(0x00);
|
12 | sd_Send(0x00);
|
13 | tmp=sd_Send(0x95);
|
14 |
|
15 | tmp=sd_Send(0xFF); // Fuer Debugger, schauen was zurück kommt
|
16 | tmp=sd_Send(0xFF);
|
17 | tmp=sd_Send(0xFF);
|
18 | tmp=sd_Send(0xFF); // erhalte aber nur 0x00 und nicht wie angegeben 0x01 oder 0xFF
|
19 | tmp=sd_Send(0xFF); // & Oszi zeigt keine aktivitäten auf MISO Leitung
|
20 | tmp=sd_Send(0xFF);
|
21 | tmp=sd_Send(0xFF);
|
22 |
|
23 | SSEL_SD(1); // SDC CS auf high
|
Nunja - wär ganz lieb wenn jemand einen Blick auf die Zeilen werfen
könnte, ob hier schon fehler auffallen, oder ob das so laufen sollte...
Achso, Portpins (PINSEL0) sollten richtig initialisiert sein; sonst
würde auch nichts beim Senden auf MOSI & CLK erscheinen!?
LG
Max