Forum: Mikrocontroller und Digitale Elektronik SPI


SPI
von Immanuel N. (sputnik)


Lesenswert?

Hallo Leute

Mein Kollege und ich wollen gemeinsam ein Projekt realisieren. Mir ist 
dabei die Programmierung der Mikrokontroller zugefallen (Atmel AVR). Ich 
will die Signale von 3 Sensoren auswerten, die an die SPI angeschlossen 
werden. Mein Problem dabei ist, das ich nicht wirklich kappiere, was 
denn SPI genau ist. Ich habe mal bei Wikipedia vorbeigeschaut und habe 
dort herausgelesen, dass man da scheinbar einige Sachen parallel 
anhängen kann. Das finde ich an und für sich eigentlich recht genial. 
Aber weiter weiss ich leider nicht mehr.

Kann mir da jemand helfen?

Sputnik

von johnny.m (Gast)


Lesenswert?

SPI (Serial Peripheral Interface) ist ein Bus-Interface, das es 
ermöglicht, seriell Daten zwischen zwei oder mehr Teilnehmern 
auszutauschen. Dabei ist ein Teilnehmer der Master, die anderen 
Teilnehmer sind Slaves. Der Master erzeugt den Bustakt und fragt die 
Slaves ab. Ein Slave darf nur dann Daten senden, wenn er vom Master 
angesprochen wird. Da das Ansprechen der Slaves über Hardware geschieht 
(im Falle von mehr als einem Slave), ist SPI sehr schnell, da im 
Unterschied zu I²C (bei Atmel AVR TWI) keine Slave-Adresse mit 
übertragen werden muss. Darüberhinaus arbeitet SPI bidirektional, d.h. 
wenn der Master Daten sendet, sendet gleichzeitig auch der Slave.

Du müsstest dir aber, um das Prinzip komplett zu verstehen, einige 
Grundlagen zu Bussystemen aneignen. In den Controller-Datenblättern 
steht auch einiges zum Thema drin.

von rene (Gast)


Lesenswert?

Die Devices haengen nicht parallel, sondern seriell. SPI ist im Prinzip 
ein Satz Schieberegister, die einen geschlossenen Kreis bilden. Wenn der 
Controller nichts empfangen muss, kann der Kreis auch offen sein. 
Gemeinsam ist der Clock, meist vom Master, dem Controller gestellt. 
Gemeinsam auch das CS, mit dem wird der zuletzt anliegende Wert geladen. 
Falls man mehrere CS zur Verfuegung stellen kann/will, dann kaoennen die 
Devices allenfalls auch Parallel sein, vorausgesetzt, bei nicht-CS ist 
der Ausgang tristate.

rene

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

>Die Devices haengen nicht parallel, sondern seriell.

Son Quatsch!
Die Devices hängen sehr wohl parallel am Bus.
Sie werden nur seriell angesprochen.
Devices (Slaves), die nicht per Select-Leitung angewählt sind, "nehmen 
die Beine vom Bus" - schalten ihre Ausgänge in den hochohmigen Zustand, 
damit es zu keinem Kurzschluß auf dem Bus kommt.
Takt- und MOSI-Leitung betrifft das natürlich nicht.

>SPI ist im Prinzip ein Satz Schieberegister, die einen geschlossenen >Kreis 
bilden

Wie lange soll es dauern, bis ein Byte dann beim 5. Schieberegister 
angekommen ist?

>Falls man mehrere CS zur Verfuegung stellen kann/will, dann kaoennen die
>Devices allenfalls auch Parallel sein, vorausgesetzt, bei nicht-CS ist
>der Ausgang tristate.

Endlich etwas richtiges...

von johnny.m (Gast)


Lesenswert?

@rene:
> Die Devices haengen nicht parallel, sondern seriell.
Das ist eine spezielle Konfiguration von SPI, die zur Ansteuerung von 
Schieberegistern genutzt werden kann. I.d.R. baut man den Bus jedoch 
(v.a. dann, wenn es sich um irgendwelche Sensoren o.ä. handelt) so auf, 
dass alle Teilnehmer parallel an den selben Leitungen (MISO, MOSI und 
SCK) hängen und über Slave-Select-Signale ausgewählt werden, da die 
meisten Bausteine, die über ein SPI-Interface verfügen, nicht in der 
Lage sind, Daten "durchzuschieben" (Schieberegister-Architektur).

