Forum: Mikrocontroller und Digitale Elektronik STM32 SPI - Wozu dieses NSS?


von Thomas B. (escamoteur)


Lesenswert?

Hi,

ich bin grad am studieren der SPI Beschreibung im Reference Manual für 
den STM32.

So weit so gut, abgesehen, dass sie full duplex und bidirectional 
wechselseitig verwenden.

Was sich mir allerdings überhaupt nicht erschließt, ist dieser NSS Pin, 
bzw. wieso man wenn man diesen nicht verwendet, ein NSS Bit setzen muss 
oder hab ich das falsch verstanden. Beim SPI auf den AVRs gibts das ja 
gar nicht.

Liebe Grüße
Tom

von (prx) A. K. (prx)


Lesenswert?

NSS (STM32) = SS (AVR)
Das N symbolisiert active low.

Achtung: Der komplizierten Beschreibung zum Trotz ist dieser Pin bei 
normalem Master-Betrieb leider keine SS-Automatik, sondern genauso 
manuell wie bei AVRs.

von (prx) A. K. (prx)


Lesenswert?

Obacht: bidirektional = half duplex (simplex).

Es gibt eine auch SPI-ähnliche Kommunikation, die mit einer einzigen 
bidirektionalen Datenleitung arbeitet.

von Thomas B. (escamoteur)


Lesenswert?

@PRX: Ich hab beim AVR gar keinen SS verwendet, wenn ich mich da richtig 
erinnere. Ich brauch doch nur CLK, MOSI, MISO und CS um einen Slave 
anzusprechen. wozu dann noch SS?

Full duplex != bidirektional

Ja genau, daher ist mir bis jetzt noch nicht ganz klar was ST da genau 
meint.

Full duplex ist doch auf jeden fall immer bidirektional, andersherum 
nicht zwingend.

Tom

von (prx) A. K. (prx)


Lesenswert?

Thomas Burkhart schrieb:

> @PRX: Ich hab beim AVR gar keinen SS verwendet, wenn ich mich da richtig
> erinnere. Ich brauch doch nur CLK, MOSI, MISO und CS um einen Slave
> anzusprechen. wozu dann noch SS?

SS = CS. Aber auch beim AVR heisst dieser Pin SS, nur die dran hängenden 
Devices sagen oft CS dazu. Und CLK heisst normalerweise SCK. Man kann 
auch über die eigenen Füsse stoplern.

> Full duplex ist doch auf jeden fall immer bidirektional, andersherum
> nicht zwingend.

Full duplex geht schlecht mit einer einzigen Datenleitung. 
"Bidirektional" meint hier, dass die gleiche Leitung mal in die eine mal 
in die andere Richtung überträgt. Also half duplex, was ST simplex 
nennt.

von Thomas B. (escamoteur)


Lesenswert?

Ah, danke, jetzt weiß ich auch endlich was Simplex sein soll.

Ähm, wieso definieren die für das SS dann einen speziellen PIN? Ich hab 
bisher einfach irgendeinen IO-Pin genommen.

Tom

von (prx) A. K. (prx)


Lesenswert?

Thomas Burkhart schrieb:

> Ähm, wieso definieren die für das SS dann einen speziellen PIN? Ich hab
> bisher einfach irgendeinen IO-Pin genommen.

Weil man genau wie beim AVR das SPI auch als Slave betreiben kann.

von Thomas B. (escamoteur)


Lesenswert?

Achso, und in dem Fall ist das SS-Pin der CS des AVRs/STM32, verstehe. 
Als Slave funktioniert der dann automatisch. Als Master ist er 
eigentlich nicht notwendig, richtig?
Tom

von (prx) A. K. (prx)


Lesenswert?

Thomas Burkhart schrieb:

> Achso, und in dem Fall ist das SS-Pin der CS des AVRs/STM32, verstehe.
> Als Slave funktioniert der dann automatisch. Als Master ist er
> eigentlich nicht notwendig, richtig?

Richtig. Genau wie beim AVR tut es jeder andere Pin auch.

von Thomas B. (escamoteur)


Lesenswert?

Dank Dir, das hat mir einige Verwirrung beseitigt. Werde dass auch in 
den STM32 Artikel einfließen lassen.
Tom

von Jean P. (fubu1000)


Lesenswert?

HI,
naja so HALB ist das alles wahr.
Der NSS Pin kann auch von der Hardware automatisch gesetzt werden, mit 
der geeigneten Einstellung. Allerdings hat der Modus in meinem STM32 
noch nen Bug(älteres Modell).

--> SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
-->SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

Gruß

von (prx) A. K. (prx)


Lesenswert?

Jean Player schrieb:

> Der NSS Pin kann auch von der Hardware automatisch gesetzt werden, mit
> der geeigneten Einstellung. Allerdings hat der Modus in meinem STM32
> noch nen Bug(älteres Modell).

Wie ST sich das wirklich gedachte hatte kann ich der Doku dazu nicht 
sauber entnehmen. Es wird zwar ein Hardware-Modus erwähnt, in dem der 
Pin als Ausgang definiert wird, dummerweise widersprechen sich dabei 
aber die Teile der Doku gegenseitig. Von einer automatischen 
Aktivierung/Deaktivierung steht allerdings nirgends etwas. Die einzig 
dokumentierte Automatik ist der Fallback in den Slave-Modus, abhängig 
vom NSS-Pin, was mit Multi-Master-Betrieb zu tun hat.

