Hallo Thomas,
richtig, der Master muss auf die Antwort des Slave warten, sonst gibt es
irgendwann ein Kollision auf dem Bus. Mein Protokoll sieht ungefähr so
aus:
Master
Datensatzlänge, Slave Adresse, Befehlskennung,(Daten), Checksumme
Antwort vom Slave
Datensatzlänge, Adresse, Daten, Checksumme
Die Datensatzlänge werte ich aus um das Ende der Datenübertragung ohne
Timout zu erkennen. Der MC prüft einfach ob die Anzahl der empfangene
Byte gleich dem ersten empfangenen Byte ist. Wenn ja, dann signalisiert
die ISR das dem Hauptprogramm über ein entsprechendes Flag und der
Datensatz (Befehl) wird ausgewertet und dann eine Antwort gesendet.
Werden nicht genug Byte empfangen, dann wird der Empfang über einen
Timout beendet. In diesem Fall antwortet der Slave auch nicht, da es
wahrscheinlich eine Störung war.
Der Code wird euch nichts bringen, da ich mit der PIC-Serie arbeite.
Eine andere ellegannte Variante ist, als erstes Byte die Adresse mit
einer 1 als 9. Bit und alle andern Bytes mit einer 0 im 9. Bit zu
übertragen sofern der MC das unterstützt. Ein Interupt wird dann nur
ausgelöst, wenn eine Adresse gesendet wird. Das ist vor allem dann
sinnvoll, wenn viele Daten übertragen werden müssen. Die Kommunikation
könnte dann folgendermaßen aussehen:
Master:
Adressiere (selektiere) Slave 0x03 für Kommunikation
Slave:
bestätige Selektion
Datenaustausch Master <--> Slave (ohne Adresse)
:
:
Datenaustausch Master <--> Slave (ohne Adresse)
Master:
Deaktiviere Slave Adresse 0x03
.... ud dann weiter zum nächsten Controller.
Die Variante mit dem Adress-Detect hatt den Vorteil, das nur der
adressierte Controller die Daten auf dem Bus "mitschreiben" muss. Die
anderen Controller können derweil ihre eigentliche Hauptaufgabe
erledigen.
MfG
Steffen