Sie sind auf Seite 1von 12

IC-Bus

Dokumentation zum Versuch 3 in der Lehrveranstaltung Embedded Networking im WS 2011/2012 Hochschule

Tatiana W. Daniel B.

IC-Bus

Inhalt

Allgemeines Startbedingung Stoppbedingung Acknowledge Adressierung Datenbertragung Ansteuerung LCD

3 4 5 6 7 8 9

Anhang

11

Embedded Networking - WS 2011/2012

Seite 2

IC-Bus

Allgemeines

Der IC (Inter Integrated Circuit)-Bus ist ein serieller Zweidrahtbus. Er wurde in den 1980er Jahren von Philips entwickelt. Ziel dieser Entwicklung war die Verbindung/Kommunikation verschiedener integrierter Schaltkreise (ICs). Der IC-Bus arbeitet nach dem Master-Slave-Prinzip, wobei jedoch jeder Teilnehmer Sender oder Empfnger sein kann. Fr die Kommunikation werden nur 2 Leitungen bentigt: die Taktleitung SCL (Serial Clock Line) und die Datenleitung SDA (Serial Data Line). Ein Vorteil des IC-Busses ist seine einfache Ansteuerung. Da keine festen Taktzeiten eingehalten werden mssen, knnen sowohl langsame als auch schnelle Teilnehmer an den Bus angeschlossen werden. Bei einer Buslnge von ca.5 m wurden ursprnglich max. 100kBit/s bertragen. Adressen der einzelnen Teilnehmer waren 7 Bit lang. In einer 1.Spezifikation (1990) wurde der Adressraum auf 10 Bit erweitert und die bertragungsrate stieg auf 400 kBit/s. Seit der Spezifikation 2.1 im Jahr 2000 betrgt die max. bertragungsrate 3,4 MBit/s. Einsatzbereiche des Ic-Busses sind Audio- und Videoverarbeitung, Telekommunikation, industrielle Steuerungen, automotive Systeme, Sensorik

Die Datenbertragung geschieht byteweise, wobei das MSB, das hchstwertige Bit, als erstes bertragen wird. Um ein Bit als gltig zu werten, muss SCL High sein, whrenddessen sich SDA nicht ndern darf. Um eine 1 zu bertragen, muss SCL High und SDA High sein:

Um eine 0 zu bertragen, ist SCL High und SDA Low.

Embedded Networking - WS 2011/2012

Seite 3

IC-Bus

Die Startbedingung
Jede Datenbertragung muss vom Master (Sender) den anderen Teilnehmern angezeigt werden. Dafr wird eine Startbedingung erzeugt: whrend SCL auf High ist, wechselt SDA von High auf Low:

