Forum: Mikrocontroller und Digitale Elektronik Chans FATFS SD-Karen Lib


von Frank (Gast)


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);
}

von W.S. (Gast)


Angehängte Dateien:

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.

von Frank (Gast)


Lesenswert?

Super Danke probir ich gleich mal aus.
Danke dir

Gruß Frank

von Gerhard G. (g_g)


Lesenswert?

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.

von Falk B. (falk)


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.!

von Frank (Gast)


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

von Falk B. (falk)


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.

von Torsten S. (tse)


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.

von Frank (Gast)


Lesenswert?

Danke für den Tip
Habe ich probiert und zum test mal getauscht, kein Erfolg.

von W.S. (Gast)


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.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

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