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
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.
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.
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.
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.
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)
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.
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..
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.
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.
Ok, ich nehme zu Kenntniss: Entweder SPI vollständig selbst in Software machen, oder vollständig wie vorgesehen verwenden. Mischen macht Probleme. DANKE! Sebastian
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
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.
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.
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.
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
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.