Serielles I2C Interface

DH1AAD ,Ingo Gerlach , 20.02.2001, e-Mail : E-Mail bitte an:Ingo Gerlach


Info

Hier kommt nun, quasi als Ergänzung zum parallelen I2C Interface aus Elektor 10/2000, die serielle Variante.
Die Entwicklung erschien sinnvoll, da heutige PC's meist über PS/2 Anschlüsse für Tastatur und Maus verfügen und daher also sogar zwei serielle Schnittstellen zur Verfügung stehen, der Paralellport aber oft durch einen Drucker belegt ist. Softwareseitig liegt der Schwerpunkt hier allerdings auf Linux. Die Software ist so ausgelegt, das sowohl das serielle als auch das parallel Interface unterstützt werden.

1.0 Schaltungsbeschreibung

Die Schaltung ist einfach aufgebaut. Ein MAX RS 232, oder kompatibler Baustein, sorgt für die
korrekten Signale an der seriellen Schnittstelle, so das auch Notebooks,
die ja mitunter Probleme mit zu niedrigen Pegeln an der seriellen Schnittstelle haben, ohne Probleme mit diesem
Interface zusammen arbeiten sollten.

Um eine sichere Erkennung des Adapters durch die Software zu gewährleisten, sind die Signale
DCD (Pin 1) und DSR (Pin6) miteinander verbunden. Dies wird durch die Treibersoftware bei der Initialisierung abgefragt.
Nach dem MAX RS232 stehen die Signale der seriellen Schnittstelle mit TTL Pegel zur Verfügung.
Die Beschaltung mit den Gattern 7406 A-D gleicht dem des parallelen Interface und stellt eine bidirektionale Kommunikation zwischen dem Adapter und den angeschlossenen I2C-Komponenten dar.

Wenn man für den Eingang eine 9 pol Sub-D Buchse verwendet, kann die Verbindung zur PC-Schnittstelle mit einer günstigen "Seriellen Mausverlängerung" realisiert werden.
Als Ausgang bietet sich dann ein 9 pol Sub-D Stecker an, wenn man neben den Signalen SDA / SCL auch noch die Betriebsspannung von 5 V mit herausführt , können kleinere Schaltungen direkt versorgt werden.

2.0 Windows-DLL / Linux C & Perl-Module

Um das serielle Interface als auch die parallele Version anzusteuern, stehen diverse Softwareschnittstellen zur Verfügung.

Im Einzelnen sind dies:

I2C_SER.DLL
I2C_PAR.DLL Win95/98
i2c_ser.pm
i2c_lpt.pm Perl Module für Linux

Sowie die einzelnen Header Files für C unter Linux.

Da diese Funktionen "C"-Funktionen "outp" und "inp" basieren, die direkt auf die Hardware zugreifen, funktionieren die DLL's nur unter den Betriebssystemen Windows 95 & Windows 98. Unter Windows NT/ME/2000 geht dies nicht, da hier der direkte Zugriff auf die Hardware mit diesen Funktionen verweigert wird.
Unter Linux ist der Zugriff über die Funktion "ioperm" möglich, was aber root Rechte voraussetzt.
Eine genaue Beschreibung der Funktionen, Windows / Linux, sowie deren Einsatz und einige Beispiele, findet sich in der Datei i2c_funcs.html

2.1 Installation

Windows (95/98)

Legen Sie als erstes einen neuen Ordner I2C an. Kopieren Sie nun die Datei i2c-01.zip in diesen Ordner und enpacken sie dort. Die DLL's befinden sich im Verzeichnis \LIB. Um sie einsetzen zu können, ist es erforderlich das die DLL's auch zur Laufzeit gefunden werden. Kopieren Sie daher die DLL's in das Windows System Verzeichnis.
Die DLL's wurden mit Microsoft Visual C 4.2 erstellt. Die entsprechenden Workspaces sind unter \LIB\i2c_ser und \LIB\i2c_par zu finden. Die Quellen dazu unter \i2c_ser , \i2c_par, \src , \lcd und \pcf8574.

Windows NT / 2000 (Ohne Gewähr ! :))

