SPI / I2C mit Übertragung in beide Richtungen, initiiert von beiden Seiten

OP #3772008
Lesenswert?

Hallo µCs!


Ich habe zur Zeit ein Problem, für welches ich keine Antwort finden 
konnte.
Eventuell ist es einfach eine seltene oder gar irrsinige Sache die ich 
Versuche..

Anwendungsbeispiel:
- Verbinde zwei Mikrocontroller über eine serielle Schnittstelle
- Beide verfügen über einen Button
- Druck auf den Button sendet ein Signal an den Partner
- Partner toggled LED

Bedeutet:
- Auf Knopfdruck muss der entsprechende µC ein Signal an seinen Partner 
senden

Problem:
- Slaves können nicht einfach an einen Master senden, sondern müssen 
dazu aufgefordert werden. Der master weiß natürlich nichts vom 
Knopfdruck.

Lösungsansätze:
- Unschön!: Zusätzliche Leitung zwischen Slave und Master, welche bei 
Knopfdruck am Slave ein Interrupt am Master auslöst, so dass dieser nach 
Daten fragt
- Unmöglich?: Beide im Slave Modus halten (kein Master vorhanden), bei 
Knopfdruck wird in den Master umgeschaltet (eventuell warten falls grade 
empfangen wird), die Kommunikation wird gestartet, anschließend wieder 
alle im Slave Modus.
- Verwendung asynchroner Übertragung anstelle von I2C, SPI


Für jegliche Arten von Lösungsansätzen wäre ich sehr dankbar!

Grüße,
Lars
#3772096
Lesenswert?

Bei Mikrokontrollern kannst du den I2C-Modus ja umschalten zwischen 
Slave und Master. Im Wartezustand nimmst du den Slavemodus, bis die 
Taste gedrückt wird. Dann schaltest du auf Master, siehst aber vorher 
auf den Zustand der Leitungen. Wenn die Leitung frei ist, wird gesendet, 
ansonsten wird erst als Slave empfangen und dann als Master gesendet.
Gast #3772111
Lesenswert?

Lars H. schrieb:
> - Unschön!: Zusätzliche Leitung zwischen Slave und Master, welche bei
> Knopfdruck am Slave ein Interrupt am Master auslöst, so dass dieser nach
> Daten fragt

Dann nimm 1-Wire. Die gegenüber I2C/SPI eingesparte Clock-Leitung kannst 
du für den Interrupt verwenden.
OP #3772142
Lesenswert?

Danke für die Antworten!

holger schrieb:
> Nimm einen UART. Dann sind alle deine Probleme gelöst.

ich bin mir allerdings nciht ganz sicher, wie ich dann verhindere, dass 
die beiden sich beim Senden nicht in die Quere kommen.

Jobst Quis schrieb:
> Bei Mikrokontrollern kannst du den I2C-Modus ja umschalten zwischen
> Slave und Master. Im Wartezustand nimmst du den Slavemodus, bis die
> Taste gedrückt wird. Dann schaltest du auf Master, siehst aber vorher
> auf den Zustand der Leitungen. Wenn die Leitung frei ist, wird gesendet,
> ansonsten wird erst als Slave empfangen und dann als Master gesendet.

Ja sowas in der Richtung hatte ich gedacht. Werde ich dann mal probieren 
ob das funktioniert. Ich weiß halt nicht was mit der Clockleictung 
passiert, wenn es keinen Master mehr gibt.

Mike schrieb:
> Dann nimm 1-Wire.

Was ist damit gemeint? Also, nur eine Leitung (Übersetzen hab ich 
hinbekommen), aber was steckt dahinter? Auch in asynchroner Ansatz?
Gast #3772165
Lesenswert?

Lars H. schrieb:
> Lösungsansätze:
> - Unschön!: Zusätzliche Leitung zwischen Slave und Master, welche bei
> Knopfdruck am Slave ein Interrupt am Master auslöst, so dass dieser nach
> Daten fragt

Das nennt sich dann SMBus.

Andere Lösung: der Slave merkt sich die Taste und wenn er regelmäßig 
alle 100ms (oder 200ms oder wie schnell es immer nötig ist) gefragt 
wird, meldet er den Tastendruck und möglicherweise auch wie lange er 
gedrückt wurde.

MfG Klaus
Gast #3772169
Lesenswert?

>holger schrieb:
>> Nimm einen UART. Dann sind alle deine Probleme gelöst.
>
>ich bin mir allerdings nciht ganz sicher, wie ich dann verhindere, dass
>die beiden sich beim Senden nicht in die Quere kommen.

Die können sich nicht in die Quere kommen.
Das ist ja das gute am Uart. Jede Seite kann einfach
senden wann es ihr beliebt. Dazu muss keinerlei
Rücksicht auf die Gegenseite genommen werden.

Den Rest von dem rumgeposte hier kannst du vergessen.
Wenn du eine Sache nicht willst, dann ist es ein
I2C Multimaster System;)
#3772187
Lesenswert?

holger schrieb:
> Er will kein 1-Wire. Den Schrott kann man sich sonstwohin stecken.

Schön, dass du jetzt schon für andere entscheidest was sie wollen. Ich 
hingegen wollte nur der Vollständigkeit halber eine Referenz auf das 
1-Wire Protokoll liefern, und damit aufzeigen, dass es sich um ein 
standardisiertes Protokoll handelt. Ob und inwiefern das für den 
konkreten Anwendungsfall geeignet ist, steht dabei im Hintergrund.

Und ja, ich denke auch, dass UART die bisher beste vorgeschlagene Option 
ist.

Mit freundlichen Grüßen,
Karol Babioch
OP #3772191
Lesenswert?

Marc Vesely schrieb:
> Kann nicht passieren, Leitungen sind gekreuzt

hm, ... ja eigentlich klar, wie auch sonst :D

Karol Babioch schrieb:
> Siehe: https://de.wikipedia.org/wiki/1-Wire

Jo danke. Interessante Idee mit der Stromversorgung etc, aber wohl nicht 
wonach ich suche.

Klaus schrieb:
> Andere Lösung: der Slave merkt sich die Taste und wenn er regelmäßig
> alle 100ms (oder 200ms oder wie schnell es immer nötig ist) gefragt
> wird, meldet er den Tastendruck und möglicherweise auch wie lange er
> gedrückt wurde.

Das ginge, aber sowas wollte ich vermeiden.

---

Ich werde mich morgen mal damit beschäftigen, das über UART umzusetzen. 
Danke für die Hilfe und Anregungen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren