Forum: Mikrocontroller und Digitale Elektronik STM32 - QuadSPI über CMSIS läuft nicht


von Georg (Gast)


Lesenswert?

Hallo zusammen,

ich versuche, einen NOR-Flash auf dem STM32L476-Discovery zum Laufen zu 
bekommen. Dieser hängt an den Pins PE10-15.

Das Problem: Aus den Pins kommt nichts heraus. Selbst bei einem 
einfachen "Write Enable"-Befehl (keine Daten, keine Adresse, nur der 
Befehl selbst), keine Aktivität an den Pins.

Folgendes habe ich initialisiert:
1
RCC->AHB3ENR |= RCC_AHB3ENR_QSPIEN; //Clock on
2
__HAL_RCC_GPIOE_CLK_ENABLE(); //GPIO Clock on
3
4
GPIOE->MODER &= 0x000FFFFF; //Mode of pins 10...15 set to 00
5
GPIOE->MODER |= GPIO_MODER_MODE10_1|GPIO_MODER_MODE11_1|GPIO_MODER_MODE12_1|GPIO_MODER_MODE13_1|GPIO_MODER_MODE14_1|GPIO_MODER_MODE15_1; //Alternate function
6
7
GPIOE->AFR[1] |= GPIO_AFRH_AFSEL10_1|GPIO_AFRH_AFSEL10_3|GPIO_AFRH_AFSEL11_1|GPIO_AFRH_AFSEL11_3|GPIO_AFRH_AFSEL12_1|GPIO_AFRH_AFSEL12_3|GPIO_AFRH_AFSEL13_1|GPIO_AFRH_AFSEL13_3|GPIO_AFRH_AFSEL14_1|GPIO_AFRH_AFSEL14_3|GPIO_AFRH_AFSEL15_1|GPIO_AFRH_AFSEL15_3; //Set AFSEL bits to "1010" (=AF10) for each pin (=QuadSPI)
8
9
QUADSPI->CR |= QUADSPI_CR_EN | (2U<<QUADSPI_CR_PRESCALER_Pos); //Enable Interface, Prescaler bits set to 0x02
10
11
QUADSPI->DCR |= (23U << QUADSPI_DCR_FSIZE_Pos); //Flash Size = 16 MB
12
QUADSPI->DCR |= (3U << QUADSPI_DCR_CSHT_Pos); // 4 Cycles of Chip select high time

Mit dem Debugger sehe ich, dass die Alternate Function Bits und 
MODER-Einstellungen stimmen sollten. Ich denke, dass ich irgendeinen 
Takt, einen Pin-Remap (der Controller hat noch andere Pins für QuadSPI, 
aber ich sehe kein AFIO-Register zum Remappen) oder Ähnliches vergessen 
habe.

Der einfache Aufruf einer Write Enable-Funktion sieht dann so aus:
1
/* Write enable command: No address, no Data (see Datasheet of the flash chip) */
2
QUADSPI->CCR = QUADSPI_CCR_IMODE_0 | (EXTFLASH_COMMAND_WRITE_ENABLE & 0x000000FF);
3
4
/* Bits: DMODE=00=no data, DCYC=0=no dummy cycles, ADMODE=00=no address, IMODE=01=instruction sent via single data line */
5
if(QUADSPI->SR&QUADSPI_SR_BUSY) GPIOB->ODR|=GPIO_PIN_2;
6
while(QUADSPI->SR & QUADSPI_SR_BUSY);


Frage ich das Busy-Flag wie oben sichtbar probeweise ab, sehe ich, dass 
es auch tatsächlich kurz gesetzt wird (PORTB2 geht auf high) und dann 
verschwindet (Programm läuft weiter und bleibt nicht ewig in der 
while-Schleife). Die Schnittstelle tut also irgendwas. Es kommt aber, 
wie gesagt, nichts aus den Pins raus.

Sieht jemand den Fehler?

von Jim M. (turboj)


Lesenswert?

> GPIOE->MODER &= 0x000FFFFF; //Mode of pins 10...15 set to 00

Ganz sicher das da nicht wenigstens ein oder zwei F zuviel drin ist?

von Georg (Gast)


Lesenswert?

Jim M. schrieb:
>> GPIOE->MODER &= 0x000FFFFF; //Mode of pins 10...15 set to 00
>
> Ganz sicher das da nicht wenigstens ein oder zwei F zuviel drin ist?

Sollte eigentlich passen. Der Register-Startwert ist 0xFFFFFFFF. Es ist 
ein 32-Bit-Register, wobei jeweils 2 Bits den Pin beschreiben. Mit 
0x000FFFFF werden die oberen 12 Bits (für 6 Pins) auf "00" gesetzt, um 
sie danach auf "10" = Alternate Function zu setzen.

von Daniel V. (voda) Benutzerseite


Lesenswert?

Georg schrieb:
> Sollte eigentlich passen. Der Register-Startwert ist 0xFFFFFFFF. Es ist
> ein 32-Bit-Register, wobei jeweils 2 Bits den Pin beschreiben. Mit
> 0x000FFFFF werden die oberen 12 Bits (für 6 Pins) auf "00" gesetzt, um
> sie danach auf "10" = Alternate Function zu setzen.

Nein, dieser ist 0x00
1
GPIOE -> MODER |= 0x00000AAA;

Ergibt: 0b 0000 0000 0000 0000 1010 1010

RM, Seite 294

Gruß

: Bearbeitet durch User
von A. B. (Gast)


Lesenswert?

Wenn in 0x40020400 tatsächlich 0xAAA00000 und in 0x40020424 0xAAAAAA00 
steht, sollte das passen.

Bei einem so kleinen Wert für den Prescaler sollte man aber auch OPEEDR
(0x40020408) auf 0xFFF00000 (very high speed) setzen.

Sicherheitshalber würde ich auch vorschlagen, die Einstellung im CR 
zuerst zu machen und erst danach separat dort das EN-Bit zu setzen.

Wenn das BUSY Bit gesetzt und dann wieder zurückgesetzt wird, hat sich 
ja tatsächlich etwas getan. Was steht denn sonst im SR? Da könnte man 
doch sehen, ob/was falsch lief ...

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.