Ich hatte hier von jemanden einen Link (http://www.zealsoftstudio.com/ntport/) bekommen, wie auch unter NT und W2K der Zugiff erfolgen kann, daher habe ich die Lib etwas umgestellt. Da ich hier aber weder NT noch W2K habe, konnte ich es selber nicht testen. Es soll aber funktioniert haben. Wer es selber probieren möchte, lade sich i2c-01_nt.zip herunter. Unter dem oben genannten Link muss man sich aber vorher die Software holen und installieren.

Linux

Legen Sie als erstes einen neuen Ordner /opt/i2c an. Kopieren Sie nun die Datei i2c-0.2.tar.gz in diesen Ordner und enpacken sie dort folgendermassen:

gzip -d i2c-0.1.tar.gz
tar -xvf i2c-0.1.tar

Anschliessend noch INSTALL eingeben um die Sourcen zu kompilieren und die Perl-Module zu erstellen. Die man-Pages zu den Perl-Modulen können mit "man i2c_ser" bzw. "man i2c_par" angezeigt werden. Sollte ein anderes Verzeichnis als /opt/i2c verwendet werden, ist es erforderlich den Eintrag "HDIR= /opt/i2c/" im Makefile unter /src anzupassen. Ein funktionsfähiges Perl muss allerdings auf dem Rechner installiert sein !

3.0 Anwendungsbeispiel

Als kleines Anwendungsbeispiel soll hier kurz die Ansteuerung eines LC Displays dargestellt werden.
Diese Schaltung entspricht der ursprünglich im Elektor Buch "I2C Bus angewandt" vorgestellten Idee, allerdings mit einer geringfügig geänderten Beschaltung.

C

#include "i2c_lpt.h" // i2c Funktionen für par. Schnittstelle

int LPT = 0;
int test;

set_port_delay(5);	// Portdelay 1-25 25 ..langsam
iport = init_iic(LPT);	// Init ii2c , Interface automatisch suchen an LPTx

if (iport>0) 
{
printf(" gefunden an Port 0x%03xh! \n",iport);
} else {
printf("Interface nicht gefunden.\n");
exit (2);
}

test=lcd_init();
lcd_backlight(0); // Ausschalten (gibt 1 zurück wenn, OK)
lcd_wchar('H'); // Einzelnes Zeichen schreiben 
lcd_wchar('a');
lcd_wchar('l');
lcd_wchar('l');
lcd_wchar('o');
lcd_instr(LCD_CLR);	// Display Anzeige löschen 
lcd_write_str("Hallo DISPLAY!!"); // String schreiben

Perl (Ansteuerung seriell Schnittstelle)

use i2c_ser;
my $iport = i2c_ser::init_iic(0); # Interface automatisch suchen
print "Suche Interface...\n";
if ($iport > 0) { 
 print "I2C-Interface gefunden an $iport; }
 else { print "I2C-Interface nicht gefunden. \n"; 
        exit 1;   
 } 
 print "LCD : Display Initialisieren..\n";
 i2c_ser::lcd_init();
 $licht = i2c_ser::lcd_backlight(1);
 print "LCD : Licht an \n";
 i2c_ser::lcd_instr(0x0c);
 print "LCD : Cursor Off \n";
 $lcdadr=i2c_ser::lcd_get_adress();
 print "LCD : Der Cursor ist jetzt an Adresse $lcdadr \n";
 i2c_ser::lcd_wchar(ord(H));
 i2c_ser::lcd_wchar(ord(a));
 i2c_ser::lcd_wchar(ord(l));
 i2c_ser::lcd_wchar(ord(l));
 i2c_ser::lcd_wchar(ord(o));
 $lcdadr=i2c_ser::lcd_get_adress();
 print "LCD : Der Cursor ist jetzt an Adresse $lcdadr \n";
 i2c_ser::lcd_instr(0x01);
 i2c_ser::lcd_write_str("Hallo Display");
 print "LCD : Ausgabe mit lcd_write_str \n";

Visual Basic

Private Sub Init_Click()
Dim Port As Integer
set_port_delay (5)
Port = init_iic(0)
Call lcd_init
lcd_backlight (1)
lcd_write_str ("Hallo LCD!")
txt = Space(25)
End Sub

Verwendete Literatur:


© Ingo Gerlach, DH1AAD, 15.02.2002
E-Mail bitte an:Ingo Gerlach
free web counter