Frage:
Ist es möglich, 400-kHz-I2C-Busse mit einem 32-kHz-Slave zu verwenden?
Thomas O
2010-11-11 01:19:10 UTC
view on stackexchange narkive permalink

Ich werde einen 400-kHz-I2C-Bus verwenden, aber ich möchte mit einer Slave-MCU, einem PIC16F690 ( Datenblatt), sprechen, die mit 32 kHz läuft. Ist das möglich? Ich denke schon, weil der Master die Taktung durchführt, aber gibt es unvorhergesehene Probleme, die auftreten könnten? (z. B. kann die MCU Daten nicht schnell genug in den RAM laden.)

Fünf antworten:
Mark
2010-11-11 01:23:22 UTC
view on stackexchange narkive permalink

Lesen Sie das Datenblatt, um festzustellen, ob der MSSP des Slaves die Geschwindigkeit unterstützt, an der Sie interessiert sind.

Wenn Sie zusätzliche Zeit benötigen, um die Daten aus dem Empfangsregister zu kopieren, verwenden Sie die Taktdehnung. Lesen Sie die Daten erneut Blatt für den Slave zur ordnungsgemäßen Verwendung.

BEARBEITEN: Aus dem Datenblatt für diesen Teil geht hervor, dass 400 kHz eine Mindestgeschwindigkeit des Geräts von 10 MHz und 100 kHz 1,5 MHz erfordern.

Das Dehnen der Uhr wäre in irgendeiner Form unbedingt erforderlich. Der IIC benötigt 9 Takte / Byte, sodass die 400-kHz-IIC-Byterate 45 KByte / s betragen würde, selbst wenn der Prozessor das I2C-Datenregister Zyklus für Zyklus blind bei 32 kHz liest, könnte man durchrutschen.
user1844
2010-11-11 02:14:04 UTC
view on stackexchange narkive permalink

Marks "Blick auf das Datenblatt" ist die richtige Antwort.

Sie stellen häufig fest, dass ein synchroner digitaler Teil wie ein Mikrocontroller alle seine Eingänge über Register abtastet, die vom Haupttakt (oder a) getaktet werden Uhr von der Hauptuhr getrennt). Selbst Dinge, die sich als eigenständige "Uhren" anfühlen, haben häufig obere Frequenzgrenzen, die vom Takt der CPU vorgegeben werden.

Aber selbst wenn die I2C-Slave-Logik eine Taktdomäne von ihr hat Die Art und Weise, wie diese Domäne mit der Taktdomäne der CPU verbunden ist, führt zu Einschränkungen bei den relativen Frequenzen der beiden Logikabschnitte.

Dies ist nur ein unglückliches Problem synchrones Logikdesign. Wenn Sie jemals FPGA-Design machen, müssen Sie sich endlos damit auseinandersetzen.

Nick T
2010-11-11 02:42:30 UTC
view on stackexchange narkive permalink

Das Datenblatt lässt den Eindruck entstehen, dass der I2C asynchron arbeitet, da er anscheinend im Ruhezustand ausgeführt werden kann (keine Uhr zum Peripheriegerät). Es kann jedoch einige Zyklen dauern, um festzustellen, ob es adressiert wurde und ob eine Bestätigung gesendet werden soll.

13.6 Slave-Modus

Im Slave-Modus ist die externe Uhr wird von der externen Taktquelle am SCK-Pin versorgt. Diese externe Uhr muss die in den elektrischen Spezifikationen angegebenen Mindestzeiten für Hoch und Niedrig erfüllen.

Im Ruhemodus kann der Slave Daten senden / empfangen. Wenn ein Byte empfangen wird, wird das Gerät aus dem Ruhezustand geweckt.

In den elektrischen Spezifikationen wird nicht erwähnt, ob es sich nur um den Master- oder sowohl den It- als auch den Slave-Modus handelt. Die 10 MHz für 400 kHz und 1,5 MHz für 100 kHz sind Kommentare zum Parameter für die Bithaltezeit.

Wenn Sie mit sehr unterschiedlichen Takten arbeiten möchten, ist SPI möglicherweise die bessere Wahl, als Sie es im Allgemeinen getan haben direkte Steuerung des Schieberegistertakts.