von johnny.m (Gast)


Lesenswert?

@Rahul:
Und wieder die entscheidenden Sekunden...

rene hat sich da etwas verhauen. Das was er meint, kann man durchaus 
machen, es ist aber ein spezieller Anwendungsfall... Quasi eine 
Daisy-Chain- Architektur.

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

>kann man durchaus machen,

kann...

von anworter (Gast)


Lesenswert?

> Die Devices haengen nicht parallel, sondern seriell. SPI ist im Prinzip
> ein Satz Schieberegister, die einen geschlossenen Kreis bilden.

Was soll das denn ? Das hört sich zumindest arg verquer an !

Alle Geräte hängen parallel an dem SPI Bus, wobei der Slave, der 
empfangen/senden sollen, CS High bekommt (also quasi ausgewählt wird).

von anworter (Gast)


Lesenswert?

ui... viel zu spät...

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

>Quasi eine Daisy-Chain- Architektur.
Ja.
Das Problem ist höchstens, wenn man "dazwischen" Bausteine hat, die 
entweder nur Empfänger oder nur Sender sind...
Beim Standard-SPI hängen alle Geräte mit ihren SCK-, MOSI- und 
MISO-Leitungen parallel. Jedes einzelne kann durch die /CS- oder 
/SS-Leitung ausgewählt.

von johnny.m (Gast)


Lesenswert?

@Rahul:
Meine Rede. Ich sag ja auch nur, dass das, was rene schreibt, machbar 
ist, wenn man eine Reihe Schieberegister hat. Nur ist das in den meisten 
Fällen nicht gegeben. Und in diesem Zusammenhang ("Ein Anfänger möchte 
wissen, wie SPI funktioniert") ist renes Ansatz fehl am Platze, u.a. 
weil er einen (seltenen) Spezialfall beschreibt und ihn zusätzlich noch 
als "Regelfall" deklariert. Bringt nur durcheinander...

von Immanuel N. (sputnik)


Lesenswert?

Danke für die schnellen Antworten. Noch besser wäre, wenn man mich 
zuerst nicht verwirren würde;)

Also kann man bei drei Sensoren unäbhängig voneinander Daten empfangen? 
Ich habe da was gehört von wegen der Master gibt den Glock vor usw.
Allgemein das mit dem Master und Slave habe ich nicht genau verstanden. 
Ich nehme gerne weitere Informationen entgegen.

Bin etwas verwirrt.

Sputnik

von Immanuel N. (sputnik)


Lesenswert?

Ach äm, noch was. Was ist CS?

von Stefan (Gast)


Lesenswert?

CS = Chip Select, damit wählt der Controller den entsprechenden Slave 
aus, wird auch oft SS (Slave Select) genannt.

Ja, du hängst Deine 3 Sensoren an das SPI (also jeweils die Leitung 
MOSI, MISO und SCK vom µC zum Slave führen) und dann noch jeweils ein 
Pin des µC an den SS Pin des Slaves. Je nachdem welche SS Leitung der µC 
gerade auf 0 zieht kann der µC mit dem ausgewählten Slave kommunizieren.

Stefan

von Klaus (Gast)


Lesenswert?

Eine Verbindung eines uP mit einem (Sensor-) Baustein über SPI braucht 4 
Signale.
Der uP ist der "Master", der Sensor ist der "Slave".
Die Kommunikation wird ausschließlich vom Master, also von uP aus 
gesteuert.

Es gibt nur einen Master.
Slaves kann es mehrere, theor. beliebig viele geben.

Die 4 Signale nennen sich:

MOSI   Master Out, Slave In      Ausgang des uP
MISO   Master In, Slave Out      Eingang des uP
CLK    Clock                     immer uP (Master)
CS     Chip select               Auswahlleitung

Die CS braucht man (nur), wenn mehrere SPI Baustein (mehrere Slaves) an 
einem Master angeschlossen sind.

