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);
}
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.
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.!
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
@ 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.
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.
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.