zurück

Interface zur Kommunikation mit I2C-Bausteinen über die serielle Schnittstelle

Diese Software auf Basis der Arduino-Umgebung ist entstanden, da ich auf die Schnelle die Kommunikation mit einem anderen Controller testen wollte und diesen auf elegante Art und Weise direkt ansteuern wollte. Hierzu hätte ich natürlich auch umständlich einen anderen Controller immer wieder mit neuen Befehlssequenzen füttern können und die Reaktionen betrachten, allerdings kann dieser kleine Helfer universell bei verschiedenen (zukünftigen) Projekten benutzt werden, ohne das die Software neu geschrieben werden muss. Die einzelnen I2C-Befehle können dann einfach über die serielle Schnittstelle vorgegeben werden.

Einführung und Überblick

Die Software für den Controller wurde in der Arduino-IDE 1.6.3 entwickelt und belegt auf meinem Zielsystem (ATmega168PA) 58% des Programmspeicherplatzes und 71% des Arbeitsspeichers. Die Kommunikation erfolgt über die serielle Schnittstelle mit 9600 Baud. Folgende Befehle sind in der aktuellen Version vorhanden:

Alle übermittelten Werte vom Controller sind derzeit in Hexadezimaler schreibweise (was auch so beibehalten werden soll), jedoch ist die Eingabe bislang auf das dezimale Zahlenformat beschränkt. Dies soll jedoch in einer zukünftigen Version verbessert werden, so dass ein einheitliches Aussehen gewährleistet wird.
Alle Eingaben werden durch ein Linefeed ("\n") bestätigt.

Beispiele

Im folgenden wird die Benutzung der Software anhand einiger Beispiele dargestellt.

Scan nach vorhandenen Busteilnehmern

In diesem Beispiel soll nach vorhandenen Busteilnehmern am I2C-Bus gescannt werden. Hierzu wird als Befehl ein "s" geschickt und mit einem Linefeed "\n" die Eingabe bestätigt. Die Software probiert daraufhin alle 127 möglichen Adressen durch und schaut ob ein Teilnehmer für die jeweilige Adresse antwortet. Ist ein Teilnehmer für eine Adresse gefunden, so wird dies mit einem X in der anschließend gezeichneten Tabelle markiert.

>s
   _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F
0_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
1_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
2_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
3_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
4_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
5_  X  -  X  -  -  -  -  -  -  -  -  -  -  -  -  -
6_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
7_  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
>

Hier sind zwei Busteilnehmer angeschlossen. Es handelt sich hierbei um zwei serielle EEPROM-Bausteine vom Typ 24C32 mit den Adressen 0x50 (80) und 0x52 (82).

Beschreiben und Auslesen eines seriellen EEPROMs

In diesem Beispiel sollen zunächst einige Daten in ein serielles EEPROM vom Typ 24C32 geschrieben werden. In einem zweiten Schritt werden die geschriebenen Daten wieder ausgelesen.
Um Daten in das EEPROM zu schreiben muss diesem zunächst eine Adresse mitgeteilt werden an welcher die Daten hinterlegt werden sollen und anschließend das Byte (oder ein Block von 32 Bytes), welches geschrieben werden soll. Die Adresse ist ein 16-Bit-Wert und muss daher in zwei Bytes aufgeteilt werden. Als Bytereihenfolge ist hierbei Little-Endian zu wählen! Hier werden nun vier Bytes nacheinander in das EEPROM an die Adressen 0-3 geschrieben:

>w 80 0 0 202
>w 80 0 1 254
>w 80 0 2 186
>w 80 0 3 190
>

Um Daten die gerade geschriebenen Daten zu kontrollieren sollen diese nun ausgelesen werden. Hierzu teilen wir dem EEPROM die Startadresse des Lesevorganges mit (Achtung: Bytereihenfolge beachten!) und anschließend wird der Lesevorgang initiiert und die Anzahl der auszulesenden Bytes angegeben.

>w 80 0 0
>r 80 0 0 4
Ausgabe: CA FE BA BE
>

Hier haben wir nun unsere vier zuvor geschriebenen Bytes ausgelesen und bekommen diese in hexadezimaler Schreibweise angezeigt.

Download

Die Software werde ich demnächst an dieser Stelle veröffentlichen.