Frage:
Wie kann ich das Senden von Daten über I2C per Slave oder Master beenden?
alt-rose
2019-11-19 10:47:41 UTC
view on stackexchange narkive permalink

Angenommen, ein Slave oder Master sendet mehrere Bytes an den Empfänger auf dem I2C-Bus, und die Anzahl der Bytes ist nicht vorher definiert.Wie teilt der Absender dem Empfänger dann mit, dass keine Daten mehr gesendet werden müssen?

Soweit ich weiß, sendet der Absender für den Fall, dass er Master ist, einen NACK, um dem Slave (Empfänger) mitzuteilen, dass keine Daten mehr gesendet werden müssen.Nach dem Senden von NACK wird die STOP-Bedingung gesendet, um die Sitzung zu beenden.

Aber ich frage mich, wie dieses Handshake zwischen einem Master und einem Slave stattfindet, wenn der Slave Absender und der Master Empfänger ist und nur der Slave (Absender) weiß, wann keine Daten mehr an den Empfänger gesendet werden müssen?

Sechs antworten:
#1
+10
Passerby
2019-11-19 12:35:50 UTC
view on stackexchange narkive permalink

Aber ich frage mich, wie dieses Handshake zwischen einem Master und einem Slave stattfindet, wenn der Slave Absender und der Master Empfänger ist und nur der Slave (Absender) weiß, wann keine Daten mehr an den Empfänger gesendet werden müssen?

Das soll nicht passieren. i2c ist ein sehr definiertes Protokoll und jedes Slave-Gerät sollte jedem Master bekannt sein. Normalerweise fordert der Master den Slave zum Senden auf, und entweder ist die Nachrichtengröße festgelegt, die Nachricht ist sequentiell oder die Nachricht enthält, wie viele Bytes gesendet werden.

  1. Der Master schreibt eine Registeradresse, dann wechselt der Master zum Lesen und der Slave sendet ein Byte. Das ist alles, was der Meister will, sendet einen Stopp.

  2. Der Master schreibt eine Registeradresse, dann wechselt der Master zum Lesen und der Slave sendet ein Byte, dann liest der Master erneut, sodass der Slave das nächste Byte (oder dasselbe Byte) sendet. Der Master liest willkürlich, wie viele er will, und sendet dann einen Stopp.

  3. Der Master schreibt eine Registeradresse, dann wechselt der Master zum Lesen und der Slave sendet ein Byte. Dieses Byte teilt dem Master mit, wie viele Bytes das Register haben soll. Der Master liest und der Slave sendet so viele, dann stoppt der Master.

  4. ol>

    Die gesamte Kommunikation wird vom Master gesteuert. Der Slave tut nichts, was der Master nicht will. Der Master steuert die Geschwindigkeit der Uhr (Taktdehnung hält nicht stand) und wie viele Bytes gelesen werden. Der Slave sollte zu keinem Zeitpunkt versuchen, die Datenleitung zu erzwingen, wenn der Master dies nicht mitgeteilt hat. Die Datenstruktur sollte vorher bekannt sein.

Genau.Wenn Ihr Slave mit dem Master sprechen möchte, sollte er etwas anderes verwenden, nicht I2C.Möglicherweise eine Interrupt-Leitung zu einer anderen E / A.Warten Sie andernfalls, bis Sie angesprochen werden.
Es kann sogar sein, dass der Slave keine eigene Taktquelle hat und sich vollständig auf die vom Master bereitgestellte I2C-Uhr verlässt.
@Michael Das scheint gefährlich.In einer Multi-Slave-Umgebung bedeutet dies, dass ein anderes Gerät gesperrt wird, wenn sich eine Slave-Uhr ausdehnt.Ich bin mir nicht sicher, ob ich so einen i2c IC gesehen habe.
#2
+4
Justme
2019-11-19 11:39:23 UTC
view on stackexchange narkive permalink

Dies sind die beiden Optionen.

Wenn der Slave-Empfänger keine weiteren Daten akzeptiert, kann er das Byte NAK, aber der Master ist weiterhin für das Senden der Stoppbedingung verantwortlich.

Für einen Slave-Sender kann er nichts zum Stoppen signalisieren, er muss vorher bekannt sein oder er könnte in den Daten codiert sein, z.Die Textzeichenfolge wird mit einer Null abgeschlossen, damit der Slave Nullen senden kann, bis der Master stoppt.

Normalerweise ist dies selten und es gibt ein bekanntes Protokoll, sodass der Master immer im Voraus wissen muss, wie viele Bytes er in einer einzelnen Transaktion lesen oder schreiben wird, auch wenn dies bedeutet, dass zuerst ein Header mit fester Größe zwischen Geräten übertragen wird, wie viel übertragen werden soll.

#3
+4
Mitu Raj
2019-11-19 11:41:47 UTC
view on stackexchange narkive permalink

Angenommen, ein Slave oder Master sendet mehrere Bytes an den Empfänger auf dem I2C-Bus und die Anzahl der Bytes ist nicht vorher definiert. Also dann Wie wird der Absender dem Empfänger mitteilen, dass er keine Daten mehr hat? senden?

Wenn der Master der Absender ist, weiß er, wie viele Bytes gesendet werden müssen. Der Master signalisiert das Ende seiner Datenübertragung, indem er nach dem Senden des letzten Bytes eine STOP-Bedingung sendet und die Transaktion beendet.

Beachten Sie, dass der Master dies jederzeit tun kann. Der Slave kann NACK senden, um zu sagen, dass er keine Daten mehr empfangen möchte. Aber nur der Master entscheidet, ob diese Transaktion gestoppt wird.

