Benötige ich SS für die SPI-Single-Slave-Kommunikation?

Ich verwende Atmega328 als Master in der SPI-Kommunikation mit einem einzelnen Slave. Gibt es eine Möglichkeit, die Verwendung des SS-Pins (Slave Select) für SPI zu vermeiden? Dieser Pin kann auch für den PWM-Ausgang verwendet werden, den ich verwenden möchte.

Antworten (4)

Ob Sie den "Select"-Eingang eines SPI-Slaves dauerhaft aktiv binden können oder nicht, hängt sowohl vom spezifischen Slave als auch vom Gesamtsystemdesign ab. Einige Slaves verlassen sich auf Kanten an ihren ausgewählten Eingängen für Dinge wie Flusskontrolle und/oder Byte-Ausrichtung.

In manchen Systemen, in denen Master und Slave immer zusammen zurückgesetzt werden (z. B. durch Ein- und Ausschalten) und niemals Taktstörungen auftreten, können Sie damit davonkommen, aber es ist sicherer (zuverlässiger), eine aktive Slave-Auswahl einzuplanen in Ihrem Entwurf.

Ich würde sagen, dass in fast allen Fällen ein SS-Signal notwendig ist, damit der Slave richtig funktioniert. Eine Ausnahme wäre ein Ausgangsschieberegister (ohne Halteregister), das etwas ansteuert, das für kurze Zeit ein ungültiges Signal tolerieren kann, wie z. B. eine LED-Leiste. In diesem Fall ist das Nicht-SS-Signal mehr oder weniger in das „ruhige“ Intervall zwischen der Änderung des SR-Ausgangs verwickelt. Aber das ist wirklich ein Grenzfall.

ATmega ist hier ein Meister, wie Sie selbst sagten.

Schauen wir uns an, was das Datenblatt über den Slave-Select-Pin sagt:

SS: Slave Select input. When the SPI is enabled as a Slave, this pin is configured as an input regardless of the set- ting of DDB2. As a Slave, the SPI is activated when this pin is driven low. When the SPI is enabled as a Master, the data direction of this pin is controlled by DDB2. When the pin is forced by the SPI to be an input, the pull-up can still be controlled by the PORTB2 bit.

Wie Sie sehen können, wird es nur verwendet, wenn ATmega ein Slave ist. Wenn es sich um einen Master handelt, verwenden Sie normale GPIO-Pins, um einen Slave auszuwählen. Es gibt sogar einen Absatz darüber im Datenblatt:

When configured as a Master, the SPI interface has no automatic control of the SS line. This must be handled by user software before communication can start.

Da Sie in Ihrem Fall nur einen Slave haben, können Sie den Slave-Select-Pin des Peripheriegeräts so festverdrahten, dass er immer ausgewählt ist, und sich nicht mehr darum kümmern müssen.

Im Allgemeinen sollte eine aktive Slave-Select-Leitung verwendet werden. Die Slave-Auswahlleitung sollte den Slave vor Beginn der Übertragung aktivieren und nach Beendigung der Kommunikation deaktivieren. Dazu kann jeder freie Pin des ATmega verwendet werden.

