Forum: Mikrocontroller und Digitale Elektronik SPI über normale Pins


von Sebastian R. (lange_leitung)


Lesenswert?

Guten Morgen!

Ich hab eine Frage zu SPI.
Wenn ich über SPI Daten empfangen möchte, muss ich die dafür 
vorgesehenen Pins vom uC benutzen, da hier die Daten erwartet werden. 
Sonst geht´s nicht.
Wenn ich aber über SPI Daten senden möchte: Beim Master würde ich Clock 
und Chip Select wieder wie vorgesehen verwenden, aber kann ich einen 
normalen Ausgangspin (nicht den MOSI) verwenden?
Meine Idee ist, dass ich mehrere Slaves gleichzeitig (!!!) mit Daten 
versorgen kann. Alle Slaves hängen parallel an Clock und CS vom Master, 
aber weil der Master nur einen MOSI hat, benutze ich für die anderen 
Slaves einfach normale Ausgangspins.
Geht das, oder gibt es irgendwas, das ich nicht bedacht habe?
Danke für eure Hinweise!!
Sebastian

von Linux-Älter (Gast)


Lesenswert?

Geht schon.
Du kannst aber auch alle Slaves gleichzeitig an MOSI hänger und mit 
einem "normalen PIN" das CHIPSELECT Signal für jeden einzelnen Slave 
steuern.

von Walter T. (nicolas)


Lesenswert?

Sebastian R. schrieb:
> Meine Idee ist, dass ich mehrere Slaves gleichzeitig (!!!) mit Daten
> versorgen kann.

Bei einer MCU mit mehreren Kernen sollte das gehen (z.B. Propeller). Bei 
einer MCU mit nur einem Kern mußt Du eh alles hintereinander senden.

von Stefan S. (chiefeinherjar)


Lesenswert?

Die meisten ICs haben keine Mindest-Geschwindigkeit bei SPI, daher 
könntest du ein Soft-SPI implementieren.
Das Problem ist, dass die reguläre CLOCK-Leitung (normalerweise) 
hardwaremäßig an MISO bzw MOSI gekoppelt ist.

Bei Soft-SPI machst du eben alles "händisch":
- CS-Pin manuell auf Low setzen,
- (MOSI)-Datenpin entweder High oder Low schalten,
- Clock-Pin manuell toggeln (high-low-Übergang)
- (ggf. Daten einlesen)
- Clock-Pin wieder toggeln (low-high-Übergang)
- Repeat.

von Peter D. (peda)


Lesenswert?

Sebastian R. schrieb:
> Meine Idee ist, dass ich mehrere Slaves gleichzeitig

Definiere "gleichzeitig" (innerhalb wieviel µs).
Manche Slaves lassen sich kaskadieren und übernehmen dann gleichzeitig 
mit der steigenden Flanke des /CS.

von Falk B. (falk)


Lesenswert?

Sebastian R. schrieb:
> Guten Morgen!
>
> Ich hab eine Frage zu SPI.
> Wenn ich über SPI Daten empfangen möchte, muss ich die dafür
> vorgesehenen Pins vom uC benutzen, da hier die Daten erwartet werden.
> Sonst geht´s nicht.

Das kann man so allgemein gar nicht sagen. Man kann SPI als Master 
problemlos in Software nachbilden, dann kann man an jedem uC x-beliebige 
Pins nutzen. Als Slave geht das meistens nicht, weil der SPI-Takt zu 
hoch für eine softwarebasierte Auswertung ist.

> Wenn ich aber über SPI Daten senden möchte: Beim Master würde ich Clock
> und Chip Select wieder wie vorgesehen verwenden, aber kann ich einen
> normalen Ausgangspin (nicht den MOSI) verwenden?

Nur, wenn man SPI komplett in Software generiert.

> Meine Idee ist, dass ich mehrere Slaves gleichzeitig (!!!) mit Daten
> versorgen kann. Alle Slaves hängen parallel an Clock und CS vom Master,
> aber weil der Master nur einen MOSI hat, benutze ich für die anderen
> Slaves einfach normale Ausgangspins.

Das ist nicht sinnvoll und praktikabel, denn dann müßtest du per 
Software synchron zum SPI-Takt, welcher in der Hardware generiert wird, 
die Daten ausgeben. Das ist arg aufwändig, da kann man SPI gleich 
komplett in Software machen.

> Geht das, oder gibt es irgendwas, das ich nicht bedacht habe?

