Forum: Mikrocontroller und Digitale Elektronik Multimaster SPI


von Alex F. (alex86)


Lesenswert?

Hallo,
ich habe folgendes Problem: Ich möchte zwei Atmegas mit SPI verbinden,
jedoch sollen beide Master sein. Zusätzlich habe ich nur eine Leitung
zu Verfügung, nämlich Mosi. Ich programmiere das ganze in Bascom.Der
Master gibt ja immer den Takt vor, mein Problem ist, dass ich dem Avr,
welcher gerade die Daten von dem zweiten AVR empfängt, sagen muss, dass
er jetzt im Moment Slave ist und keinen Takt generiert. Geht das
überhaupt? Kann ich mitten im Programm auf Slave umschalten. Oder habe
ich etwas falsch verstanden? Wie könnte ich das am besten machen?
Handshakeleitungen benutze ich schon, nur kommen die gesendeten Daten
nie richtig an. Jedoch in Master-Slave funkt alles prima.
Tut mir leid, wenn dieses Thema oft durchgekaut wird, aber es ist sehr
wichtig.
mfg
Alex

von Ralf (Gast)


Lesenswert?

Hm... Du könntest folgendes probieren:

Beide AVRs werden als Slave betrieben. Der erste, der Master sein muss,
schaltet sich auf Master-Betrieb, sendet, und wenn er fertig ist, wird
er wieder Slave.
Evtl. musst du noch sicher stellen, dass nicht beide gleichzeitig
senden wollen, etwa indem du vor dem Master-Betrieb prüfst, ob SCK
aktiv ist. Dann könnte derjenige, der Master sein will, SCK schonmal
aktivieren, bevor er selber richtig Master wird, der andere erkennt
dadurch, dass er Slave bleiben muss...

Ist nur so ne Idee, muss genauer durchdacht werden.
Hoffe, das war hilfreich, falls nicht, bin ich auf weitere Lösungen
gespannt...

Ralf

von Alex F. (alex86)


Lesenswert?

danke für deine schnelle Antwort! Hätte ich nicht erwartet.
Deine Idee ist nicht schlecht. Denoch wäre es mir lieber, beide auf
Master-Modus zu definieren und dann im Programm auf Slave umzuschalten
. Mich würde nur interessieren ob ich einfach so im Programmteil auf
Slave  in Bascom umschalten kann? Ob das generel geht? Also sodass kein
Takt mehr generiert wird.
Meine beiden Handshakeleitungen dienen zum Sperren. Sprich,sie sagen,
ob gesendet werden darf oder nicht. Somit weiss ich genau, wer gerade
Senden und wer nicht.

von crazy horse (Gast)


Lesenswert?

warum komplizierter als nötig?
Einer ist master, einer ist slave. und wenn der slave was sagen will,
zeigt er das über eine leitung an, bekommt den den Takt vorgesetzt, die
Daten gehen raus. Verstehe nicht, warum es dir "lieber" wäre, beide
als master arbeiten zu lassen. bringt bei 2 Teilnehmern nicht wirklich
was (ausser AufwandO)

von sch_michael (Gast)


Lesenswert?

Genau, so würde ich es auch machen. Einer Master, einer Slave und der
Slave meldet sich über extra Leitung wenn er was zu sagen hat.

von Klaus S. (skibby)


Lesenswert?

kompliziert wird es aber wenn beide Controller zusätzlich noch mit
eigener SPI-Peripherie kommunizieren müssen (z.B A/D-Wandler ...).
Dazu
müssen beide Master sein können. Eine Möglichkeit wäre das MODF-Flag
bzw. das WCOL-Flag interruptgesteuert auszuwerten. Ich habe das an
einem Projekt mal versucht (mit ST7-Controllern) bin letztlich aber am
Codeumfang gescheitert und habe die Kommunikation zwischen den
Controllern dann mit I2C realisiert.

von ich (Gast)


Lesenswert?

>Kann ich mitten im Programm auf Slave umschalten?