Klar scheint aber auf Basis entsprechender Diskussionen im STM32-Forum, 
dass man im Master-Modus die SS/CS-Funktion vom SPI manuell steuern 
muss. Ob man dafür den NSS-Pin oder einen anderen verwendet, ist egal. 
Wer es anders versuchte fiel auf die Nase. Und darauf bezog ich mich 
hier im Thread.

Ob das mit Bugs zu tun hat, mit Dokumentations-, Implementierungs oder 
Denkfehler weiss ich nicht. Jedenfalls ist die letzte öffentliche Doku 
(STM32F100 Reference) dazu nicht signifikant anders als die ältere und 
die Errata-Sheets erwähnen keinen Bug dazu.

Wenn du die ganze Wahrheit dazu kennst, immer raus damit. Grad im 
DMA-Betrieb wäre eine automatische Deaktivierung nach erfolgtem Transfer 
recht hilfreich.

von Jean P. (fubu1000)


Lesenswert?

A. K. schrieb:
> Wie ST sich das wirklich gedachte hatte kann ich der Doku dazu nicht
> sauber entnehmen. Es wird zwar ein Hardware-Modus erwähnt, in dem der
> Pin als Ausgang definiert wird, dummerweise widersprechen sich dabei
> aber die Teile der Doku gegenseitig. Von einer automatischen
> Aktivierung/Deaktivierung steht allerdings nirgends etwas. Die einzig
> dokumentierte Automatik ist der Fallback in den Slave-Modus, abhängig
> vom NSS-Pin, was mit Multi-Master-Betrieb zu tun hat.

Richtig.

> Klar scheint aber auf Basis entsprechender Diskussionen im STM32-Forum,
> dass man im Master-Modus die SS/CS-Funktion vom SPI manuell steuern
> muss. Ob man dafür den NSS-Pin oder einen anderen verwendet, ist egal.
> Wer es anders versuchte fiel auf die Nase. Und darauf bezog ich mich
> hier im Thread.

Nicht ganz, der Select funzt. Allerdings bleibt der Pin danach für immer 
Low und muss per Hand zurück gesetzt werden. Das Beispiel Programm in 
der Firmware Lib (Spi->DMA) funktioniert zum Beispiel, aber wie gesagt, 
der Deselect leider nicht.

> Ob das mit Bugs zu tun hat, mit Dokumentations-, Implementierungs oder
> Denkfehler weiss ich nicht. Jedenfalls ist die letzte öffentliche Doku
> (STM32F100 Reference) dazu nicht signifikant anders als die ältere und
> die Errata-Sheets erwähnen keinen Bug dazu.

Ja, mit dem Bug hat ja auch leider niemand von den Herren im ST Forum zu 
gegeben. Es sollte nur in späteren Revisions erfolgen, das der NSS 
ordentlich funktioniert. Ist jetzt mittlerweile glaube ich 1 1/2 Jahre 
her und es scheint sich noch nix ergeben zu haben. Oder ?

> Wenn du die ganze Wahrheit dazu kennst, immer raus damit. Grad im
> DMA-Betrieb wäre eine automatische Deaktivierung nach erfolgtem Transfer
> recht hilfreich.

Tja leider weiss ich auch nur das oben beschriebene. Das Deselect muss 
per Hand geschehen ;-(
Ich wollte auch nur hinweisen, das es auch so funktioniert, damit keine 
Halbwahrheiten im WIKI stehen.

Gruß

von (prx) A. K. (prx)


Lesenswert?

Jean Player schrieb:

> Nicht ganz, der Select funzt. Allerdings bleibt der Pin danach für
> immer Low und muss per Hand zurück gesetzt werden.

Dass da was automatisch aktiviert wird war mir entgangen, danke, aber im 
üblichen ausschliesslichen Master-Mode bringt das ziemlich wenig, denn 
das vordere Ende vom Transfer hat man sowieso unter Kontrolle, nur am 
hinteren Ende hätte das wirkliche Vorteile.

> ordentlich funktioniert. Ist jetzt mittlerweile glaube ich 1 1/2 Jahre
> her und es scheint sich noch nix ergeben zu haben. Oder ?

Wie gesagt, der F100 ist taufrisch, seine separate Referenz ebenfalls, 
und die ist an dieser Stelle fast identisch. Da die Doku zudem nirgends 
eine automatische Deaktivierung erwähnt nehme ich an, dass ST das 
schlicht unter "works as designed" abbucht, nicht unter "bug".

von Dennis H. (somebuddy)


Lesenswert?

Folgendes Szenario :

Zwei Stm32F101 sollen über SPI kommunizieren.

Einer als Master ,der andere entsprechend Slave.
Bei dem Slave "Board" habe ich NSS entsprechend verbunden.
Ist es nun problematisch das NSS des Slave mit dem NSS des Master STM 
ohne Widerstand zu verbinden ? Bzw. macht es sinn ? Oder sollte ich 
besser das NSS des Slave mit einem anderen I/O des Master STM verbinden 
?

Brauche ich einen Pull-Up am NSS oder geschieht dies (wenn implementiert 
) intern ?

Vielen Dank !

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.