ASURO Library  2.80
Makrodefinitionen | Funktionen
i2c.h-Dateireferenz

Definitionen und Funktionen zum I2C Bus. Mehr ...

#include "myasuro.h"
Include-Abhängigkeitsdiagramm für i2c.h:
Dieser Graph zeigt, welche Datei direkt oder indirekt diese Datei enthält:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define READ   1
 
#define WRITE   0
 
#define ACK   1
 
#define NAK   0
 
#define SDA   MY_I2C_SDA
 
#define SCL   MY_I2C_SCL
 
#define SDA_DDR   DDRC
 
#define SCL_DDR   DDRC
 
#define SDA_PIN   PINC
 
#define SCL_PIN   PINC
 
#define SDA_PORT   PORTC
 
#define SCL_PORT   PORTC
 
#define NOP   asm volatile("nop") /*<! No Operation */
 
#define QDEL   NOP; NOP; NOP; NOP; NOP /*<! 1/4 Delay */
 
#define HDEL   QDEL; QDEL /*<! 1/2 Delay */
 
#define SDA_HI   SDA_PORT |= (1 << SDA)
 
#define SDA_LO   SDA_PORT &= ~(1 << SDA)
 
#define SCL_HI   SCL_PORT |= (1 << SCL)
 
#define SCL_LO   SCL_PORT &= ~(1 << SCL)
 
#define SCL_TOGGLE   HDEL; SCL_HI; HDEL; SCL_LO
 
#define I2C_START   SDA_LO; QDEL; SCL_LO
 
#define I2C_STOP   HDEL; SCL_HI; QDEL; SDA_HI; HDEL
 

Funktionen

void InitI2C (void)
 I2C Bus Initialisieren.
 
unsigned char WriteI2C (unsigned char byte)
 Daten ueber I2C schreiben.
 
unsigned char ReadI2C (unsigned char nak)
 Daten aus I2C Bus lesen.
 
unsigned char StartI2C (unsigned char device)
 Datenaustausch starten.
 
void StopI2C (void)
 Datenaustausch Stoppen.
 

Ausführliche Beschreibung

Definitionen und Funktionen zum I2C Bus.

I2C Einfuehrung
I2C ist ein 2 Draht Bus-System das von Philips entwickelt wurde. Dazu wird lediglich eine Datenleitung und eine Taktleitung benötigt (und natuerlich eine gemeinsame Masseleitung). Es gibt eine Reihe von ICs mit I2C Bus Schnittstelle (Digital Port Erweiterungen, A/D Wandler, EEPROMs etc.) Damit ergibt sich eine Vielzahl von Moeglichkeiten um die begrenzten IO Ressourcen des ASUROs zu erweitern. Bis zu 127 Teilnehmer sind an einem I2C Bus anschliessbar. Dazu werden lediglich 2 Port Pis des ASUROs benötigt. Bie meissten ATmel AVR Prozessoren unterstuetzen die I2C Schnittstelle per Hardware, TWI (Two Wire Interface) genannt.
I2C am ASURO
Die Hardware TWI (I2C) Ports sind beim ASURO leider durch den Batterie Abfrage A/D Port und dem Tastsensor A/D Port belegt. Um die I2C Schnittstelle ohne Umbau des ASUROs zu realisieren, wird der I2C BUs mit Software emuliert. Dabei werden füer den I2C Bus die Ports der ASURO Erweiterungsplatine verwendet. Dies sind ADC2 fuer die I2C Taktleitung (SCL) und ADC3 fuer die I2C Datenleitung (SDA). Leider geht dadurch die Funktion des Liniensensors verloren. Da die beiden Fototransistoren ebenfalls die Ports ADC2 und ADC3 belegen. Ausloeten braucht man die Fototransistoren zum Glueck nicht.
I2C Anwendungen
Ueber den I2C Bus lassen sich z.B. folgende Erweiterungen realisieren.
  • Eine Digitalport Erweiterung, z.B. 8 IO Ports mit dem PCF8574
  • Eine Analogport Erweiterung, z.B. 4 A/D Ports und 1 D/A Port mit dem PCF8594
  • Ein LCD Modul mithilfe der Digitalporterweiterung
  • Ein weiterer AVR Prozessor als I2C Slave, als universelle Porterweiterung.
Autor
raid_ox
Version
V001 - 17.02.2007 - raid_ox
Erste Implementierung
V002 - 10.02.2007 - m.a.r.v.i.n
Absplittung von asuro.h in eigene Header-Datei,
Doxygen Kommentare (KEINE Funktionsänderung)

Definiert in Datei i2c.h.

