Forum: Mikrocontroller und Digitale Elektronik Stm32f Qspi memory mapped liest immer 0xff


von Jens (Gast)


Lesenswert?

Hallo

Ich habe ein Problem mit dem memory mapped Mode bei dem Stm32f7.
Der Flash loader schreibt mir die Daten in den Flash.
Auslesen kann ich diesen über St link Utility.

Das initialisieren im Programm klappt auch.
Memory mapped wird aufgerufen aus der hal lib und im Speicher Bereich 
erscheint nur 0xff an jeder Speicher Stelle.
Wenn ich nun die Lesezeiten mit und ohne DDR Mode Messe bekomme ich auch 
etwa die doppelte Zeit.

Hat jemand die Initialisierung für mich damit ich die vergleichen kann?
Oder eine Idee woran es liegen könnte?

von A. B. (Gast)


Lesenswert?

Ohne umfassende Beschreibung ist diese Frage sinnlos ... zuviele 
Unbekannte.

Jens schrieb:
> Ich habe ein Problem mit dem memory mapped Mode bei dem Stm32f7.
> Der Flash loader schreibt mir die Daten in den Flash.

Nun denn, das ST-Link Utility kann das gar nicht, jedenfalls nicht ohne 
das passende (zum Flash-Chip und zur Pin-Konfiguration, 
selbsterstellte?) Plugin.

> Auslesen kann ich diesen über St link Utility.

Und wie soll das gehen, ohne das passende Plugin?

> Das initialisieren im Programm klappt auch.
> Memory mapped wird aufgerufen aus der hal lib und im Speicher Bereich
> erscheint nur 0xff an jeder Speicher Stelle.
> Wenn ich nun die Lesezeiten mit und ohne DDR Mode Messe bekomme ich auch
> etwa die doppelte Zeit.

Da muss man wohl oder übel die QSPI-Register, die GPIO-MODER- und 
-AFR-Register sowie RCC-Register nach der HAL-Initialisierung 
abklappern und mit RM, Datenblatt und Schalplan vergleichen.

> Hat jemand die Initialisierung für mich damit ich die vergleichen kann?

Habe ich schon für diverse Boards, gibt's auch von ST (in der 
Demo-Firmware für verschiedene Discovery-Boards) aber es macht überhaupt 
keinen Sinn, das zu kopieren. Hängt halt von Chip und der 
Pin-Konfiguration ab ...

von Jens (Gast)


Lesenswert?

A. B. schrieb:
> Jens schrieb:
>> Ich habe ein Problem mit dem memory mapped Mode bei dem Stm32f7.
>> Der Flash loader schreibt mir die Daten in den Flash.
>
> Nun denn, das ST-Link Utility kann das gar nicht, jedenfalls nicht ohne
> das passende (zum Flash-Chip und zur Pin-Konfiguration,
> selbsterstellte?) Plugin.

Natürlich hatte ich das passende Plugin ausgewählt.
Ich habe deswegen um es zu testen mit dem F7 Discovery Board getestet 
und dieses wieder von J-Link zu ST Link zurück geflasht.

Wenn es nicht funktioniert hätte würde ich an Adresse 0x90000000 auch 
nicht die Daten sehen, welche ich mit dem FlashLoader geschrieben habe.

A. B. schrieb:
> Da muss man wohl oder übel die QSPI-Register, die GPIO-MODER- und
> -AFR-Register sowie RCC-Register nach der HAL-Initialisierung
> abklappern und mit RM, Datenblatt und Schalplan vergleichen.

Wenn die GPIO Register und die Grundkonfiguration nicht stimmen würde 
kann ich wohl kaum die Chip ID vom QSPI auslesen?

A. B. schrieb:
> Habe ich schon für diverse Boards, gibt's auch von ST (in der
> Demo-Firmware für verschiedene Discovery-Boards) aber es macht überhaupt
> keinen Sinn, das zu kopieren. Hängt halt von Chip und der
> Pin-Konfiguration ab ...

Da könnt noch mein Fehler sein nur finde ich diesen leider nicht.

