Kostengünstige einfache Kommunikation zwischen zwei Mikrocontrollern

Welche Kompromisse und Verbindungsoptionen gibt es bei der kostengünstigen bidirektionalen Kommunikation zwischen nur zwei Mikrocontrollern?

In diesem Fall:

  • Master/Slave-Beziehung, bidirektionaler Datenfluss
  • Entfernung unter einem Zoll
  • Slave wird in den Master gesteckt (also ESD-Schutz an den Anschlüssen ist ein Muss).
  • Das Slave-Mikro ist ziemlich dumm, aber für Block-I/O von einer SD-Karte werden Daten mit mittlerer Geschwindigkeit benötigt. Abgesehen von der SD-Karte gibt es auf der Slave-Einheit ein wenig I/O mit niedriger Geschwindigkeit, bei dem die Geschwindigkeit keine Rolle spielt.
  • Billig billig billig.
  • Pin-Anzahl ist beschränkt.
  • Bevorzugen Sie einen minimalen Protokollstapel-Overhead.

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.

Was meinst du mit "Daten mit mittlerer Geschwindigkeit"? Haben Sie eine Größenordnung im Sinn? 100kbit/s? 1 MB/s? Haben Sie Einschränkungen, welche MCU Sie verwenden möchten/müssen? Wenn Sie Master/Slave sagen, möchten Sie die bidirektionale Übertragung unterstützen? Oder wollen Sie einfach nur Daten auf den dummen Slave "werfen", ohne irgendeine Form von Fehlerkorrekturschema oder Feedback?
„low cost“ und „simple“ und „modulating the power supply“ passen nicht zusammen. Ich habe an differentiellen Manchester-codierten seriellen Daten über eine 12-V- und GND-Stromversorgungsverbindung gearbeitet, und es macht weder in der Software noch in der Hardware Spaß, also kümmern Sie sich nicht einmal um diesen Weg!
@LorenzoDonati Mit "Daten mittlerer Geschwindigkeit" meine ich das Speichern codierter Videos auf einer SD-Karte, also vielleicht 5 MB / s.
@KyranF Das Modulieren der Stromversorgung würde nur funktionieren, wenn es einen in China hergestellten IC gäbe, der alles handhabt.
Fair genug. Es gibt wahrscheinlich einen, der dies teilweise tut, sich aber dennoch auf viele benutzerdefinierte externe Schaltkreise verlassen würde

Antworten (6)

Angesichts Ihrer verfügbaren Optionen scheinen einige Pins verfügbar zu sein :

  • SPI ist Vollduplex und erfordert 1 Takt + 1 Daten pro Richtung + 1 optionale Chipauswahl = 3 Pins
  • CAN ist Halbduplex und erfordert 2 Daten für bidirektionale Kommunikation = 2 Pins
  • USB ist Halbduplex und erfordert 2 Daten für bidirektionale Kommunikation = 2 Pins
  • TTL Serial ist alles, was Sie wollen, aber die meisten Leute verwenden einen UART dafür, erfordert 1 Daten pro Richtung = 2 Pins Vollduplex oder 1 Pin mit einigen Tricks
  • UART ist Vollduplex und erfordert 1 Daten pro Richtung = 2 Pins oder 1 Pin mit etwas Trickserei
  • I2C ist Halbduplex und benötigt 1 Takt + 1 Daten = 2 Pins

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.


schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

  • Die "niedrigen" Widerstände sollen die ESD-Dioden schützen. Datenblätter können behaupten, dass sie unnötig sind oder nicht, aber ich würde sie trotzdem verwenden. Machen Sie sie gerade groß genug, um ihre Arbeit zu erledigen; Sie müssen im Vergleich zu den "hohen" Widerständen wie ein Kurzschluss aussehen.
  • Die "hohen" Widerstände sollen die beiden TX-Signale auf dem gemeinsamen Draht mischen.
  • Die 10k- und 5k-Widerstände sollen das TX-Signal über den gesamten Versorgungsbereich aufnehmen und den entsprechenden Schwellenwert für die Komparatoren bereitstellen.
  • Wenn die beiden Geräte unabhängig voneinander mit Strom versorgt werden, sollten Sie wahrscheinlich nicht die "Optionale Verbindung" haben, sodass Sie 2 statt 3 Drähte haben. Ich sehe nicht, wie Sie überhaupt mit weniger Pins kommunizieren können, es sei denn, Sie gehen drahtlos .

So funktioniert das:

  • Wenn beide TX hoch sind, wird die gemeinsame Leitung hoch sein und beide Komparatoren werden hoch ausgeben.
  • Wenn beide TX's niedrig sind, wird die gemeinsame Leitung niedrig sein und beide Komparatoren werden niedrig ausgeben.
  • Wenn ein TX hoch und der andere niedrig ist, liegt die gemeinsame Linie im mittleren Bereich und jeder Komparator hat einen anderen Schwellenwert, basierend auf seinem lokalen TX. Der mit einem hohen TX hat also einen höheren Schwellenwert als der gemeinsame Mittelbereich und gibt einen niedrigen Wert aus, und der mit einem niedrigen TX hat einen niedrigeren Schwellenwert als der gemeinsame Mittelbereich und gibt einen hohen Wert aus.

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.

Geben Sie hier die Bildbeschreibung ein

Über CAN: Es ist ein Bussystem wie I²C. Während I²C für die Kommunikation auf einer Platine ausgelegt ist, erlaubt CAN bis zu 2 km Entfernung. Daher hat es viel Protokoll-Overhead, da eine CAN-Nachricht bis zu 64 Datenbits enthält, aber auch etwa 50 Bits für Nachrichten-ID, Adresse, CRC und so weiter. I²C "verschwendet" auch einige Bits für die Adressierung, aber nicht so viel. Es kann auch etwas Programmieraufwand hinzufügen. Also definitiv kein CAN hier!
61 Cent sind auf dem erforderlichen Niveau nicht billig. Mit Pick and Place sehen einzelne Zender billig aus.

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.

Geschwindigkeitsanforderung oben hinzugefügt, die durch die SD-Kartenanforderung gesteuert wird.

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

Geben Sie hier die Bildbeschreibung ein

Wann würden Sie eine Lösung wie diese in Betracht ziehen:

  1. Die Frontier-Chips sind vollständig geschützt, was wichtig wäre, wenn Sie jede MCU auf einer separaten Platine haben und mit freiliegenden Pins, z. B. Schraubklemmen, umgehen.
    • Umgekehrte Polarität
    • Überlast mit Abschaltfunktion
    • Übertemperatur
    • Unterspannung und Überspannung
    • GND und VCC offener Draht
  2. Interoperabilität. Wenn jemand anderes die andere Seite entwerfen soll, muss er nur wissen, wie er die Daten über IO-Link leitet.
  3. Integrierter ReglerVcc(in) 7~30v, Vdd(out) 3.3/5v

Es klang für mich interessant, also dachte ich, ich werde es veröffentlichen.