Ist eine gemischte I2C-Frequenz möglich?

12

Angenommen, wir haben einen 400 kHz I 2 C-Bus. Es gibt einen Master und eine Reihe von Slave-Geräten. Wir möchten noch ein Slave-Gerät vorstellen, aber leider geht es nur auf 100 kHz.

Die soliden Designoptionen sind eindeutig:

  • Lassen Sie diesen Bus einfach mit 100 kHz laufen
  • Verwenden Sie separate Busse für die 400-kHz- und 100-kHz-Peripheriegeräte

Aber die Frage ist nur ein Hack: Was ist, wenn wir einen Bus verwenden und die 400-kHz-Geräte mit 400 kHz adressieren und den Bus auf 100 kHz schalten, wenn wir mit dem 100-kHz-Slave sprechen?

Oder könnte sich der langsamere Slave als Reaktion auf den 400-kHz-Hash, den er auf den I 2 C-Leitungen sieht, schlecht benehmen , weil er fälschlicherweise denkt, dass er angesprochen wird?

Können wir uns auf 100-kHz-Geräte verlassen, um das 400-kHz-I 2 C-Signal noch ausreichend gut verarbeiten zu können, um Nachrichten, die an andere Slaves gerichtet sind, zuverlässig zu ignorieren?

Kaz
quelle
4
In Bezug auf Ihren letzten Satz glaube ich nicht, dass Sie sich darauf verlassen können, dass 100-kHz-Geräte 400-kHz-Signale verarbeiten können.
Gbmhunter
Genau darauf sind wir jedoch angewiesen, wenn wir einen solchen Hack implementieren. Es kommt also grundsätzlich nicht in Frage.
Kaz

Antworten:

5

Wie Sie vorschlagen, ist dies keine gute Ingenieurspraxis. Während einige Geräte den Datenverkehr, den sie nicht empfangen können (Unterabtastung), am meisten ignorieren, können andere Geräte den Bus mit fehlerhaften Frames überladen.

Daher hängt die Antwort, nach der Sie suchen, von den Besonderheiten Ihrer Anwendung ab, z.

  • Länge Ihrer I2C-Verbindungen
  • Pull-up-Widerstände Wert
  • Gerätekompatibilität

Natürlich ist es schwer vorherzusagen, was mit einem Gerät passieren würde, das einige Jahre später außerhalb seiner Spezifikationen betrieben wird.

Eine andere Möglichkeit besteht darin, eine Abschaltleitung zu betreiben, um Geräte zu verlangsamen, oder die Taktleitung (sofern sie kein Taktsignal erzeugen können) durch ein UND-Gatter zu leiten.

SunnyBoyNY
quelle
9

Wenn Sie keinen zusätzlichen I2C-Bus von Ihrem Master haben, können Sie auch einen I2C-Switch wie den PCA9543A / 43B verwenden . Setzen Sie die 400-kHz-Slaves auf einen Zweig und die 100-kHz-Slaves auf den anderen und schalten Sie ihn nach Bedarf um.

DoxyLover
quelle
Wenn Sie sich ansehen, was Philips (der Urheber) gesagt hat, ist es genau das. Sie sind nicht kompatibel und ein Busschalter ist das empfohlene Mittel. (Es ist in einer App-Notiz).
Gbarry
5

Es gibt keine Garantie dafür, dass sich das 100-kHz-Gerät nicht schlecht verhält, wenn es 400-kHz-Verkehr ausgesetzt ist - von NACKs bis hin zu Bushängen ist alles möglich.

Sie sollten entweder den gesamten Bus mit 100 kHz betreiben oder einen separaten Bus mit niedriger Geschwindigkeit für Ihr langsames Peripheriegerät haben.

Adam Lawrence
quelle
3

Andere Optionen. Anstatt zwei Busse zu haben, können Sie einfach eine zusätzliche Leitung verwenden (einfacher mit einer Software / Bitbanged I 2 C). Eine separate Taktleitung oder eine separate Datenleitung. Oder verwenden Sie einen I 2 C-Puffer oder einen I 2 C-Schalter, um diesen einzelnen 100-MHz-Chip in einem eigenen Segment zu platzieren, ohne etwas anderes ändern zu müssen.

