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?