Aber ich frage mich, wie dieses Händeschütteln zwischen einem Meister stattfindet und Slave, wenn der Slave Sender und der Master Empfänger ist und nur Der Slave (Absender) weiß, wann keine Daten mehr an den gesendet werden müssen Empfänger?

Wenn Slave der Absender ist, sollte der Master im Voraus wissen, wie viele Bytes empfangen werden müssen. Der Master signalisiert dies, indem er nach dem Empfang des letzten Bytes einen NACK sendet, damit der Slave die SDA-Leitung nicht mehr ansteuert. Der Master kann jetzt eine STOP-Bedingung einleiten und die Transaktion beenden.

Lesen Sie hier gut: TEXAS i2c

#4
+3
KingDuken
2019-11-19 11:50:48 UTC
view on stackexchange narkive permalink

Ich werde Ihren gesamten Beitrag nach und nach verdauen ...

Angenommen, ein Slave oder Master sendet mehrere Bytes an den Empfänger auf dem I2C-Bus und die Anzahl der Bytes ist nicht vorher definiert.

Aber es sollte definiert werden. Wenn zufällige Informationen gesendet oder empfangen wurden, können Sie diese niemals interpretieren.

Wie wird der Absender dem Empfänger dann mitteilen, dass er keine Daten mehr hat? senden?

Der Hersteller bestimmt, wie viele Bits vom Slave empfangen werden müssen. Der Master wird normalerweise von einem Logikgerät wie einem Mikrocontroller, einer CPU usw. geschrieben.

Soweit ich weiß, ist das für den Fall, dass der Absender ist Der Master sendet dann einen NACK, um dem Slave (Empfänger) mitzuteilen, dass es einen gibt Keine Daten mehr zu senden.

Nein, nicht ganz richtig. Ein "NACK" tritt auf, wenn der Master nichts vom Slave "hört", nachdem er dieses Bit an den Slave gesendet hat. Es ist, als würde man telefonieren und sagen: "Hallo, bist du da?"

Aber ich frage mich, wie dieses Händeschütteln zwischen einem Meister stattfindet und Slave, wenn der Slave Sender und der Master Empfänger ist und nur Der Slave (Absender) weiß, wann keine Daten mehr an den gesendet werden müssen Empfänger?

Ihre Definition von Sender und Empfänger ist verzerrt. Sowohl der Master als auch der Slave fungieren als Sender und Empfänger. Der Master kann je nach Schreib- bzw. Lesevorgang sowohl senden als auch empfangen.


H Hilfreicher Rat: Lesen Sie möglicherweise ein I2C-Slave-Datenblatt. Suchen Sie nach dem Schlüsselwort "message". Dies sind die Informationen, die der Master an den Slave sendet.

enter image description here Bild von hier... nicht mein Bild.

Der Master sollte so programmiert sein, dass er die gleiche Länge des Adressrahmens wie der Slave liest, die im Datenblatt des Slaves definiert ist.Möglicherweise können Sie auch eine Adresse eines Slaves festlegen, aber normalerweise nicht viel.Dies hilft bei der Behebung von Konflikten, wenn zwei Slaves dieselbe Adresse haben.


Hier ist ein Beispiel für einen Teil, mit dem ich erst kürzlich gearbeitet habe: einen ADM1276-Hot-Swap-Controller.Es entspricht den PMBUS-Spezifikationen, die I2C-Topologie gilt jedoch weiterhin.Es zeigt Ihnen die Interaktionen von Master und Slave beim Senden, Empfangen, Lesen und Schreiben von Bytes.

enter image description here

#5
+3
gbarry
2019-11-19 13:42:21 UTC
view on stackexchange narkive permalink

Das i2c-Protokoll enthält nichts, das dieses Problem löst.Sie können es zum Laufen bringen, aber Sie werden eine Software verwenden, um es zu tun.Da i2c für die Hardwarekommunikation konzipiert wurde, die normalerweise Register mit fester Größe umfasst, wurde nichts für die Verarbeitung von Daten variabler Länge bereitgestellt.Ich habe das selbst herausgefunden und musste das gleiche Problem lösen, das Sie in Betracht ziehen.

Da der Master alles steuert, kann der Slave nur Hinweise darauf senden, wie viele Daten gesendet werden müssen.Was für mich am besten funktioniert hat, ist, dass der Slave die Länge als erstes Byte sendet.Dann weiß der Master, nach wie vielen Bytes er fragen muss.

#6
  0
Erinell Barba
2020-04-30 05:51:56 UTC
view on stackexchange narkive permalink

Das Protokoll selbst erlaubt keine solche Aktion, aber es ist nichts, was mit der Programmierung nicht gelöst werden kann.

Möglicherweise zwei mögliche Optionen:

  1. Dass der Lehrer in diesem ganzzahligen Fall zuerst einen Wert anfordert (weniger als 255) und dies die Größe der Daten ist, die Sie später beim nächsten Anruf senden.

  2. Wenn Sie die maximale Länge der zu sendenden Daten kennen, nehmen Sie diese als Referenz, konvertieren Sie sie in ein Array oder eine Zeichenfolge und fügen Sie ein bestimmtes Zeichen hinzu, das Sie verwenden werden, um zu markieren, wo Ihre Daten sindDaten enden und im Master konvertieren Sie erneut den von Ihnen verwendeten Datentyp.Füllen Sie mit den kleinsten Daten den Rest der Zeichenfolge mit Ihrem Sonderzeichen und voila aus. Sie senden immer eine Zeichenfolge mit derselben Größe.

  3. ol>


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
Loading...