Ein Sonderfall ist, wenn man nur einen "Slave" hat; dann kann der CS 
evtl. fest auf "low" geschaltet werden und man kommt mit nur 3 Leitungen 
aus.

Die anderen 3 Leitungen aller Slaves sind jeweils parallelzuschalten.
Die CS des aktiven Slave muss "low" sein.

Für jeden Slave braucht man einen eigenen CS.

1 Slave:   3  + 1 CS Leitung  --> 4  Leitungen insgesamt (siehe oben)
2 Slave:   3  + 2 CS Leitung  --> 5  Leitungen
3 Slave:   3  + 3 CS   "

Der Master kann sich zu einer Zeit nur mit einem Slave unterhalten.
Dazu wird die CS Leitung dieses Slave auf "low" aktiviert, alle anderen 
Slave CS müssen "high" (inaktiv) bleiben.

Der Master muss "wissen", welcher Slave (jetzt) bedient werden soll.
Natürlich kann man reihum alle nacheinander "abfragen".

Aus einem "Slave" kommt nur was raus, wenn man (zumindest) den CS 
aktiviert und Clock anlegt.
Wieviele Clocks ist von jeweiligen Slave abhängig; können z.B. exakt 25 
Takte sein.
Oft muss man erst gezielte "Befehle" in den Slave "reintakten", damit 
dann nach den 8 Takt (Beispiel) dessen Antwort kommt.
Um die Antwort rauszubekommen, muss man weiter Takte anlegen (und genau 
mitzählen).
Das Datenblatt des jeweiligen Slave-Bausteins sollte das alles 
beschreiben.

Bei mehreren Slave Bausteinen kann man die erforderlichen CS elegant 
durch einen 3-zu-8-Decoder, Typ 74HC138 erzeugen lassen. So kann man mit 
insgesamt  6 Pins des uP  dann 8 SPI Bausteine ansteuern (3 Leitungen 
der eigentlichen SPI, 3 weitere zum Decoder, die 8 Auswahlmöglichkeiten 
bieten).

Die in bisherigen Antworten diskuitierte "Daisy Chain" (serielle SPI) 
ist ein Sonderfall und nur bedingt anwendbar, z.B. wenn man geeignete 
GLEICHARTIGE Slavebausteine hat. Oder lauter Schieberegister des Typs 
74HC494/495. Das ist dann aber eben nur "EIN besonders langer" SPI 
Slave.

So, ich denke das reicht zunächst.

von Immanuel N. (sputnik)


Lesenswert?

Herzlichen Dank an euch (besonders Klaus).

Jetzt scheint mir das ganze schon etwas überschaulicher.

Nehmen wir einmal an, ich benutze den Atmega16 für mein Projekt. Bei dem 
ist die SPI am PORTB (MOSI = PB5, MISO = PB6, SCK = PB7).

1: Frage: Kann ich meine CS PINs frei wählen? (Ich habe keine solche 
gefunden)

2: Frage: Wenn ja, kann ich dann auch die restlichen I/O des PORTB (also 
ausser MOSI, MISO und SCK) als CS nutzen, oder gibt das Probleme?

Immanuel

von johnny.m (Gast)


Lesenswert?

Die Auswahl des Slaves muss der Master über beliebige I/Os selber 
machen, wei Stefan schon angedeutet hat.

von rene (Gast)


Lesenswert?

Die pins mit CS Funktionalitaet sind frei waehlbar. Ja, das kann vom 
Rest des PortB gemacht werden.

Rene

von Immanuel N. (sputnik)


Lesenswert?

johnny.m wrote:
> Die Auswahl des Slaves muss der Master über beliebige I/Os selber
> machen, wei Stefan schon angedeutet hat.

Das kappiere ich nicht ganz. Wie weiss denn der uC an welchen I/O die CS 
sind? Muss ich dem das sagen, wenn ja wie?
Und kann ich die Auswahl der Slaves nicht selber machen? Wenn das der 
Master ja selbständig macht, dann habe ich evtl. ja nicht die Daten des 
Sensors zur richtigen Zeit.

