Forum: Mikrocontroller und Digitale Elektronik STM32 QSPI mit separaten NSC


von Bobby (Gast)


Lesenswert?

Hallo,

ich habe einen STM32 mit QSPI FLASH auf einem Custom Board. Ist es 
moeglich einen separaten NSC fuer den QSPI zu definieren und auf dem 
gleichen Bus ein zweiten QSPI Flash zu legen und diesen auch mit einem 
zweiten separaten NSC anzusteuern?
Wenn ich in der IDE STM32CubeIDE den NCS manuell als GPIO_Output 
definiere kann der QUADSPI1 nicht initialisiert werden.
Vielleicht kenn hier ja jemand eine Moeglichkeit den QUADSPI1 mit 
externen/separaten NCS zum laufen zu bekommen.

von A. B. (Gast)


Lesenswert?

Bobby schrieb:
> moeglich einen separaten NSC fuer den QSPI zu definieren und auf dem
> gleichen Bus ein zweiten QSPI Flash zu legen und diesen auch mit einem
> zweiten separaten NSC anzusteuern?
> Wenn ich in der IDE STM32CubeIDE den NCS manuell als GPIO_Output
> definiere kann der QUADSPI1 nicht initialisiert werden.
> Vielleicht kenn hier ja jemand eine Moeglichkeit den QUADSPI1 mit
> externen/separaten NCS zum laufen zu bekommen.

Vmtl. geht es um NCS, nicht um NSC? Je nach Gehäuse und Derivat haben 
tatsächlich mehrere Pins als AF-Auswahlmöglichkeit NCS für Bank1 
und/oder Bank2. In dem Fall kann man problemlos (logisch gesehen) 
mehrere Flash Chips bis auf NCS parallel schalten. Allerdings kann dann 
immer nur einer aktiv sein, die Umschaltung geht dann über 
Umkonfiguration von den betreffenden Pins zwischen AF und GPIO (mit 
Ausgang auf '1'). Ob das e-technisch ebenso geht, hängt vom Takt, Layout 
etc. ab, denn die Leitungen werden zwangsläufig deutlich länger, stärker 
kapazitiv belastet usw. Ggf. muss man denn Takt halt etwas reduzieren.
Habe ich schon mal ausprobiert, geht prinziell ganz einfach.

von A. B. (Gast)


Lesenswert?

A. B. schrieb:
> Bobby schrieb:
>> moeglich einen separaten NSC fuer den QSPI zu definieren und auf dem
>> gleichen Bus ein zweiten QSPI Flash zu legen und diesen auch mit einem
>> zweiten separaten NSC anzusteuern?
>> Wenn ich in der IDE STM32CubeIDE den NCS manuell als GPIO_Output
>> definiere kann der QUADSPI1 nicht initialisiert werden.
>> Vielleicht kenn hier ja jemand eine Moeglichkeit den QUADSPI1 mit
>> externen/separaten NCS zum laufen zu bekommen.

Ach, noch dazu: Als NCS einfach einen als GPIO konfigurierten Pin zu 
nehmen ist keine gute Idee. Bei indirect read/write geht das prinzipiell 
schon, man muss halt vor dem Start des Transfers NCS aktivieren und 
hinterher deaktivieren - soweit problemlos - in der Theorie. Leider gibt 
es wohl auch Fälle, wo das QSPI fälschlicherweise einen extra Takt vor 
dem Aktivieren von NCS spendiert. Normalerweise ist so ein Bug ja 
irrelevant, aber mit softwaremäßigem NCS ist das tödlich.

Bei memory mapped read geht das aber gründlich in die Hose, da das QSPI 
einen Prefetch macht, und erst bei nicht-sequenziellem Zugriff oder 
längerer Inaktivität NCS deaktiviert und eine neue Leseoperation (mit 
anderer Adresse halt) startet. Leider ist dieser Prefetch-Mechanismus 
nicht klar dokumentiert, also kaum vorhersagbar.

Es gibt also sinnvollerweise nur die Möglichkeit, mehrere Pins mit AF zu 
nutzen, oder auch einfach über einen Demultiplexer. Über dessen 
Adresseingange halt den gewüschten Flash auswählen.