Makro-Dokumentation

#define ACK   1

Definiert in Zeile 75 der Datei i2c.h.

#define HDEL   QDEL; QDEL /*<! 1/2 Delay */

Definiert in Zeile 92 der Datei i2c.h.

#define I2C_START   SDA_LO; QDEL; SCL_LO

Definiert in Zeile 101 der Datei i2c.h.

#define I2C_STOP   HDEL; SCL_HI; QDEL; SDA_HI; HDEL

Definiert in Zeile 102 der Datei i2c.h.

#define NAK   0

Definiert in Zeile 76 der Datei i2c.h.

#define NOP   asm volatile("nop") /*<! No Operation */

Definiert in Zeile 90 der Datei i2c.h.

#define QDEL   NOP; NOP; NOP; NOP; NOP /*<! 1/4 Delay */

Definiert in Zeile 91 der Datei i2c.h.

#define READ   1

Definiert in Zeile 73 der Datei i2c.h.

#define SCL   MY_I2C_SCL

Definiert in Zeile 81 der Datei i2c.h.

#define SCL_DDR   DDRC

Definiert in Zeile 84 der Datei i2c.h.

#define SCL_HI   SCL_PORT |= (1 << SCL)

Definiert in Zeile 97 der Datei i2c.h.

#define SCL_LO   SCL_PORT &= ~(1 << SCL)

Definiert in Zeile 98 der Datei i2c.h.

#define SCL_PIN   PINC

Definiert in Zeile 86 der Datei i2c.h.

#define SCL_PORT   PORTC

Definiert in Zeile 88 der Datei i2c.h.

#define SCL_TOGGLE   HDEL; SCL_HI; HDEL; SCL_LO

Definiert in Zeile 100 der Datei i2c.h.

#define SDA   MY_I2C_SDA

Definiert in Zeile 80 der Datei i2c.h.

#define SDA_DDR   DDRC

Definiert in Zeile 83 der Datei i2c.h.

#define SDA_HI   SDA_PORT |= (1 << SDA)

Definiert in Zeile 94 der Datei i2c.h.

#define SDA_LO   SDA_PORT &= ~(1 << SDA)

Definiert in Zeile 95 der Datei i2c.h.

#define SDA_PIN   PINC

Definiert in Zeile 85 der Datei i2c.h.

#define SDA_PORT   PORTC

Definiert in Zeile 87 der Datei i2c.h.

#define WRITE   0

Definiert in Zeile 74 der Datei i2c.h.

Dokumentation der Funktionen

void InitI2C ( void  )

I2C Bus Initialisieren.

Siehe auch
SDA_HI, SCLHI
Funktionsweise:
Schaltet PC2 und PC3 als Ausgang. und Setze die Pins als High

Definiert in Zeile 42 der Datei i2c.c.

{
SDA_DDR |= (1 << SDA);
SCL_DDR |= (1 << SCL);
}
unsigned char ReadI2C ( unsigned char  ack)

Daten aus I2C Bus lesen.

Parameter
ackNAK oder ACK
Rückgabe
erhaltene Daten
Siehe auch
SDA_HI, SDA_LO, SCL_HI, SCL_TOGGLE, HDEL

Definiert in Zeile 109 der Datei i2c.c.

{
unsigned char i, byte = 0;
SDA_DDR &= ~(1 << SDA);
for (i=0; i<8; i++)
{
byte <<= 1;
byte |= (SDA_PIN & (1 << SDA)) >> SDA;
}
SDA_DDR |= (1 << SDA);
if (ack)
SDA_LO; // ack
else
SDA_HI; // nak
return byte;
}
unsigned char StartI2C ( unsigned char  device)

Datenaustausch starten.

Parameter
deviceAddresse der I2C Gerät
Rückgabe
antwort

Definiert in Zeile 153 der Datei i2c.c.

{
return WriteI2C (device);
}
void StopI2C ( void  )

Datenaustausch Stoppen.

Definiert in Zeile 168 der Datei i2c.c.

unsigned char WriteI2C ( unsigned char  byte)

Daten ueber I2C schreiben.

Parameter
bytedaten
Rückgabe
antwort
Siehe auch
SDA_HI, SDA_LO, SCL_HI, SCL_TOGGLE, HDEL

Definiert in Zeile 66 der Datei i2c.c.

{
unsigned char i;
for (i=8; i>0; i--)
{
if ( byte & (1<<(i-1)) )
else
}
SDA_DDR &= ~(1 << SDA);
byte = SDA_PIN & (1 << SDA);
SDA_DDR |= (1 << SDA);
return (byte == 0);
}