Tut mir leid, dass ich so schwer von Begriff bin.

Immnauel

von johnny.m (Gast)


Lesenswert?

> Und kann ich die Auswahl der Slaves nicht selber machen?
Eben das MUSST Du selber machen! Du kannst die Slave-Select-Signale für 
die Slaves an beliebigen freien I/Os anschließen.

von johnny.m (Gast)


Lesenswert?

Beispiel:
Das Slave-Select-Signal für Sensor 1 ist an PB0 angeschlossen. Wenn 
Daten von Sensor 1 ausgelesen werden sollen, setzt Du im Programm PB0 
auf 0. Anschließend startest Du das SPI....

von Immanuel N. (sputnik)


Lesenswert?

Ahhhhaaaaaa!!

Hehe, ich du hast mir zu einer Epiphanie verholfen. Das tönt schon 
besser. Ich habe schon fast gedacht, der Controller kann Gedanken lesen. 
Da bin ich aber beruhigt, dass alles beim Alten bleibt;)

OK, jetzt kann ich dann mal mein Schema zeichnen. Das ist schon immerhin 
etwas. Es ist mir aber noch lange nicht alles klar bei der SPI, aber das 
Frage ich dann weiter, wenn ich zu diesem Teil komme. Jetzt gieng es mir 
einfach mal darum, so ganz grob zu wissen, wie SPI funktioniert und wie 
ich meine Sensoren beschalten muss.

Zusatzfrage (not essential):
Ich habe im Datenblatt des Controllers (Atmega16) gesehen, dass man auch 
den Controller selber als Slave schalten kann (mittels !SS). Für was ist 
das gut? Kann ich so quasi ein Bussystem von Controllern aufbauen? Also 
fast ein Netztwerk, indem dann einfach einer der Master ist, mit einer 
Routine, die alle anderen organisiert und ihnen sagt, was sie zu tun 
haben?

von 1001. Rahul (Gast)


Lesenswert?

>Kann ich so quasi ein Bussystem von Controllern aufbauen? Also
>fast ein Netztwerk, indem dann einfach einer der Master ist, mit einer
>Routine, die alle anderen organisiert und ihnen sagt, was sie zu tun >haben?

Ja.

von Immanuel N. (sputnik)


Lesenswert?

Das ist aber geil. Gut das ich das jetzt auch weiss, kann gut sein, dass 
ich das mal brauchen werde.

Immanuel

von 1001. Rahul (Gast)


Lesenswert?

>Das ist aber geil.

Das Thema wurde in anderen Threads auch schon besprochen: Es ist etwas 
sehr anstrengend...

von johnny.m (Gast)


Lesenswert?

Wenn Du mehrere Controller miteinander verbinden willst, ist es i.d.R. 
sinnvoller, TWI zu benutzen. SPI-Slave-Betrieb bei den AVRs hat einige 
Tücken... Aber machbar ist es.

von johnny.m (Gast)


Lesenswert?

Übrigens, ein Hinweis auf eine kleine aber feine Falle beim 
SPI-Master-Betrieb: Der SS\-Pin des Masters darf nicht als Eingang 
konfiguriert werden, außer es ist sichergestellt, dass dieser immer 
High-Pegel hat. Wenn er als Eingang konfiguriert ist und ein Low-Pegel 
ankommt, dann schaltet das SPI-Interface automatisch auf Slave-Betrieb 
um. Zweck dieser Sache ist, eine Möglichkeit zum Aufbau eines 
Multi-Master-Systems zu liefern. Der SS\-Pin sollte also im 
SPI-Master-Betrieb nie als Signaleingang benutzt werden. Als Ausgang 
hingegen kann man ihn problemlos benutzen.

von Immanuel N. (sputnik)


Lesenswert?

Danke für den Tipp. Der könnte mir nämlich lange Debug-Sesions vom Hals 
halten.

Leute, ich muss sagen, dass das ein sehr gutes Forum ist. Ich kenne auf 
deutsch kein zweittes, das es mit diesem aufnehmen könnt.

Hertzlichen Dank an alle

Immanuel

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.