Wozu der Aufriß? Warum nutzt du SPI nicht so wie der Rest der Welt? 
Entweder bekommen verschiedene Slaves je ein CS-Signal oder wie im Fall 
von Schieberegistern hängt man alle Slaves nacheinander in eine Kette an 
ein CS (daisy chain)

von Bimbo. (Gast)


Lesenswert?

Das Ganze ist eh sinnfrei, weil dein µC in der Regel nicht gleichzeitig 
auf mehreren Pins Software SPI machen kann. Nacheinander ja aber:

Entweder du hast mehrere SPI Busse, samt DMA oder es macht keinen 
Unterschied, ob du nacheinander über die selben SPI Leitungen mit 
separaten CS Leitungen oder nacheinander über Software SPI sendest.

von Bimbo. (Gast)


Lesenswert?

Bimbo. schrieb:
> Das Ganze ist eh sinnfrei, weil dein µC in der Regel nicht gleichzeitig
> auf mehreren Pins Software SPI machen kann.

Verbesserung: Zumindest nicht mit der gleichen Geschwindigkeit, wie eine 
Hardware SPI versteht sich..

von moep (Gast)


Lesenswert?

Sebastian R. schrieb:
> Meine Idee ist, dass ich mehrere Slaves gleichzeitig (!!!) mit Daten
> versorgen kann.

Mit verschiedenen Daten?
Die Datensätze müssten ja zumindest mal gleich lang sein. Sonst passt ja 
die Anzahl der Clock-Cycles nicht.

Gefühlt bringt dir die Nutzung der Hardware-SPI-Einheit hier nichts 
außer (vmtl. unlösbaren) Problemen.
Die SPI-Hardware kann i.d.R. nur ihren eigenen MOSI ansteuern. Das heißt 
du müsstest du die Daten auf deinen zusätzlichen MOSI-Leitungen "von 
Hand" (in Software) raus takten. Wie soll das Taktsynchron geschehen?

Kurz: Mach Soft-SPI.

von Peter D. (peda)


Lesenswert?

Bimbo. schrieb:
> Das Ganze ist eh sinnfrei, weil dein µC in der Regel nicht gleichzeitig
> auf mehreren Pins Software SPI machen kann.

Es gibt sehr wohl MCs, die auf 4 Datenpins gleichzeitig SPI machen 
können, z.B. für SD-Karten oder serielle Flash-ICs.

von Sebastian R. (lange_leitung)


Lesenswert?

Ok, ich nehme zu Kenntniss:
Entweder SPI vollständig selbst in Software machen, oder vollständig wie 
vorgesehen verwenden. Mischen macht Probleme.

DANKE!
Sebastian

von Michael U. (amiga)


Lesenswert?

Hallo,

Peter D. schrieb:
> Bimbo. schrieb:
>> Das Ganze ist eh sinnfrei, weil dein µC in der Regel nicht gleichzeitig
>> auf mehreren Pins Software SPI machen kann.
>
> Es gibt sehr wohl MCs, die auf 4 Datenpins gleichzeitig SPI machen
> können, z.B. für SD-Karten oder serielle Flash-ICs.

Das ist dann aber kein SPI, meist wird es SDIO genannt und dazu gehört 
die passende Hardware im µC. Ich habe aber den Sinn und Zweck des 
Vorhaben vom TO ohnehin nicht ganz verstanden.

Gruß aus Berlin
Michael

von Falk B. (falk)


Lesenswert?

Walter T. schrieb:
> Sebastian R. schrieb:
>> Meine Idee ist, dass ich mehrere Slaves gleichzeitig (!!!) mit Daten
>> versorgen kann.
>
> Bei einer MCU mit mehreren Kernen sollte das gehen (z.B. Propeller). Bei
> einer MCU mit nur einem Kern mußt Du eh alles hintereinander senden.

Jajaja, da hat mal wieder Einer was gehört. Auch ein popeliger AVR kann 
mehrere Datenströme gleichzeitig per SPI ausgeben.

von moep (Gast)


Lesenswert?

Michael U. schrieb:
> Das ist dann aber kein SPI, meist wird es SDIO genannt

Es ist denke ich Dual- bzw. Quad-SPI gemeint.
Ist wie normales SPI nur mit 4 Datenleitungen statt einer. Wird wie 
gesagt z.B. für die schnelle Anbindung von Flash-Speicher genutzt.

von Bimbo. (Gast)


Lesenswert?

moep schrieb:
> Es ist denke ich Dual- bzw. Quad-SPI gemeint.
> Ist wie normales SPI nur mit 4 Datenleitungen statt einer. Wird wie
> gesagt z.B. für die schnelle Anbindung von Flash-Speicher genutzt.