void Start_Condition (void) { //Initialisierung DDRB = 0b00000000; PORTB = 0b00000000; sda_an(); scl_an(); _delay_ms(15); sda_aus(); _delay_ms(5); scl_aus(); }

Embedded Networking - WS 2011/2012

Seite 4

IC-Bus

Die Stoppbedingung

Das Ende der bertragung wird durch eine Stoppbedingung vom Master angezeigt. Dabei bleibt SCL auf High und SDA wechselt von Low auf High:

Dadurch signalisiert der Master, dass er keine weiteren Daten senden oder empfangen will.

void Stopp_Condition (void) { sda_aus(); scl_an(); _delay_ms(10); sda_an(); _delay_ms(10); }

Embedded Networking - WS 2011/2012

Seite 5

IC-Bus

Die Besttigung des Empfangs


Der Empfang eines Bytes muss durch den Empfnger mit einem Acknowledge besttigt werden: Nach dem Empfang von 8 Bits zieht der Empfnger SDA auf Low bis vom Master der 9. Takt erzeugt wird.

Durch dieses Acknowledge wird dem Sender signalisiert, dass er ein weiteres Byte senden kann.

Fr unseren Versuch wollten wir ursprnglich Port B als Eingangsregister schalten und das Acknowledge abfragen. Jedoch hatten wir Probleme bei der Umsetzung, sodass wir nur die Datenleitung des Senders auf High schalteten und einen 9. Takt erzeugten.

void ack() { sda_an(); takt(); }

Uns ist bewusst, dass das eine sehr unsaubere Lsung darstellt.

Embedded Networking - WS 2011/2012

Seite 6

IC-Bus

Die Adressierung
Nach der Startbedingung schickt der Sender das 1. Byte. Das hchstwertigste Bit wird dabei als erstes gesendet. Das 1. Byte beinhaltet eine 7 Bit lange Adresse und als 8. Bit das sogenannte R/W-Bit. Anhand des R/W-Bits kann der Sender bestimmen, ob er weitere Daten senden oder empfangen mchte. Ist R/W Low so bedeutet das, dass der Sender schreiben will, R/W High steht fr lesen.

void Adress_7_Write (unsigned int iAdresse) { for (int i = 128; i > 1; i = i/2) { if ((i & iAdresse) != 0) { sda_an(); } else { sda_aus(); } takt(); } //R/W = LOW ---> Schreiben // 8. Takt sda_aus(); takt();

// (R/W=0)

// Warten auf Acknowledge vom Empfnger ack(); }

Embedded Networking - WS 2011/2012

Seite 7

IC-Bus

Die Datenbertragung
Nach der bertragung der Adresse und der Besttigung, dass der angesprochene Empfnger bereit ist, kann der Sender das 1.Datenbyte senden. Dies ist 8 Bit lang. Kommt seitens des Empfngers ein Acknowledge, kann der Sender das nchste Byte senden. Das geschieht solange, bis die Datenbertragung beendet ist und die Stoppbedingung gesendet wird oder der Empfang nicht mit einem Acknowledge besttigt wird.

void Data_Write (unsigned char datenbyte) { for (int i = 128; i > 0; i = i/2) { if ((i & datenbyte) != 0) { sda_an(); } else { sda_aus(); } takt(); } // Warten auf Acknowledge vom Empfnger ack(); }

Embedded Networking - WS 2011/2012

Seite 8

IC-Bus

Ansteuerung des LC-Display

Mit Hilfe des IC-Bus haben wir ein LC-Display angesteuert. Dabei handelt es sich um ein HD44780kompatibles Display mit 2 Zeilen mit jeweils 16 Zeichen. Um Zeichen auf dem Display anzeigen zu knnen, muss es im ersten Schritt initialisiert werden. Die Befehle werden jeweils 2 mal gesendet; einmal mit EN = 1 und einmal mit EN = 0. Wir haben das Display im 4-Bit-Modus initialisiert.

LCD_Initialisierung Licht 1 1 1 1 0 0 0 0 0 0 EN 1 0 1 0 0 0 0 0 0 0 RS 0 0 0 0 1 0 0 0 0 0 R/W 0 0 0 0 0 0 0 0 0 0 D7 0 0 0 0 1 1 0 0 1 1 D6 0 0 0 0 0 0 0 0 1 1 D5 1 1 1 1 0 0 1 0 0 1 D4 1 1 0 0 0 0 0 1 0 1 display on cursor / no shift 2 Zeilen, 5x8-Matrix display off display reset Bemerkung Initialisierung 3xwiederholen 4-Bit-Modus

Quelle: http://www.sprut.de/electronic/lcd/index.htm#init

Nach der Initialisierung im 4-Bit-Mode werden die Byte in 2 Schritten bertragen. Zuerst bertrgt man das hherwertige Nibbel, also Bit 4 bis Bit 7 und im 2.Schritt das niederwertige Nibbel, also Bit 0 bis Bit 3. Mit Hilfe des RS-Bits kann man unterscheiden, ob das Byte als Befehl oder Datenbyte behandelt wird. Ist RS Low (RS = 0), dann wird das Byte als Befehl interpretiert. Ist RS High (RS = 1), dann wird das Byte auf dem LCD dargestellt.

Embedded Networking - WS 2011/2012

Seite 9

IC-Bus

Anhang:

Fr die Umsetzung des Versuchs haben wir 2 C-Dateien geschrieben. Zum einen die Datei 1.c und zum anderen die Datei lcd.c. Die Datei 1.c enthlt alle typischen Funktionen zur Realisierung des IC-Bus. Die Datei lcd.c enthlt neben der main-Funktion die Funktion fr die Initialisierung des LCD, Funktionen fr die Ansteuerung des LCD sowie der Ausgabe von (Text-)Zeichen am LCD. Protofunktionen sowie ntige Konstanten haben wir in einer jeweiligen Header-Datei ausgelagert.

Embedded Networking - WS 2011/2012

Seite 10

IC-Bus

Datei: 1.h
/* File Name Project : : 1.h Versuch 3 der LVA Embedded Networking HS WS 2011/2012 Header-Datei fr IC-Bus Description: i2c functions included: void takt(void); void sda_an(void); void sda_aus(void); void scl_an(void); void scl_aus(void); void ack (void); void Start_Condition (void); void Stopp_Condition (void); void Adress_7_Write (unsigned int iAdresse); void Data_Write (unsigned char datenbyte); */ #ifndef 1_H #define 1_H /* */ #define #define #define #define #define

F_CPU 1500000 VAR_00 0b00000011 VAR_11 0b00000000 VAR_01 0b00000010 VAR_10 0b00000001

/* Cpu-Taktfrequenz 12 MHz geteilt durch 8 */

/* I2C-Bus Funktionen */ void takt(void); void sda_an(void); void sda_aus(void); void scl_an(void); void scl_aus(void); void ack(void); void Start_Condition(void); void Stopp_Condition(void); void Adress_7_Write(void); void Data_Write(void); #endif

Embedded Networking - WS 2011/2012

Seite 11

IC-Bus

Datei: LCD.h
/* File : LCD.h description: Init()-Funktionen zur Ansteuerung eines LCD void void void void */ #ifndef LCD_H #define LCD_H /* Konstanten fuer LCD-Ansteuerung */ /* Initialisierung */ #define LCD_INIT_EN0 0b10000011 #define LCD_INIT_EN1 0b11000011 /* Befehle fuer LCD */ #define LCD_EN0 #define LCD_EN1 /* Ausgabe am LCD */ #define LCD_WR_EN0 #define LCD_WR_EN1 init(void) Display_Write (unsigned int byte) Text_Write (unsigned int byte) lcd_string (char *data)

/* EN = 0 */ /* EN = 1 */

0b00000000 0b01000000

/* EN = 0 */ /* EN = 1 */

0b00010000 0b01010000

/* RS = 1, EN = 0 */ /* RS = 1, EN = 1 */

void init (void); void Display_Write (unsigned int byte); void Text_Write (unsigned int byte); void lcd_string (char *data); #endif

Embedded Networking - WS 2011/2012

Seite 12