FatFs SD Keine Antwort

Gast #5825337
Lesenswert?

Hallo zusammen

Ich hänge nun seit mehreren langen Tagen dabei eine Speicherkarte an 
einem PIC zu betreiben. Dazu verwende ich die FATFs Lib von ElmChan. 
Benutzt wird ein dsPIC33E. Von der ElmChan Seite habe ich "FatFs sample 
projects for various platforms" das Beispielprogramm PIC24 benutzt und 
dort in der diskio.h die SPI Funktionen ergänzt.
An den SPI Leitungen hängen jeweils ein 10k Pullup.

Problem ist: Speicherkarte reagiert nicht, es passiert nichts.

Micro Speicherkarte funktioniert, da ich diese bereits mit anderen 
"fertigen" SD Modulen betrieben habe. (habe auch eine andere 2te 
Speicherkarte, gleiches Szenario)

Habe mir per Oszi und Debug Codes mal das Programm angeschaut:
-so wie ich das sehe, kommt das Programm NICHT in den IDLE STATE Modus 
in der Funktion DSTATUS disk_initialize() in der Datei diskio.c.
1
 if(send_cmd(CMD0, 0) ==1) {//enter Idle State}
schlägt immer fehl.

Schaue ich mir die send_cmd() funktion an:
Am Oszi erkenne ich die gesendeten Daten auf der MOSI Leitung welche 
durch die send_cmd() funktion gesendet werden.(siehe bild2). Es kommt 
jedoch keine Antwort seitens der Speicherkarte..

Bild1 zeigt die komplette Datenübertragung, Bild2 reingezoomt die Daten.

Benutzt wird folgender Beispiel Code:
1
 
2
if (f_mount(&FatFs, "", 0) == FR_OK) {  /* Mount SD */  
3
            //"0:" bringt auch nichts            
4
             writeLCD("MOUNTED ");//kommt hier rein.  
5

6
            if (f_open(&Fil, "he2.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK) {  /* Open or create a file */
7
                writeLCD("OPENED ");//wird NICHT ausgeführt.
8
                //if ((Fil.fsize != 0) && (f_lseek(&Fil, Fil.fsize) != FR_OK)) goto endSD;  /* Jump to the end of the file */
9

10
                f_write(&Fil, "Hello world!\r\n", 14, &bw);  /* Write data to the file */
11

12
                //endSD: f_close(&Fil);                /* Close the file */
13
                f_close(&Fil);
14
            }
15
        }

Gebe ich mir jeweils in f_mount und f_open den return FRESULT res an, so 
kommt immer die Meldung 3, welche also für "FR_NOT_READY" steht.
Aber warum?

Meine SPI Funktion sieht folgendermaßen aus:
1
 
2
uint8_t ExchangeSPI(uint8_t wert){
3
    SPI1BUF=wert;
4
    while(!SPI1STATbits.SPIRBF)// warten bis Werte aus dem Schieberegister rausgeschoben sind
5
        ;
6
    return SPI1BUF;
7
}

Was mache ich falsch bzw was kann ich noch testen/anders machen ?

Bitte um Hilfe..

Vielen Dank
-Matthias
Angehängte Dateien:
#5825398
Lesenswert?

Da ist was oberfaul...

Meine -funktionierende- SPI-SD Implementation macht vor dem 0x40 
Kommando Byte keine 0xFF bei CS=LOW.

Das macht sie zwar bei alle anderen Kommandos, aber nicht bei 
0x40(CMD0).

IMO schaltet die Karte mit den zwei 0xFF nicht korrekt auf den SPI Modus 
um.

Im oberen Bild sieht man Daten auf MOSI bei CS=HIGH. Seeeehr gefährlich, 
denn im SD Mode (in dem die Karte per default ist) wäre das ein SD 
Kommando.

Hängt da noch was anderes am SPI mit dran? Dann muss die SD Karte 
zwingend zuerst initialisiert werden.
#5825456
Lesenswert?

Matthias schrieb:
> Die 0xFF sind doch die dummy Bytes um in den SPI Modus zu schalten, oder
> nicht?

Nein. Die müssen da weg.

Entsprechende Ausschnitt vom Code hier (
1
static
2
BYTE send_cmd (
3
  BYTE cmd,    /* Command byte */
4
  DWORD arg    /* Argument */
5
)
6
{
7

8
// [...]
9

10
/* Select the card and wait for ready */
11
  DESELECT();
12
  rcvr_spi (); // wait 8 clocks LOW
13
  SELECT();
14
  if (cmd!= CMD0) {
15

16
    xmit_spi(0xFF);xmit_spi(0xFF);
17
    if (wait_ready() != 0xFF) return 0xFF;
18
  }
19

20
  /* Send command packet */
21
  xmit_spi(cmd);

Man sieht deutlich das für CMD0 die 0xFF weggelassen werden.
Gast #5825535
Lesenswert?

Die beiden 0xFF kommen gar nicht aus dem if (cmd!=CMD0)..
Einer der beiden 0xFF kommt aus dem BYTE select(),( bzw bei dir im Code 
zwischen deselect() und select(), mein code ist etwas anders, aber habs 
auch mit deinem ausschnitt getestet) indem ein DummyClock gesendet wird. 
Das andere 0xFF kommt aus dem wait_ready, in der die For schleife genau 
nur einmal durch läuft und dann abbricht. Die beiden 0xFF konnte ich 
jetzt rauskicken, trotzdem meldet sich die Karte nicht.

Aber was wäre denn ne mögliche Ursache, ich kann ja nicht anfangen die 
ganze LIB abzuändern?

lG
Angehängte Dateien:
#5826492
Lesenswert?

Hallo

Ich hatte mich letzten Sommer auch an FatFs die Zähne ausgebissen. Mein 
Problem damals war, dass das mitgelieferte Beispiel irgendwie nicht 
funktionierte und das SPI 16Bit Register hatte.
DMA, Multi-Byte Funktionen etc. habe ich entfernt und entgegen dem 
Beispiel auf den Byte-Funktionszugriff reduziert.

Nach langem suchen und vielen Fehlschlägen bin ich bei der angehängten 
Version gelandet.
Ist sicher nicht die schnellste Lösung, aber es funktioniert und für 
mich zum Konfiguration laden und ab und zu ein Log-Eintrag zu machen 
reicht es völlig aus.

Und die Symptome waren auch immer an einem anderen Ort. Aber 
schlussendlich war es doch die SPI Implementierung.

Musst du halt auf deinen Controller portieren.
Gruss
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren