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.
Hallo, sieh dir mal das an: STM32F4Discovery mit CooCox,GPIO,SDIO,Timer,SoftTimer,USART,printf Beitrag "STM32F4Discovery mit CooCox :: GPIO,SDIO,Timer,SoftTimer,USART,printf" Gruß G.G.
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.
Danke für den Tip Habe ich probiert und zum test mal getauscht, kein Erfolg.
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.
So. Nachtrag für LPC24xx (mit Sektor Schreiben) (nun ist es aber wirklich schon zu spät, gut Nacht..) W.S.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.