Das geht, wahrscheinlich aber nicht gerade einfach. Der
Slave-Select-Pin hat auch bei einem SPI-Master eine Funktion. Wird er
aktiviert, konfiguriert sich der Master automatisch als Slave um. Schau
dir dazu das Kapitel im Datenblatt genau an.

Gruß

von Rahul (Gast)


Lesenswert?

Der Slave-Pin ist im Master-Mode ein popeliger Ausgang.
In irgendeinem SFRegister gibt es ein Bit, das entscheidet, ob Master
oder Slave. Der Pin hat nur die Slave-Select-Funktion, wenn der
Controller Slave ist, damit man das Ding auch per Interrupt steuern
kann.

von ich (Gast)


Lesenswert?

@ Rahul
Du kannst diesen Pin auch im Master-Modus als Eingang setzen. Bei
High-Pegel funktioniert dieser Atmel als Master. Bei low-Pegel denkt
dieser Atmel, es gibt einen weiteren Master und dieser spricht ihn an
(rtfm, für den ATmega16 auf Seite 138).
Diese Funktionalität ist allerdings wirklich nur für
Multi-Master-Systeme interessant.

Gruß

von Manos (Gast)


Lesenswert?

"Zusätzlich habe ich nur eine Leitung zu Verfügung, nämlich Mosi."

Ich bin mir jetzt nicht sicher was Du damit ausdrücken willst... SPI
sind meines Wissens 3-4 Leitungen (MOSI, MISO, Clock, evtl. CS), und
wenn Du kein Miso hast kommen da nicht wirklich viele Daten an (oder
kannst halt nur vom Master senden)...

Sofern Du noch eine Datenleitung (ausser SPI) frei hast würde ich
wahrscheinlich überlegen meine M/S Verbindung zu machen und vom Slave
eine Datenleitung zum Master die signalisiert, dass er wieder Daten
abholen soll...

Sollten Dir die freien Anschlüsse ausgehen und die Kommunikation nicht
zu schnell sein müssen kann man sich möglicherwiese auch andere
Übertragungsprotokolle überlegen wie z.B. I2C welches mit 2 Pinnen
auskommt.

von Rahul (Gast)


Lesenswert?

@ich: Ok, das hatte ich nicht (mehr) im Kopf.
Aber, ob man das in BASCOM programmiert bekommt?

von ich (Gast)


Lesenswert?

das kommt darauf an, ob BASCOM dich im Master-Modus an diesen Pin
ranlässt.
In C ist zumindest der Schnittstellenzugriff nicht allzu kompliziert.
Interessant wird dann das Busprotokoll: Kollisionserkennung etc.

von Alex F. (alex86)


Lesenswert?

noch mal danke für die zahlreichen Antworten!
Ich möchte es noch ein wenig genauer erläutern. Der Zweck ist, dass ich
ein zu verfügunggestelltes Funkmodul ansteuern will. Das Funkmodul wird
über eine Spi-Schnittstelle angesteuert. Dieses Funkmodul hat nur den
Ausgang bzw Eingang Mosi. Denn eimal bin ich Master, also Master-Out
und  dann beim Entfangen Slave-In. Durch meine Handshakeleitungen ist
genaue definiert, wann ich senden darf. Also mit Kollisionen dürfte es
wenig Probleme geben. Ich muss nur irgendwie in Bascom im Programm von
Master auf Slave betrieb umschalten. Das ist das Schwierige, also wenn
jemand Tipps hat nur her damit bzw. den Code.
Vielleicht kennt jemand das Register, in dem ich das im Programm ändern
kann?

von Manos (Gast)


Lesenswert?

"Dieses Funkmodul hat nur den Ausgang bzw Eingang Mosi."

Und Du bist sicher, dass es sich um SPI handelt? Wenn bidirektionale
Kommunikation vorgesehen ist macht es m.e. keinen Sinn die MISO-Leitung
wegzulassen, dafür aber eine Handshakeleitung für die Richtung zu
machen.

von peter dannegger (Gast)


Lesenswert?

Vegiß das HW-SPI, das kann keine bidirectionalen Pins.

Mach alles in Software und gut is.


Peter

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.