PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : STM32F1xx SDIO für SD-Karte bereitet Kopfschmerzen



erik_wolfram
11.01.2017, 09:33
Hallo,

ich merke grade, dass ich in diesem Unterforum ganzschön aktiv bin, Fragen zu stellen... (ich hoffe die Lösungen können auch anderen helfen!)
Hier mein nächstes Problem:

Ich versuche am Pollin Eval-Board das SDIO-Interface für das Arbeiten mit einer SD-Karte aufzusetzen. (FATFS bekomme ich bereits zum Laufen)
Da ich einen Datenlogger erstellen möchte brauche ich die Geschwindigkeit des SDIO-Interfaces. Hierzu habe ich mir eine die entsprechende Bibliothek von STMicroelectronics Version V2.0.3 heruntergeladen.

Mit reduzierter Geschwindigkeit (SDIO_TRANSFER_CLK_DIV = 0xB2) läuft das ganze via SD_POLLING_MODE.
Wenn ich die Geschwindigkeit erhöhe scheitert das Lesen mit einem entsprechenden Fehler.
Natürlich dachte ich bezüglich der Geschwindigkeit sofort an SD_DMA_MODE. Wenn ich dann aber einen Schreibvorgang initialisiere ( SD_WriteBlock ) friert mir diese Funktion ein.
Woran kann das liegen? Der Lesevorgang geht ohne Probleme von statten.

Gruß Erik

Unregistriert
11.01.2017, 15:21
Hi Erik,

falsche Statusabfrage?
Die LIB von STM kenne ich nicht, ich arbeite mit mikroPascal, auf einem STM32F407.
Welchen F1xx hast Du?

VG
Peter

erik_wolfram
11.01.2017, 16:53
Hallo,

ich habe einen STM32F103VET6. Ich habe jetzt festgestellt, dass ich die Interrupts nicht initialisert habe. Dafür muss ich die Biblieothek erstmal für den 32f1xx anpassen - sie ist für einen 32f4xx geschrieben...
Ich werde berichten was ich erreicht habe!

erik_wolfram
12.01.2017, 07:57
So anscheinend war es das - ich habe es jetzt halbwegs am laufen und kämpfe mit FATFS.

Ich habe die Funktion "NVIC_Configuration()" nachgetragen. Diese wird jetzt unmittelbar in "SD_Init()" aufgerufen.


static void NVIC_Configuration( void )
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );

NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
}


Weiterhin wurde das Interupt "verlinkt" (stm32f10x_it.c):


void SDIO_IRQHandler(void)
{
/* Process All SDIO Interrupt Sources */
SD_ProcessIRQSrc();
}


Das ganze läuft jetzt ohne separates Interupt für den DMA - obwohl ich hier einige Beispiele gefunden habe die dies verwendeten....
Vlt. benötigt der F4 dies?! Demnächst werde ich das ganze auch auf einem F4 umsetzen ...

Die Clock-Divider (CLKDIV) für den SDIO konnte ich jetzt auf 1 reduizieren:
SDIO_TRANSFER_CLK_DIV = 1

Obwohl für die Frequenz gilt:
SDIO_CK frequency = SDIOCLK / [CLKDIV + 2].
läuft das ganze nicht mit CLKDIV = 0

Unregistriert
12.01.2017, 10:29
Hi Erik,

bis die SD-Card bekannt ist, darf der Clock max. 400KHz betragen, am ende von INIT habe ich auf 24Mhz / 4BitBus umgeschaltet.

VG
Peter

erik_wolfram
13.01.2017, 16:59
Ahh ok, ich sehe grade, dass der AHB Bus mit 72 MHz taktet.
Damit erhalte ich gemäß der Gleichung 24 MHz für CLKDIV = 1; die CLKDIV = 0 gelten dann nur für die 48 MHz CPU-Frequenz....