Chans FATFS SD-Karen Lib

Gast #3213994
Lesenswert?

Hallo Zusammen.
Bin ratlos, versuche seit Tagen ein Fehler in der Anbindung einer SD- 
Karte mit Chans Lib zu finden. Die Karte ist über SDIO angebunden und 
laut Oszi auch ok. die Initialisierung läuft bei einer Karte 2G fast 
durch jedoch bei errorstatus = 
SD_EnableWideBusOperation(SDIO_BusWide_4b);
erhalte ich einen Fehler SD_LOCK_UNLOCK_FAILED.
Habe schon alles kontrolliert den Takt Quarz 8 Mhz PLL_M 8  PLL_N 336 
PLL_Q 7  damit ergibt sich ein Takt von 48 Mhz.
Pullup 47K Versorgung 100N

Hat evtl jemand einen Tip.

//==============================================================
// Init der SD-Karte
// -> die restliche Initialisierung (GPIO,NVIC)
//    muss schon gemacht sein
//==============================================================
SD_Error SD_Init(void)
{
__IO SD_Error errorstatus = SD_OK;


SDIO_DeInit();

/*!< CMD Response TimeOut (wait for CMDSENT flag) */
errorstatus = SD_PowerON();
if (errorstatus != SD_OK) {return(errorstatus);}

/*!< CMD Response TimeOut (wait for CMDSENT flag) */
errorstatus = SD_InitializeCards();
if (errorstatus != SD_OK) {return(errorstatus);}

// Einstellen der SDIO Peripherie
// SDIO_CK = SDIOCLK / (SDIO_INIT_CLK_DIV + 2)   SDIO_CK=48 Mhz / 118 +2 
= 400 Khz
// STM32F4xx SDIOCLK ist Eingestellt auf to 48MHz Externer Quarz HSE=8 
Mhz PLL_M=8 PLL_N=336 PLL_Q=7
// SDIO_CK sollte 400 KHz nicht überschreiten
SDIO_InitStructure.SDIO_ClockDiv       = SDIO_TRANSFER_CLK_DIV;
SDIO_InitStructure.SDIO_ClockEdge       = SDIO_ClockEdge_Rising;
SDIO_InitStructure.SDIO_ClockBypass     = SDIO_ClockBypass_Disable;
SDIO_InitStructure.SDIO_ClockPowerSave     = 
SDIO_ClockPowerSave_Disable;
SDIO_InitStructure.SDIO_BusWide       = SDIO_BusWide_1b;
SDIO_InitStructure.SDIO_HardwareFlowControl = 
SDIO_HardwareFlowControl_Disable;
SDIO_Init(&SDIO_InitStructure);

// Lese CSD/CID MSD Register
errorstatus = SD_GetCardInfo(&SDCardInfo);
if (errorstatus == SD_OK)  {errorstatus = SD_SelectDeselect((uint32_t) 
(SDCardInfo.RCA << 16));}

  if (errorstatus == SD_OK)
  {
    errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_4b);
  }

return(errorstatus);
}
Gast #3214015
Lesenswert?

SDIO ? also STM32...

Versuch es mal damit und laß die ST-Lib außen vor. Nebenbei gesagt, 
läuft diese Quelle auch auf den NXP Teilen (LPC2478 usw) wenn man 
überall "SDIO" gegen "MCI" austauscht.

In den Quellen wirst du sehen, daß sie noch einiges an Debug-Ausgaben 
über UART drinhaben. Wenn es bei dir erst mal läuft, kannst du das ja 
rauswerfen.

W.S.
Angehängte Dateien:
#3214433
Lesenswert?

Ich hab das FATFs von ELM CHAN auch gerade am Laufen, das lief auf dem 
AVR praktisch sofort. Dort besteht die Initialisierung der SPI auch 
gerade mal aus zwei einfachsten Zeilen Code.

1
  // SPI init
2
  SPCR = (1<<SPE) | (1<<MSTR);
3
  SPSR = (1<<SPI2X);

Bei den 32 Bit Boliden braucht man da je drei Dutzend Funktionsaufrufe, 
welche jede allein 80 Zeichen Zeilenlänge nur allzuoft sprengt.

K.I.S.S.!
Gast #3215056
Lesenswert?

Ich dachte auch an die SPI, die SDIO läuft aber sicherlich schneller und 
ich will ein 7" Display mit JPG Grafiken laden.

Ich wudere mich eben weil es auch bei der SDIO scheinbar sofort läuft.
Ich habe zwar auch den CRC Fehler gehabt Revisionsbedingt.

Die Pegel der Karte stimmen laut Oszi Initialisierung läuft auch fast 
durch bis dann beim schalten in den 4 Bit Modus eine falsche Antwort der 
Karte kommt. Bei einer 128 MB karte will er auch nicht. Auch Googlen 
hilft nicht.

Jetz Probir ich mal den Code von W.S. sonnst muss ich den ganzen Elm 
Chan Treiber überarbeiten.

Gruß Frank
#3215064
Lesenswert?

@ Frank (Gast)

>Ich dachte auch an die SPI, die SDIO läuft aber sicherlich schneller und
>ich will ein 7" Display mit JPG Grafiken laden.

Klar.

>durch bis dann beim schalten in den 4 Bit Modus eine falsche Antwort der
>Karte kommt. Bei einer 128 MB karte will er auch nicht. Auch Googlen
>hilft nicht.

Hmm, das Problem hab ich beim AVR nicht.

>Jetz Probir ich mal den Code von W.S. sonnst muss ich den ganzen Elm
>Chan Treiber überarbeiten.

naja, den Kernroutinen kann man woh scho trauen, aber die IO-Anbindung 
ist ja anwendungsabhängig, dort würde ich suchen.
#3215094
Lesenswert?

Frank schrieb:

>   if (errorstatus == SD_OK)
>   {
>     errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_4b);
>   }

Bei mir hings an der gleichen Stelle. Nach ewiger Fehlersuche habe ich 
gemerkt das D2 <-> D3 vertauscht waren.

Probier doch einfach mal

errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_1b);

das sollte auf jeden Fall erstmal funktionieren.
Gast #3215276
Lesenswert?

Frank schrieb:
> sonnst muss ich den ganzen Elm
> Chan Treiber überarbeiten.

Ach wo.

Allerdings solltest du dir nen Systemtick einrichten, der u.a. auch nach 
den Kontakten in der SD-Fassung schaut und das Stecken und Entnehmen 
mitkriegt, sonst mußt du beim Stecken der Karte jedesmal manuell 
mounten.

Nochwas: bei einer Sorte Fassungen hab ich das erlebt, daß der 
Insert-Kontakt gegen den R/O-Kontakt schließt und dieser wiederum gegen 
Masse. Das war ne putzige Detektiererei, ob nun ne Karte steckt oder 
nicht.


W.S.

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