mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Multimaster SPI


Autor: Alex F. (alex86)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex F. (alex86)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: sch_michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Skibowski (skibby)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Manos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex F. (alex86)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Manos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vegiß das HW-SPI, das kann keine bidirectionalen Pins.

Mach alles in Software und gut is.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.