von pegel (Gast)


Lesenswert?

Laut RefMan RM0410 für F76x/F77x scheint das nicht vorgesehen zu sein.
Im Gegensatz zum einfachen SPI scheint er kein Software CS zu 
unterstützen.
Ein Multiplexer könnte funktionieren, allerdings müsste das wohl ein 
sehr flinker sein.

Kann mich aber irren. Schau besser selbst im RefMan für deinen µC nach.

von Bobby (Gast)


Lesenswert?

Hi A.B. danke fue deine schnelle Antwort.

Ja ich meine natuerlich den NCS ;)
Ich nutze zur Konfiguration des QUADSPI1 das IOC File in mein 
STM32CubeIDE Projekts. Da kann ich aber nur separat Bank 1 oder Bank 2 
oder Dual Bank mit Quad SPI Line auswaehlen, eine Moeglichkeit ein QSPI 
Bus mit 4 Liens und mehreren NCS gibt es da leider nicht bzw. wenn ich 
den NCS Pin manuell als Output definiere kann der "hqspi1" nicht in der 
Software generiert werden.
Ich bin relativ ne i der IDE STM32CubeIDE und STM32 Thematik und steh da 
etwas auf dem schlauch.
Ich dacht auch das ich die Pins die ich als NCS definiere manuell 
schalte und dann via Software den BSP QSPI Read/Write Befehl nutzen 
koennte.
Was genau meinst du mit "AF-Auswahlmöglichkeit" ?

von Bobby (Gast)


Lesenswert?

Meinst du mit AF "Alternate Functions"? Da koennt ich den zweiten CS auf 
einen anderen PIN legen (ist vorhanden fuer die Bank 1) aber wie kann 
ich diesen im Betrieb wechseln? Sorry falls es eine Dumme Frage ist, ich 
weiss es wirklich (noch) nicht ;)

von Frank K. (fchk)


Lesenswert?

Bobby schrieb:

> Da kann ich aber nur separat Bank 1 oder Bank 2
> oder Dual Bank mit Quad SPI Line auswaehlen, eine Moeglichkeit ein QSPI
> Bus mit 4 Liens und mehreren NCS gibt es da leider nicht

Ja genau. Ist so. Du könntest allerdings den CS durch einen 
Demultiplexer wie 74LVC138 schicken (CS an Pin 4, Pin 5 auf GND, Pin 6 
auf VCC) und dann mit 3 Leitungen (Pins 1-3) einen von 8 CS auswählen 
(Pins 7, 9-15).

fchk

von A. B. (Gast)


Lesenswert?

Bobby schrieb:
> Meinst du mit AF "Alternate Functions"? Da koennt ich den zweiten
Ja.

> CS auf
> einen anderen PIN legen (ist vorhanden fuer die Bank 1) aber wie kann
> ich diesen im Betrieb wechseln? Sorry falls es eine Dumme Frage ist, ich
> weiss es wirklich (noch) nicht ;)
Einfach im GPIOx_MODER register bei den betreffenden Pins zwischen '01' 
(output mode) und '10' (Alternate function mode) hin- und herschalten. 
Die AF-Nummer für die beiden (oder mehr) Pins in GPIOx_AFRL bzw. 
GPIOx_AFRH braucht man nur einmal einzustellen, ebenso den '1'-Pegel in 
GPIOx_ODR und ggf. GPIOx_OTYPER, GPIOx_PUPDR.

Allerdings sind solche "dynamischen" Umschaltungen in CubeMX nicht 
vorgesehen, man muss also für den zweiten, dritten NCS-Pin die 
Initialisierung "zu Fuß" machen.

Das erspart man sich bei Verwendung vom 74lvc138. Mit max. 6ns ist der 
auch hinreichend schnell und hat passenderweise ja auch low-aktive 
Ausgänge. Aber generell gilt natürlich: Erst QSPI deaktivieren (event. 
mittels ABORT), warten, bis BUSY auf '0' geht, und erst dann umschalten. 
Sonst gibt's Salat.

von Bobby (Gast)


Lesenswert?

Sorry fuer die spaete Antwort und vielen dank fuer deine Infos.

Ich werde es gerne mal ausprobieren, danke ;)

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.