Forum: Mikrocontroller und Digitale Elektronik FatFs SD Keine Antwort


von Matthias (Gast)


Angehängte Dateien:

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

von Jim M. (turboj)


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.

von Matthias (Gast)


Lesenswert?

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

Es hängen andere Teilnehmer am Bus, diese werden aber in dem Momentanen 
Programm NICHT angesprochen.

von Jim M. (turboj)


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.

von Matthias (Gast)


Angehängte Dateien:

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

von holger (Gast)


Lesenswert?

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

Hat dein PIC einen FIFO für SPI? Dann solltest du den mal abschalten.

von Matthias (Gast)


Lesenswert?

Danke. FIFO ist aber ausgeschaltet.:/

von Matthias (Gast)


Lesenswert?

Weiß jemand was?

von Patrick B. (p51d)


Angehängte Dateien:

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

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Hier wäre noch etwas Code von mir, die SPI Ansteuerung ist dort etwas 
herausgetrennter.
Beitrag "Re: STM32 Chan FAT mit SD karte über SPI"
Der Init der SD Karte entspricht der Beschreibung auf elmchans Webseite.

Irgendwann (tm) wirds auch mal eine IRQ/DMA Lösung geben, aber für 
Konfigs reicht das da auch.
(SDIO ist in Arbeit)

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
Noch kein Account? Hier anmelden.