Dies ist eine Referenzfrage. Ich habe einige Kommentare gelöscht, die dies weniger offensichtlich gemacht haben. (Die Frage wird vom Fragesteller beantwortet).
Nick Gammon
Antworten:
10
Dieses Tutorial, das ich auf der Embedded Linux-Konferenz gegeben habe, versucht, die Fragen zu beantworten. Es enthält Links zu einer detaillierteren Beschreibung der behandelten Themen und verwendet das praktische Beispiel für das Fahren einer 4WD-Drohne, bei der ein Arduino Mini Pro als Slave fungiert und die 4 unabhängigen Räder steuert . Das Originaldokument finden Sie hier .
Hinweis: Diese Antwort ist derzeit in Arbeit, da ich die Highlights aus dem Link anpasse.
Typische Anwendungen des I2C-Busses
Schnittstelle zu relativ langsamen Peripheriegeräten. Bsp.: Sensoren, mechanische Aktuatoren.
Steuerung „schneller“ Peripheriegeräte, die andere Kanäle für den Datenaustausch verwenden. Beispiel: Codecs.
In einem PC interagiert das Betriebssystem normalerweise über I2C mit:
Temperatur- und Batteriespannungsmesser;
Lüfterdrehzahlregler;
Audio-Codecs.
Wenn mehrere Buscontroller verfügbar sind, werden Peripheriegeräte nach Geschwindigkeit gruppiert, sodass schnelle nicht durch langsamere bestraft werden.
Eine kurze Einführung in die wichtigsten Funktionen des I2C-Busses
Serien Bus.
Nur 2 Leitungen: Serial CLock und Serial DAta (plus Masse).
Normalerweise 1 Master-Gerät und 1 oder mehr Slaves.
Die Kommunikation wird immer von einem Master-Gerät initiiert.
Auf demselben Bus können mehrere Master nebeneinander existieren (Multi-Master).
Open-Drain: Sowohl SDA als auch SCL benötigen Pull-up-Widerstände.
"Clock Stretching"
Der Master steuert SCL, aber ein Slave kann es gedrückt halten (weil offener Drain), wenn er die Geschwindigkeit anpassen muss.
Der Master muss nach diesem Szenario suchen.
Ein Slave kann stecken bleiben und den Bus blockieren: Es müssen Leitungen vom Master zum Slave zurückgesetzt werden.
In der Regel wird eine 7-Bit-Adressierung, aber auch eine 10-Bit-Adressierung unterstützt.
Logisches Protokoll: Die tatsächlichen Spannungspegel sind nicht angegeben und hängen von den einzelnen Implementierungen ab. Beispiel: 1,8 V / 3,3 V / 5,0 V.
Geringer Platzbedarf: Nur verwendeten Code / Daten verknüpfen.
Unterscheidung zwischen RTOS und BSP durch HAL.
GPLv3 für nichtkommerzielle Zwecke.
Aktiv entwickelt, aber schon ausgereift.
Unterstützt 8bit AVR.
Es gab jedoch eine eingeschränkte BSP-Unterstützung für AVR, das Fehlen von: - Interrupt-Treiber für AVR-GPIOs (hinzugefügt). - I2C-Unterstützung für den AVR-Slave-Modus (benutzerdefiniert). Was im Rahmen der Drone SW für den AVR separat entwickelt werden musste .
Kommunikationsparameter definieren
Für jedes Rad:
Arbeitszyklus des PWM-Signals, mit dem es angesteuert wurde - 1 Byte. 0xFF = maximales Drehmoment / 0x00 = kein Drehmoment.
Richtung Dreh - 1 Byte.
0x00 = Leerlauf
0x01 = umgekehrt
0x02 = vorwärts
0x03 = gesperrt
Durchschnittliche Zeitspanne zwischen den Steckplätzen des optischen Codierers - 2 Bytes.
Wenn Sie etwas schreiben, wird die Messung zurückgesetzt.
Buspiratenformat:
- [= Startbit -] = Endbit - r = Lesebyte - Adresszeiten 2 (Linksverschiebung 1) für R / W-Bit
Beispiel - im Buspiratenformat
[i2c_addr reg_addr = (Parameter, Rad) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
Antworten:
Dieses Tutorial, das ich auf der Embedded Linux-Konferenz gegeben habe, versucht, die Fragen zu beantworten. Es enthält Links zu einer detaillierteren Beschreibung der behandelten Themen und verwendet das praktische Beispiel für das Fahren einer 4WD-Drohne, bei der ein Arduino Mini Pro als Slave fungiert und die 4 unabhängigen Räder steuert . Das Originaldokument finden Sie hier .
Hinweis: Diese Antwort ist derzeit in Arbeit, da ich die Highlights aus dem Link anpasse.
Typische Anwendungen des I2C-Busses
Steuerung „schneller“ Peripheriegeräte, die andere Kanäle für den Datenaustausch verwenden. Beispiel: Codecs.
In einem PC interagiert das Betriebssystem normalerweise über I2C mit:
Wenn mehrere Buscontroller verfügbar sind, werden Peripheriegeräte nach Geschwindigkeit gruppiert, sodass schnelle nicht durch langsamere bestraft werden.
Eine kurze Einführung in die wichtigsten Funktionen des I2C-Busses
Referenz-URLs:
Beispiel für eine Buskonfiguration
Merkmale des Protokolls (vereinfacht)
Beispiel für Busverkehr
Benutzerdefinierte Slaves
Warum einen benutzerdefinierten I2C-Slave erstellen?
Wie entwerfe ich einen benutzerdefinierten I2C-Slave?
Design des I2C-Masters
Wichtige Designkriterien:
Debuggen: Teilen und Erobern
Übernehmen Sie die direkte Kontrolle über den Bus mit einem Ad-hoc-Gerät. Beispiele:
Snoop den Bus mit einem Logikanalysator oder einem Oszilloskop / Advanced Meter. Beispiele:
Verwenden Sie den Slave-spezifischen In Circuit Debugger / In Circuit Emulator.
Beispiel: AVR Dragon für AVR-Chips (Arduino UNO, Nano, Mini, MiniPro)
Bus Pirat
USB zu I2C Adapter
Sigrok und Pulsview
Sigrok-Logo (Bakend-Komponente)
Beispiel für die Pulsansicht (Visualizer)
Beispiel eines Low-End-Logikanalysators
Beispiel: Steuern einer 4WD-Drohne
Prototyp gebaut mit 2 Arduino Mini Pro.
Was macht der Sklave im Beispiel?
Der I2C-Slave:
Hochrangiges Blockdiagramm des I2C-Slaves.
Auswahl des Slaves: Arduino Mini Pro
Slave-spezifischer ICD: AVR Dragon
Auswählen des Betriebssystems: ChibiOS
Es gab jedoch eine eingeschränkte BSP-Unterstützung für AVR, das Fehlen von: - Interrupt-Treiber für AVR-GPIOs (hinzugefügt). - I2C-Unterstützung für den AVR-Slave-Modus (benutzerdefiniert). Was im Rahmen der Drone SW für den AVR separat entwickelt werden musste .
Kommunikationsparameter definieren
Für jedes Rad:
Arbeitszyklus des PWM-Signals, mit dem es angesteuert wurde - 1 Byte. 0xFF = maximales Drehmoment / 0x00 = kein Drehmoment.
Richtung Dreh - 1 Byte.
Durchschnittliche Zeitspanne zwischen den Steckplätzen des optischen Codierers - 2 Bytes.
Parameter Index - 1 Knabbern:
Radindizes - 1 Knabberzeug:
Unterprotokoll: Definieren der Register
Registerformat: 0xαβ - α = Parameterindex - β = Radindex
Adresse (willkürlich gewählt): 0x10
Buspiratenformat: - [= Startbit -] = Endbit - r = Lesebyte - Adresszeiten 2 (Linksverschiebung 1) für R / W-Bit
Beispiel - im Buspiratenformat
[i2c_addr reg_addr = (Parameter, Rad) reg_value]
Das Auto dreht sich im Uhrzeigersinn.
quelle