Welche Kompromisse und Verbindungsoptionen gibt es bei der kostengünstigen bidirektionalen Kommunikation zwischen nur zwei Mikrocontrollern?
In diesem Fall:
Zu den offensichtlichen Optionen gehören SPI, CAN, USB, TTL Level Serial. I2C und 1-Wire sind wahrscheinlich zu langsam. Aufgrund des Problems der Pinanzahl wäre das Modulieren der Stromversorgung für Daten ideal, wenn es einen Chipsatz auf Verbraucherebene gäbe, der dies tun würde, wodurch zwei Pins gegenüber den seriellen Methoden eingespart würden.
Angesichts Ihrer verfügbaren Optionen scheinen einige Pins verfügbar zu sein :
Es sieht also so aus, als ob der Konsens 2 Pins beträgt, wenn Sie eine bidirektionale Kommunikation wünschen, oder möglicherweise 3 für SPI. Bei gleicher Pin-Anzahl würde ich mich für den UART entscheiden, wenn auf beiden Chips einer verfügbar ist. Unter der Annahme einer 1:1-Verbindung können Sie Daten ohne Rücksicht auf Timing oder Kollisionen einfach hinüberwerfen, und die Hardware ist wirklich einfach.
Was den Stack-Overhead betrifft, gibt es viele verschiedene Protokolle, die von einem UART aus betrieben werden können, aber in diesem Fall ist es wahrscheinlich am besten, Ihr eigenes zu definieren. Aus der Perspektive der Kommunikation spucken Sie nur Bytes aus und empfangen sie am anderen Ende. Die Hardware synchronisiert sich automatisch mit jedem Byte, aber Sie müssen immer noch wissen, welches Byte was ist. Sie werden dieses Problem haben, unabhängig davon, welche Option Sie wählen.
Wenn Sie mit einem UART schlau sind (und ich werde Ihnen gleich die Antwort geben), können Sie die beiden TX-Pins mit zwei Widerständen in Reihe verbinden und dann an jedem Ende einen Komparator haben, der den RX-Pin basierend auf ansteuert lokalen TX und dem Mittelabgriff der beiden Widerstände. Dies ermöglicht Vollduplex auf einem Draht. Siehe unten für ein Schema.
Fügen Sie für ESD einen Vorwiderstand in beiden Gehäusen für jeden Pin hinzu und setzen Sie einige Klemmdioden auf die Außenseite des Widerstands. Dafür gibt es spezielle Dioden.
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
So funktioniert das:
In allen Fällen entspricht also der Ausgang des empfangenden Komparators dem sendenden TX.
Wenn Ihnen die Hardware-Komplexität in der Box nicht gefällt, können Sie einen diskreten Pin für jede Richtung verwenden und nur die "High"- und "Low"-Widerstände und ESD-Dioden behalten - eine separate Kopie für jeden Pin.
Ich habe noch nie CAN-Bus verwendet, daher kann ich dazu nichts sagen. Bleibt SPI, I2C, TTL seriell und USB.
TTL-Seriell wird normalerweise mit 115.200 Baud getaktet, aber viele Mikrocontroller können es mit 1 Mb / s oder höher ausführen. Sie müssen die Datenblätter Ihres Mikrocontrollers überprüfen und sehen, ob Sie ihn so schnell ausführen können. Offensichtlich müssen beide Enden übereinstimmen. Der Vorteil von TTL Serial besteht darin, dass nur zwei Drähte benötigt werden.
I2C war ursprünglich auf 100 Kb/s begrenzt, dann auf 400 Kb/s. Der neueste Standard ist 1 Mb/s. Aber es ist möglich, dass Ihr Mikrocontroller höher getaktet wird. Überprüfen Sie erneut Ihre Datenblätter. Wie bei TTL Serial benötigt I2C nur zwei Drähte.
SPI ist eine ganz andere Rasse. Theoretisch kann es bis zu 50 Mb/s oder so laufen. Ich habe eine mit einer SD-Karte in einem kommerziellen Produkt mit 25 Mb / s ohne Probleme betrieben. Der Nachteil ist, dass die SPI-Schnittstelle vier Drähte benötigt. Mit nur einem Slave am Bus brauchen Sie die Chip-Select-Leitung eigentlich nicht, es sei denn, sie wird von der Hardwareschnittstelle benötigt. Wenn Sie nur Daten an den Slave senden, können Sie möglicherweise auch die MISO-Leitung entfernen, wenn der Mikrocontroller Sie als GPIO-Pin neu zuweisen lässt. In dem Fall, dass Sie wie die anderen nur noch zwei Drähte haben.
Der Firmware-Overhead für die ersten drei ist minimal; TTL seriell ist wahrscheinlich das einfachste. I2C und SPI sind ungefähr gleich.
Sie können USB vergessen, obwohl es möglicherweise am schnellsten ist, wenn Sie USB 2.0 ausführen. (USB 1.1 ist nur 12 Mb/s, also ist es nicht einmal günstig mit SPI, was die Geschwindigkeit betrifft.) Das erste Problem mit USB ist, dass Sie einen Host auf der einen Seite und einen Slave auf der anderen Seite implementieren müssen. Dies erfordert Mikrocontroller, die über die Schnittstellen verfügen, und USB-Host-Schnittstellen sind im Allgemeinen nur auf ziemlich hochwertigen Chips zu finden. Dann ist da noch die erforderliche Firmware. Mehrere kB Firmware. Die gute Nachricht ist, dass Sie im Allgemeinen eine Bibliothek vom Hersteller erhalten können. Die schlechte Nachricht ist, dass es noch Wochen dauern wird, bis es funktioniert.
An den Schnittstellen müssen Sie für einen ESD-Schutz sorgen. Es gibt viele billige Chips, die diese Funktion ausführen, wie den TPD4E1B06 für 61 ȼ bei Digi-Key.
Haben Sie UART in Betracht gezogen? Für die unidirektionale Kommunikation wird nur ein Draht benötigt. Wenn Sie große Datenmengen senden, können Sie schlau werden und den einzelnen Draht nach einigen erfundenen Regeln zwischen TX und RX wechseln lassen. Sie können Ihr eigenes Protokoll erstellen, um Fehlerkorrekturen, Buskonflikte usw. zu handhaben. Das Schöne ist, dass selbst die billigsten MCUs einen eingebauten UART haben (dasselbe gilt nicht für USB oder CAN).
Wenn Sie nachsehen, können Sie wahrscheinlich Stromversorgungsmodulationsschemata finden, aber ihre Datenraten werden wahrscheinlich viel langsamer sein.
Basierend auf Ihrer Aussage "Aufgrund des Problems der Pinanzahl wäre die Modulation der Stromversorgung für Daten ideal, wenn es einen Chipsatz auf Verbraucherebene gäbe, der zwei Pins gegenüber den seriellen Methoden einspart", klingt es jedoch nach 1-Draht - Kommunikation liefert Daten mit niedriger Geschwindigkeit und Sie geben nicht an, was Ihre Geschwindigkeitsanforderung sein könnte.
Ich sehe wenig Sinn in einem Master/Slave-System mit nur zwei µC, die beide selbst programmiert werden.
Die kleinste Pinbelegung, die Sie bekommen können, ist wahrscheinlich UART (2 Pins). Da Sie beide µCs programmieren, können Sie eine beliebige Geschwindigkeit wählen. Ein AVR-µC könnte UART mit 1 Mbit/s ausführen, und wenn Sie 1 Stoppbit, keine Parität und 9 Datenbits wählen, können Sie eine Bandbreitennutzung von 82 % erzielen.
Sie können jederzeit ein benutzerdefiniertes Protokoll ähnlich wie 1-Wire (aber viel schneller) bitbangen. Dies ist jedoch ein ziemlich dummer Ansatz, da er Ihre gesamte Rechenleistung für die Aufrechterhaltung des Protokolls verbrauchen würde.
TLDR: Nicht besonders billig, aber in einigen Anwendungsfällen zuverlässig geeignet.
Wenn Sie über den Tellerrand hinausblicken, gibt es hier möglicherweise einige andere Lösungen, z. B. den folgenden Chip, auf den ich in letzter Zeit gestoßen bin. Natürlich hängt alles davon ab, was Sie tun möchten. Etwas wie UART kommt einem in den Sinn, wenn Sie beide MCUs auf derselben Platine haben oder sogar planen, sie manuell vor ESD zu schützen, wenn sie getrennt sind.
Master- und Device-Lösung für IO-Link-Anwendungen
L6360 Master
L6362A Device
Wann würden Sie eine Lösung wie diese in Betracht ziehen:
Vcc(in) 7~30v, Vdd(out) 3.3/5v
Es klang für mich interessant, also dachte ich, ich werde es veröffentlichen.
Lorenzo Donati unterstützt die Ukraine
KyranF
Bryce
Bryce
KyranF