Oder testen Sie es einfach mit einem einzigen Bus. Es ist durchaus möglich, dass der 100-kHz-Chip die Leitung beeinflusst. Es könnte jedes vierte Bit lesen und am Ende denken, dass es angesprochen wurde. Aber es müsste eine gültige Startbedingung sehen und dann jedes 4. Bit aus den nächsten 32 Bits als genaue Adresse lesen, dann müsste es entweder versuchen, die nächsten paar Bytes als gültige Informationen zu lesen, um in seine Register zu schreiben oder versuchen Sie, Daten auszublenden. Ich denke nicht, dass es eine zu wahrscheinliche Situation ist. Am besten verdrahten Sie es einfach in einer Testschaltung und überprüfen es.

Zwei Dinge zu beachten: Wenn es sich um eine einmalige Schaltung handelt oder Sie nur wenige machen, ist es einfach genug, sie zu riskieren oder zu ändern. Wenn es sich um ein Massenprodukt handelt, möchten Sie vielleicht nur den zweiten Bus haben. Das andere ist, dass Sie berücksichtigen müssen, dass der 100-kHz-Chip einfach nach der ursprünglichen I 2 C-Spezifikation hergestellt wurde und möglicherweise höhere Taktraten unterstützt. Es wurde einfach nicht auf die höhere Geschwindigkeit von 400 kHz getestet.

Passant
quelle
2

Das Design des I2C-Busses ist so, dass -

  1. Wenn bei SCL eine fallende Flanke auftritt, kann dies dazu führen, dass ein Slave-Gerät SDA ohne eine bestimmte minimale Verzögerung sofort aktiviert.
  2. Die relative Reihenfolge der ansteigenden und abfallenden Flanken ist von entscheidender Bedeutung.

Aufgrund der unterschiedlichen Treiberstärke und Leitungskapazität wäre es theoretisch möglich, dass ein Gerät auf eine etwas langsam fallende Flanke bei SCL reagiert, indem es SDA so schnell fährt, dass ein anderes Gerät SDA zuerst fallen lässt.

Möglicherweise war es möglich, mehrere logische Schwellenwerte für SCL zu definieren und anzugeben, dass eine fallende Flanke bei SCL nach einer Flanke bei SDA immer noch über 2/3 VDD liegen muss, wenn die Flanke bei SDA erkannt wird. Ein Gerät kann jedoch SDA nicht als Reaktion auf eine fallende Flanke bei SCL aktivieren, bis es unter 1/3 VDD gefallen ist, aber die Spezifikation ist nicht in solchen Begriffen geschrieben.

Stattdessen betrachten Geräte, die auf SDA und SCL nahezu gleichzeitig fallende Flanken sehen, die Flanke auf SCL im Allgemeinen als zuerst aufgetreten, es sei denn, der Kante auf SDA geht im Wesentlichen voraus. Einige I2C-Implementierungen behandeln dies, indem sie SCL und SDA mit einem externen Takt synchronisieren und verlangen, dass eine fallende Flanke von SDA zwei Perioden vor der von SCL beobachtet wird, um als zuerst eingetreten zu gelten. Wenn die Betriebsgeschwindigkeit auf SCL und SDA relativ zum Synchronisationstakt zu hoch ist, können die Geräte beliebige Sequenzen von hohen und niedrigen Signalen auf SCL und SDA wahrnehmen; Wenn eine dieser Sequenzen so aussieht, als würde sie das langsame Gerät adressieren, reagiert sie möglicherweise entsprechend und unterdrückt alle anderen laufenden Kommunikationen.

Es gibt keinen besonderen Grund, warum Geräte an einem I2C-Bus auf die Synchronisation mit einer Systemuhr angewiesen sein sollten (es wäre besser, zwei diskrete Schwellenwerte für SCL zu erfassen), aber Tatsache ist, dass einige Geräte tatsächlich so funktionieren. Beachten Sie, dass selbst wenn ein Gerät, das intern auf langsame Geschwindigkeiten beschränkt war, mit einem schnellen Bus koexistieren wollte, es wahrscheinlich mindestens eine Zeitdehnung verwenden muss, wenn etwas passiert, an dem es interessiert sein könnte.

Dies würde dazu führen, dass einige Kommunikationen langsamer ablaufen als sonst, aber die Geschwindigkeitsverschlechterung wäre wahrscheinlich nicht annähernd so schlimm, wie es beim taktsynchronisierten Design erforderlich ist (der tatsächliche Betrag, um den das langsame Gerät die Uhren streckt, würde dies wahrscheinlich nicht tun so schlecht sein wie der Betrag, um den die Uhr verlangsamt werden muss, um Fehler im schlimmsten Fall in den synchronisierten Uhreinheiten zu vermeiden).

Superkatze
quelle