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
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
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.
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)
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.
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.
>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ß
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.
@ 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ß
"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.
@ich: Ok, das hatte ich nicht (mehr) im Kopf. Aber, ob man das in BASCOM programmiert bekommt?
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.
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?
"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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.