I2C und SPI, wenn sie dieselbe Verbindung teilen, gibt es einen Konflikt oder nicht

Wir haben ein Produkt, das PIC18F4520 verwendet, und wir haben einige Geräte wie LCD-Treiber usw. verwendet, die alle den I2C-Bus verwenden, um mit dem Mikro zu kommunizieren. Aber jetzt wollen wir ein paar AD5504 hinzufügen , das ist ein DAC mit einer SPI-Schnittstelle. Wir haben jetzt eine Frage, ob sie die gleiche Verbindung mit dem I2C-Bus teilen könnten oder nicht.

Hast du einen guten Vorschlag dazu?

Wenn ich es richtig verstanden habe, möchten Sie den SCL als SPI-Takt, den SDA als MOSI wiederverwenden und zwei weitere Pins vom PIC als CS und MISO reservieren?

Antworten (4)

Eine andere Option wäre die Verwendung eines SPI-zu-I2C-Bridge-Chips. Dies würde Ihnen im Wesentlichen ermöglichen, eine Chipauswahl für Ihren gesamten I2C-Bus hinzuzufügen. Eine solche Option ist unten dargestellt.

http://www.silabs.com/products/interface/spitoi2c/Pages/default.aspx

Ein I2C-Gerät ignoriert stillschweigend alles, was auf dem Bus passiert, bis es eine fallende Flanke auf SDA sieht, während SCK hoch ist, gefolgt von acht Low-High-Low-Zyklen von SCK, während derer sich SDA nie ändert, während SCK hoch ist, und wo SDA schaltet Zustand bei bestimmten Übergängen, während SCK niedrig ist. Daher kann ein I2C-Gerät sicher einen Bus mit Geräten teilen, die ein anderes Protokoll verwenden, wenn garantiert werden kann, dass die obige Abfolge von Ereignissen niemals auftritt, außer wenn versucht wird, mit dem I2C-Gerät zu kommunizieren.

Es wäre möglich (und überhaupt nicht schwierig), eine "Bit-Bang"-Software-SPI-Implementierung zu haben, die sicherstellt, dass die obige Abfolge von Ereignissen niemals auftritt. Hardware-SPI-Implementierungen lassen jedoch häufig eine solche Garantie nicht zu. Typischerweise ändert sich die Datenausgabe konstruktionsbedingt entweder zur gleichen Zeit, wenn die Uhr ansteigt, oder zur gleichen Zeit, wenn die Uhr fällt. Wenn die Datenleitung ihren Zustand nach der ansteigenden Flanke der Taktleitung oder vor deren abfallender Flanke ständig ändern würde, bestünde keine Möglichkeit, dass SPI-Daten mit einer I2C-Start- und Adressierungssequenz verwechselt werden. Wenn sich die Signale jedoch gleichzeitig ändern, wäre es möglich, dass ein I2C-Gerät einige Übergänge vor der Taktflanke und andere danach sieht, so dass sie als I2C-Adressfolge interpretiert werden.

Supercat, sehr interessant, werde ich bald ausprobieren. aber wir haben das mikro schon auf neuproduktion umgestellt.danke trotzdem.

Wenn dieses AD5504-Ding (Sie haben keinen Link angegeben) ein anderes IIC-Gerät ist, sollte alles in Ordnung sein. Wenn es etwas anderes ist, wie SPI, dann nein, das wird nicht funktionieren. Ein SPI-Gerät kann dazu gebracht werden, MISO und MOSI zu ignorieren, indem es seine Slave-Auswahl nicht bestätigt, aber ein IIC-Gerät wird durch normale MISO- und MOSI-Signale auf den SCL- und SDA-Leitungen sehr verwirrt. Das hätte schon ein flüchtiger Blick auf die IIC-Spezifikation ergeben.

Ja, es sieht so aus, als ob sich SCK und SCL Pins auf diesem PIC teilen.
danke, es ist sehr hilfreich. Aber wie können wir die Probleme herausfinden, wir wollen den Code nicht zu sehr ändern, die Arbeit weniger machen und das Geld sparen :)
Machen Sie das eine oder andere in der Firmware, vorausgesetzt, der Prozessor ist in beiden Fällen der Master. Beide sind ziemlich einfach, aber SPI ist wahrscheinlich einfacher in Firmware zu implementieren. Wirklich, das ist ganz einfach. Auf diese Weise können Sie beliebige Pins für den in der Firmware implementierten Bus verwenden.
Danke, Olin Lathrop, wir werden den PIC18F4520 auf PIC18F46K22 umstellen, der 2 I2C- und 2 SPI-Schnittstellen hat, ist es ein guter Weg oder nicht. bitte beraten. Danke noch einmal! Qing

Möglicherweise können Sie eine der Schnittstellen durch einen Allzweck-E / A-Pin bitbangen, wobei die Spezialfunktions-Pins für die andere Schnittstelle verbleiben.

Möglicherweise können Sie eines der Signale - insbesondere die Uhr - mit etwas steuern, das durch einen Ausgangsstift aktiviert wird, sodass es den Chip nicht erreicht, der derzeit nicht das Ziel ist.

Sie könnten versuchen, Peripheriegeräte zu finden, die alle dieselbe Schnittstelle verwenden.

Im Extremfall können Sie ein zweites Mikro als Slave hinzufügen, um als Formatkonverter zu fungieren. Das ist nicht zu teuer, was die Teile betrifft, aber es bedeutet, dass ein anderes Programm gewartet und in jedes Gerät in der Produktion geladen werden muss.

Bit-Banging SPI ist für mich einfacher als Bit-Banging I2C, wenn Sie diese Wahl treffen müssen.
@ScottSeidman ja, das wäre logisch, es sei denn, der SPI muss viel mehr oder mit einer höheren Taktrate verwendet werden.
Wenn der SPI schnell sein müsste, würde ich mir wahrscheinlich alle Mühe geben, einen Controller mit zwei MSSPs zu finden, oder härter arbeiten, um Peripheriegeräte zu bekommen, die denselben Bus verwenden. Ich mag die Idee einfach nicht, I2C zu schlagen, besonders wenn das Peripheriegerät die Uhr dehnt (obwohl es keinen großen Grund dafür geben sollte, wenn Ihre Rate Bit-Bang-begrenzt ist).