der Flash ist folgender: N25Q128A
1
#define QUAD_OUT_FAST_READ_CMD               0x6B
2
#define DUMMY_CLOCK_CYCLES_READ_QUAD         10
3
4
  HAL_QSPI_DeInit(&QSPIHandle);
5
6
  QSPIHandle.Init.ClockPrescaler     = 80;
7
  QSPIHandle.Init.FifoThreshold      = 4;
8
  QSPIHandle.Init.SampleShifting     = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
9
  QSPIHandle.Init.FlashSize          = QSPI_FLASH_SIZE;
10
  QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_8_CYCLE;
11
  QSPIHandle.Init.ClockMode          = QSPI_CLOCK_MODE_0;
12
  QSPIHandle.Init.FlashID            = QSPI_FLASH_ID_1;
13
  QSPIHandle.Init.DualFlash          = QSPI_DUALFLASH_DISABLE;
14
  if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)
15
16
17
  sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;
18
  sCommand.AddressSize       = QSPI_ADDRESS_24_BITS;
19
  sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
20
  sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
21
  sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
22
  sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
23
24
  sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
25
  sCommand.DataMode    = QSPI_DATA_4_LINES;
26
27
28
  /* Configure Volatile Configuration register (with new dummy cycles) */
29
  QSPI_DummyCyclesCfg(&QSPIHandle);
30
31
  /* Reading Sequence ------------------------------------------------ */
32
  sCommand.Instruction = QUAD_OUT_FAST_READ_CMD;
33
  sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ_QUAD;
34
  sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
35
36
37
  if (HAL_QSPI_MemoryMapped(&QSPIHandle, &sCommand, &sMemMappedCfg) != HAL_OK)    while(1);

von A. B. (Gast)


Lesenswert?

Jens schrieb:
> Natürlich hatte ich das passende Plugin ausgewählt.
> Ich habe deswegen um es zu testen mit dem F7 Discovery Board getestet

Aha, da kommen also tröpfenweise die nötigen Infos. Es geht also 
definitiv um ein F7-Discovery Board? Und welches? Es gibt deren zwei ...

> Wenn es nicht funktioniert hätte würde ich an Adresse 0x90000000 auch
> nicht die Daten sehen, welche ich mit dem FlashLoader geschrieben habe.

> Wenn die GPIO Register und die Grundkonfiguration nicht stimmen würde
> kann ich wohl kaum die Chip ID vom QSPI auslesen?

Nochmals aha! Wieder ein Tröpfchen hinterher. Das Auslesen der ID geht 
aber nicht im Memory Mapped, sondern nur im Indirect Read mode. Und war 
das im QPI-Modus oder SPI (1-Line)?

Aber Instruktion im 4-Line-, Adresse im 1-Line- und Daten dann wieder im 
4-Line-Mode wie unten definiert macht überhaupt keinen Sinn.
Das QUAD_OUT_FAST_READ möchte Instruktion und Adresse im 1-Line, Daten 
im 4-Line Modes.

Und (interne!!!) Konfiguration des Flash Chips? Die Default-Anzahl Dummy 
Clocks (und manches mehr) ist im Flash (auch nicht-flüchtig) 
programmierbar. Falsche Anzahl sollte allerdings nur falsche Daten beim 
Auslesen ergeben, nicht lauter 0xFF.

> der Flash ist folgender: N25Q128A

Aha, also ist's das STM32F746-Disco, nicht F769, das nächste Tröpfchen 
...

>
> #define QUAD_OUT_FAST_READ_CMD               0x6B
> #define DUMMY_CLOCK_CYCLES_READ_QUAD         10

>   sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;
>   sCommand.AddressSize       = QSPI_ADDRESS_24_BITS;
>   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
>   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
>   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
>   sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
>
>   sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
>   sCommand.DataMode    = QSPI_DATA_4_LINES;
>
>
>   /* Configure Volatile Configuration register (with new dummy cycles)
> */
>   QSPI_DummyCyclesCfg(&QSPIHandle);
>
>   /* Reading Sequence ------------------------------------------------
> */
>   sCommand.Instruction = QUAD_OUT_FAST_READ_CMD;
>   sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ_QUAD;
>   sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;

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.