AVR-Kopplung über I2C

Gespeichert von DL6GL am Mo., 27.01.2020 - 16:17
LCD Display

Der im September 2016 veröffentlichte gleichnamige Artikel zeigte einen ersten Ansatz auf, zwei AVR zu koppeln. Die Kopplung beschränkte sich darauf, vom I2C-Master Daten an einen Slave zu schicken. Nun soll auch der bislang stumme Slave ertüchtigt werden, mit dem Master ins Gespräch zu kommen und auf Anforderung Daten an den Master zu schicken. Die Interrupt-Steuerung übernimmt im Slave wie auch im Master für den Anwender unsichtbar den kompletten Ablauf.

Der erste Abschnitt gibt den ursprünglichen Artikel von 2016 wieder. In den Folgeabschnitten wird gezeigt, wie auch im Master eine Interrupt-Serviceroutine eingesetzt werden kann, die die von BASCOM gewohnten I2C-Befehle wie I2CStart, I2CStop, I2CWByte und I2CRByte durch lediglich zwei Befehle, TWI_MasterWrite und TWI_MasterRead, ersetzt. Alle weiteren I2C/TWI-spezifischen Aktionen sind dort für den Anwender unsichtbar untergebracht. Der Anwender muss sich nur noch um den Satz Eingabedaten für das Schreiben vom Master in den Slave und die Ausgabedaten vom Lesen aus dem Slave zurück zum Master kümmern.

Das Ziel ist also:

  • Den Anwender von allen I2C/TWI-spezifischen Funktionen abzuschirmen. Die Arbeit verrichten Interrupt-Serviceroutinen im Hintergrund. Im Master-Programm sind dazu nur zwei Aufrufe, TWI_MasterWrite und TWI_MasterRead, zu sehen.
     
  • Der Anwender lässt den Master eine Anzahl Bytes an den Slave schicken. Inhalt und Anzahl legt er fest - mehr nicht. Wenn er auch Daten vom Slave zurück haben will, kann er das in diesem Datensatz auf geeignete Weise festlegen. Der Master meldet die Erledigung.
     
  • Wenn im Slave festgelegt (programmiert) ist, wie auf bestimmte Master-Daten zu reagieren ist, kann dieser die vom Master gewünschten Daten zurückschicken. Der Anwender muss nur die Anzahl der erwarteten Daten festlegen - mehr nicht. Aus dem für die jeweilige Anwendung vorgesehenen Inhalt der Daten lässt sich dann eine Auswertung vornehmen, etwa Byte 4 bis 7 ergeben die Frequenz in Hertz als 4 Byte DWORD-Variable. So was in der Art.
     

Wohlgemerkt, der Slave ist wie der Master ein Mikrocontroller. Bei passiven I2C-Bausteinen wie z.B. EEPROM's oder ADC sind Art und Adressierung der Daten in der Bausteinspezifikation festgelegt. Der Slave muss erst entsprechend programmiert werden, damit er ein erwartetes Verhalten zeigt. Im Testprogramm in Abschnitt 3 addiert er eine 1 zu den empfangenen Daten und schickt sie wieder zurück, zu sehen im Aufmacherbild oben.

Master und Slave sind Mikrocontroller vom Typ ATmega, die über ein TWI-Interface verfügen. Bei ATtiny-Controllern müsste die USI-Schnittstelle bemüht werden. Das ist hier nicht vorgesehen.

Ein- und Ausgabedaten besitzen die gleiche Struktur als Byte-Array mit
Byte 1: Slave-Adresse, Bytes 2 … n: Nutzdaten, insgesamt n + 1 Bytes.
Die Slave-Adresse ist in einem Übertragungsprotokoll immer das erste Byte.

Die im Master und im Slave festgelegte Slave-Adresse, in den Programmbeispielen 0x78, modifizieren die o.g. TWI_MasterWrite und TWI_MasterRead passend zur Datenrichtung (Write, "W" bzw. Read ("R") entsprechend der I2C-Spezifikation:

  • TWI_MasterWrite, Master schreibt: Das R/W-Bit ist 0 ("W"),
  • TWI_MasterRead, Master liest: Das R/W-Bit ist 1 ("R").

I2C-Adressen sind maximal 7 Bit lang. Das R/W-Bit ergänzt das Adress-Byte als Bit 0 (LSB, Last significant Bit)). Wenn, wie hier, die Slave-Adresse gerade ist, bringt eine Schreib-(W-)Adresse 0x78 = B0111_1000 ein LSB = 0 schon mit. Die daraus abgeleitete Lese-(R-)Adresse mit LSB = 1 ist dann B0111_1001 = 0x79. Man könnte auch die Slave-Adresse im Adress-Byte um eine Position nach links schieben oder mit 2 multiplizieren, was aus's Gleiche hinausläuft, um das LSB frei zu bekommen. Sparen wir uns.

Mit dieser Schaltung wurden alle nachfolgenden Anwendungen realisiert.

Master-Slave schematics

Referenzen
[1]  https://www.mikrocontroller.net/topic/249639
[2]  https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591794
[3]  https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591792