Wie auch immer, das ist dann eine speziell dafür ausgelegte Hardware 
Peripherie.

Falk B. schrieb:
> Jajaja, da hat mal wieder Einer was gehört. Auch ein popeliger AVR kann
> mehrere Datenströme gleichzeitig per SPI ausgeben.

Wie denn, wenn nur eine SPI vorhanden? Alle Bausteine in Daisy Chain? 
Das ist  dann strenggenommen auch nicht gleichzeitig, sondern 
hintereinander. Lediglich wird alles mit der selben CS Leitung 
gleichzetig übernommen.

Aber ich vermute, dass der TO Anforderungen stellt, die so absolut gar 
nicht nötig sind. Vermutlich aus Unwissen heraus.

von Sebastian R. (lange_leitung)


Lesenswert?

Der TO hat überlegt, wie er 4 DACs möglichst schnell mit 
unterschiedlichen aber immer gleich langen Werten versorgen kann. Sagen 
wir mal 8 bit. Bei daisy chain braucht er dann ja 4x8 Zyklen.
Schreibt er aber, wie beschrieben, die Werte über 4 Ausgänge raus, 
können die 4 DACs (ungefähr) gleichzeitig versorgt werden. Also nur 1x8 
Zyklen.
Soweit die Theorie. Die Praxis wurde ja netterweise von den anderen 
bereits erklärt.

Der TO

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Bimbo. schrieb:

> Falk B. schrieb:
>> Jajaja, da hat mal wieder Einer was gehört. Auch ein popeliger AVR kann
>> mehrere Datenströme gleichzeitig per SPI ausgeben.
>
> Wie denn, wenn nur eine SPI vorhanden? Alle Bausteine in Daisy Chain?

Nö. Das kann man problemlos in Software nachbilden, wenn es sein muss in 
Assembler. Um wieviel das dann schneller als Hardware SPI mit einer 
Leitung ist, sei mal dahingestellt.

> Das ist  dann strenggenommen auch nicht gleichzeitig, sondern
> hintereinander.

Nö.

> Lediglich wird alles mit der selben CS Leitung
> gleichzetig übernommen.
>
> Aber ich vermute, dass der TO Anforderungen stellt, die so absolut gar
> nicht nötig sind. Vermutlich aus Unwissen heraus.

Diese Diagnose ist nur allzu oft richtig ;-)
Aber dafür sind die Fragen in einem Forum wie diesem ja da.

von Willi S. (ws1955)


Lesenswert?

Das vermutlich gewünschte lässt sich durch Multiplexen der Clock 
Leitungen zu den Slaves erreichen. Solange die Slaves keinen weiteren 
Takt mehr kriegen, bleibt auch bei aktivem CS alles eingefroren. Am Ende 
dann alle CS high für synchrone Datenübernahme.

von Schlumpf (Gast)


Lesenswert?

Du kannst theoretisch auch eine soft-SPI bauen, die quasi gleichzeitig 
auf 4 Ports schreibt.

Pseudocode:

Clk1 = high
SDO1 = D1(0)
Clk2 = high
SDO2 = D2(0)
....
Warten
...
Clk1 = low
....
usw

Das ist nicht 100% gleichzeitig, aber nahezu.

von Schlumpf (Gast)


Lesenswert?

Wählt man die Pins geschickt, kann sogar wirklich gleichzeitig 
gearbeitet werden.
Dann kann zB mit

PortA=0x0F

Alle Clk gleichzeitig gesetzt werden, wenn diese auf PortA(0...3) 
gemappt sind.

Analog dazu MISO, MOSI und CS

von Michael U. (amiga)


Lesenswert?

Hallo,

einen Port als MOSI, einen Port als MISO, 1x Clock parallel an alle 
Slaves, 1x CS parallel an alle Slaves.
CS aktiv, damit warten alle Slaves auf Daten.
Bitmuster des 2. Bits für die Slaves auf den MOSI-Port.
Clock zur Übernahme durch die Slaves setzen und wieder zurück. Zur 
richtigen Zeit je nach SPI-Mode den MISO-Port lesen.
Daten direkt aufbereitet aus einem Buffer holen und in einen Buffer 
schreiben. Das für alle Bits, die gesendet werden sollen.
CS wieder inaktiv zur Übernahme.
Das Zusammensortieren der Bits aus den Datenbytes auf die Portpins 
vorher erledigen und in den Buffer legen, genauso, wenn nötig, die 
empfangenen Daten später umsortieren.
Damit wären 8 Slaves auch praktisch absolut parallel zu bedienen.

Gruß aus Berlin
Michael

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.