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?
Re: STM32F4 Quad SPI funktioniert nicht, wenn das obere Byte des Adressregisters nicht 0 gesetzt ist
Kann ich nicht bestätigen, zumindest bei F7, H7 geht's auch problemlos jenseits 2^23. Nur muss man FSIZE im DCR halt auch entsprechend setzen ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.