STM32F4 Quad SPI funktioniert nicht, wenn das obere Byte des Adressregisters nicht 0 gesetzt ist

OP #6289017
Lesenswert?
• ▲
▼
Hallo,

ich habe einen seltsamen Effekt beim Quad SPI des STM32F469I entdeckt.

Zunächst einmal die Initialisierung des Quad SPI über CubeMX:

    QSPI_HandleTypeDef tQSPI;

    __HAL_RCC_QSPI_CLK_ENABLE();
    tQSPI.Instance = QUADSPI;
    tQSPI.Init.ClockPrescaler           = 180;
    tQSPI.Init.FifoThreshold            = 1;
    tQSPI.Init.SampleShifting           = QSPI_SAMPLE_SHIFTING_NONE;
    tQSPI.Init.FlashSize                = 23;
    tQSPI.Init.ChipSelectHighTime       = QSPI_CS_HIGH_TIME_2_CYCLE;
    tQSPI.Init.ClockMode                = QSPI_CLOCK_MODE_3;
    tQSPI.Init.FlashID                  = QSPI_FLASH_ID_1;
    tQSPI.Init.DualFlash                = QSPI_DUALFLASH_DISABLE;

    HAL_QSPI_Init(&tQSPI);

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();

    GPIO_InitTypeDef tGPIO;
    tGPIO.Mode      = GPIO_MODE_AF_PP;
    tGPIO.Pull      = GPIO_NOPULL;
    tGPIO.Speed     = GPIO_SPEED_FREQ_HIGH;
    //IO 0
    tGPIO.Pin       = GPIO_PIN_11;
    tGPIO.Alternate = GPIO_AF9_QSPI;
    HAL_GPIO_Init(GPIOD, &tGPIO);
    //IO 1
    tGPIO.Pin       = GPIO_PIN_12;
    tGPIO.Alternate = GPIO_AF9_QSPI;
    HAL_GPIO_Init(GPIOD, &tGPIO);
    //IO 2
    tGPIO.Pin       = GPIO_PIN_7;
    tGPIO.Alternate = GPIO_AF9_QSPI;
    HAL_GPIO_Init(GPIOF, &tGPIO);
    //IO 3
    tGPIO.Pin       = GPIO_PIN_13;
    tGPIO.Alternate = GPIO_AF9_QSPI;
    HAL_GPIO_Init(GPIOD, &tGPIO);
    //CLK
    tGPIO.Pin       = GPIO_PIN_10;
    tGPIO.Alternate = GPIO_AF9_QSPI;
    HAL_GPIO_Init(GPIOF, &tGPIO);
    // CS
    tGPIO.Pin       = GPIO_PIN_10;
    tGPIO.Alternate = GPIO_AF9_QSPI;
    tGPIO.Pull      = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &tGPIO);

Dann möchte ich z.B. 4 Byte Empfangen und vorher 3 Adressbytes senden:

    uint8_t rec_buffer[4];
    QSPI_CommandTypeDef sCommand = {
       .InstructionMode = QSPI_INSTRUCTION_NONE,
       .Address = 0x00080808, //sinnlose Adresse
       .AddressSize = QSPI_ADDRESS_24_BITS,
       .AddressMode = QSPI_ADDRESS_4_LINES,
       .AlternateBytes = 0,
       .AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE,
       .AlternateBytesSize = QSPI_ALTERNATE_BYTES_8_BITS,
       .DummyCycles = 0,
       .DataMode = QSPI_DATA_4_LINES,
       .NbData = 4,
       .DdrMode = QSPI_DDR_MODE_DISABLE,
       .DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY,
       .SIOOMode = QSPI_SIOO_INST_EVERY_CMD
    }
    HAL_QSPI_Command(&tQSPI, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE);
    HAL_QSPI_Receive(&tQSPI, rec_buffer, 
HAL_QPSI_TIMEOUT_DEFAULT_VALUE);

Das funktioniert soweit, solange das oberste Byte der Adresse wie hier 
im Beispiel auf 0 gesetzt ist. Diese Adresse in sCommand.Address ist die 
Adresse, die in das Adressregister des Quad SPI geschrieben wird. Im 
Oszi konnte ich beobachten, wie der Quad SPI den Takt triggert, CS auf 
LOW zieht und die Daten über IO0 bis IO4 verschickt/empfängt.

Wenn man stattdessen z.B.

       .Address = 0x08080808,

schreibt, dann sendet der Quad SPI nichts. CS wird nicht auf LOW gezogen 
und es wird auch kein Takt generiert. Das gleiche Problem tritt auch 
auf, wenn man mit

       .AddressSize = QSPI_ADDRESS_32_BITS,

eine 4 Byte große Adresse verschickt. Auch hier funktioniert der Quad 
SPI nur, wenn das oberste Byte in der Adresse 0 ist. Es scheint also 
wirklich nur vom Inhalt des obersten Bytes im Adressregister abzuhängen.

Für meine Applikation genügen eigentlich 3 Adressbytes, aber es würde 
mich dennoch interessieren, wieso der Quad SPI nicht funktioniert, wenn 
das oberste Byte im Adressregister nicht 0 ist. Hat da jemand vielleicht 
eine Idee?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.