Was Sie beschreiben, ist die ATMega-Seite, aber dieser Chip wäre genauso glücklich, wenn er die Takt- und Datenleitungen nicht ansteuern würde! Das Problem ist die Slave-Seite: Kann der Slave ohne ein SS-Signal funktionieren?
@Wouter van Ooijen Es tut mir leid, ich verstehe nicht, was du meinst. Ich habe bereits geschrieben, dass der Slave-Select-Pin am Slave so eingerichtet werden kann, dass er sich immer im ausgewählten Modus befindet, und das sollte funktionieren (es sei denn, es gibt etwas im Slave, das erfordert, dass der Slave-Select gepulst wird), soweit ich weiß. Habt ihr Ideen/Beispiele warum das nicht geht?
Soweit ich weiß, erfordern alle Sklaven, dass die SS gepulst wird. Erwarten Sie einige Grenzfälle wie das Schieberegister mit LEDs, das ich im Kommentar zu Daves Antwort erwähnt habe.
@Wouter van Ooijen Ich habe mehrere Tutorials gefunden, die erwähnen, dass es in Ordnung ist, also binden Sie die Slave-Auswahl an die ausgewählte Position. Darüber hinaus erwähnen der SPI-Wikipedia-Artikel sowie dieses Microchip-Dokument, dass es in Ordnung ist, es fest verdrahtet zu lassen. Ich erinnere mich auch, dass ich immer, wenn ich SPI benutzte, eine festverdrahtete Slave-Select-Leitung hatte. Ich weiß mit Sicherheit, dass ein solches Setup mit MCP3201 ADC gut funktioniert hat, aber im Moment kann ich mich nicht erinnern, welche anderen Chips ich verwendet habe.
Was ich nicht bestreite, ist, dass es im Allgemeinen eine gute Praxis ist, Active Slave Select zu verwenden, und dass es Peripheriegeräte gibt, die es erfordern, dass es gepulst wird. Daher werde ich meine Antwort bearbeiten, um dies widerzuspiegeln.
Ich habe dieses uChip-Dokument überprüft und konnte keine Erwähnung finden, SS an einen festen Wert zu binden. Der MCP3201 (Datenblatt S. 19): "Wenn dem Gerät weitere Cloks zugeführt werden, während CS noch niedrig ist (nachdem die LSB-First-Daten übertragen wurden), taktet das Gerät auf unbestimmte Zeit Nullen aus." Sie müssen also CS durchlaufen, um ein neues A/D-Ergebnis zu erhalten. Der Wikipedia-Artikel erwähnt kein Beispiel - klingt für mich wie hier, oder bezieht sich vielleicht auf das, was ich den Grenzfall eines Schieberegisters ohne Ausgangslatch nenne.

Der Begriff „SPI“ wird verwendet, um eine Vielzahl von Protokollen zu beschreiben, bei denen ein Master-Gerät mit einem oder mehreren Slave-Geräten kommuniziert. Ein übliches Schema besteht darin, dass ein Slave-Gerät eine "Auswahl"-Leitung hat, die zu Beginn jeder Transaktion aktiviert und am Ende freigegeben wird. Bei Verwendung eines solchen Ansatzes dient die Auswahlleitung dem doppelten Zweck, Bytegrenzen zu synchronisieren und auch anzuzeigen, wo "Befehle" beginnen und enden. Bei der Kommunikation mit einem solchen Slave muss einer der Ausgangspins des Masters mit dem Slave-Select-Kabel verbunden sein, aber für diesen Zweck kann jeder Pin verwendet werden.

Einige andere SPI-Slaves verwenden andere Ansätze zur Synchronisation. Es gibt keinen konzeptionellen Grund, warum Sklaven einen ausgewählten Draht verwenden sollten, aber viele von ihnen tun dies. Sofern Sie den Slave nicht entwerfen, wird die Notwendigkeit des ausgewählten Drahts vom Slave selbst bestimmt.

Nach meiner Erfahrung mit einem aktuellen Projekt ohne Slave-Select-Pin sollten Sie Wege finden, um die Synchronisierung / Desynchronisierung zwischen Master und Slave zu überprüfen. Wie zum Beispiel: CRC in Hardware, Prüfsumme in Software, Pakete mit fester Größe und Verzögerung zwischen Paketen hinzufügen, damit der Slave das letzte Paket verarbeiten kann, bevor Daten für das Master-Gerät verfügbar sind. Jedes Mal, wenn eine Desynchronisierung stattfindet, muss der Slave die SPI-Maschine zurücksetzen und wartet mindestens die Zeit zwischen den Paketen, um Daten zu akzeptieren. Nach diesen Überlegungen würde ich empfehlen, dass Sie SPI nicht ohne SLVE-Auswahl verwenden, da Sie am Ende zu viel Komplexität für etwas sehr Einfaches hinzufügen werden: das Zuweisen eines GPIO-Pins auf dem Master als Chip-Auswahl.