Es ist die Zeit bis zur Bestätigung, die kritisch ist. Die Adresse muss aus dem Empfangsregister im Vergleich zum Slave-Adressregister verschoben und dann eine Bestätigung oder ein Nack generiert werden. Die Bestätigung wird vom Master beim 9. Takt überprüft, sodass der Satz für Verschiebung + Vergleich + Bestätigung im <1 I2C-Taktzyklus erfolgen muss, der in diesem Beispiel viel schneller als der Systemtakt wäre.
@Mark: Wenn die I2C-Implementierung des PIC gut ist, sollte es in der Lage sein, SCK so lange niedrig zu halten, wie es zum Generieren des ACK oder NAK dauert.
supercat
2011-09-09 03:08:23 UTC
view on stackexchange narkive permalink

Eine kleine Menge asynchroner Logik ermöglicht es einem I2C-Slave, unabhängig davon, wie langsam seine synchrone Logik ausgeführt wird, einen Bus mit Geräten zu teilen, die viel schneller laufen. Ein solches Gerät muss die Geschwindigkeit anderer Geräte für das erste Wort einer Transaktion drosseln (während es prüft, ob es adressiert wird), aber das Protokoll würde weiterhin funktionieren. Wenn eine Transaktion für eine andere Person bestimmt ist, kann das langsame Gerät nach dem Adressbyte ausfallen und die schnelleren Geräte untereinander mit voller Geschwindigkeit kommunizieren lassen.

Eine etwas asynchrone Logik würde es einem I2C-Slave ermöglichen Empfangen Sie ein Datenbyte, ohne den Master zu verzögern, bis das ack / nak erforderlich war. Ein wenig mehr Logik würde es dem Slave noch ermöglichen, Transaktionen zu ignorieren (ohne dass der Bus darauf wartet, dass die CPU einen NAK generiert), deren erstes oder zwei Bytes nicht mit einem bestimmten Muster übereinstimmen. Natürlich muss jede Kommunikation, die für das langsame Gerät bestimmt ist, mit einer Geschwindigkeit übertragen werden, die es verarbeiten kann, aber es kann wünschenswert sein, schnelleren Geräten zu ermöglichen, den Bus mit voller Geschwindigkeit zu nutzen, ohne dass eine Verzögerung von einem Gerät eingeführt wird, das nicht interessiert ist ohnehin in der Kommunikation.

Leider werden zumindest einige I2C-Implementierungen, wie die im PSOC, ersticken, wenn I2C-Daten im Verhältnis zur CPU-Taktrate zu schnell ausgetauscht werden (ein Problem, wenn ein PSOC mit reduzierter Geschwindigkeit ausgeführt wird Geschwindigkeit, um Energie zu sparen). Ich bin mir über den PIC nicht sicher.

Wouter van Ooijen
2011-09-11 14:26:22 UTC
view on stackexchange narkive permalink

Abgesehen von den anderen Antworten, die sich mehr mit der elektrischen / logischen Schnittstelle befassen, wie wäre es mit der I2C-Prozessor-Schnittstelle?

Ein PIC führt alle 4 Taktzyklen 1 Befehl aus, sodass Sie bei 32 kHz erhalten 8 KIPS. Ich bin nicht sicher, wie viele Taktzyklen I2C benötigt, um ein Byte über den Bus zu bekommen, aber 10 ist eine gute Vermutung für die Größenordnung. Bei 400 kHz würde das 40 kByte / s bedeuten, sodass Sie für jede Anweisung, die Ihr armer PIC ausführt, 5 Bytes in den Hals bekommen könnten! Ohne ernsthafte Taktstreuung haben Sie keine Chance.

Sie sagen "läuft mit 32 kHz". Du meinst das, oder willst du nur einen 32-kHz-Kristall verwenden? In letzterem Fall können Sie einige PICs (aber nicht diesen) mit einer höheren CPU-Taktfrequenz betreiben, indem Sie (vorübergehend) auf den internen 8-MHz-Oszillator umschalten.



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 2.0-Lizenz, unter der er vertrieben wird.
Loading...