I2C

I²C Master

Funktion

Das I²C-Master-Modul ermöglicht, über den I²C-Bus Slaves mit 7-bit- und 10-bit-Adressen anzusprechen. Die Taktrate kann über einen 16-bit-Vorteiler aus dem Systemtakt erzeugt werden.

Das Modul kann zusammen mit anderen I²C-Master-Modulen an einem Bus betrieben werden, da es Arbitrierung unterstützt. Es werden jedoch keine von anderen Teilnehmern initiierte Datentransfers angenommen. Dazu müsste noch ein Slave Modul zusätzlich zum Master Modul auf dem SpartanMC installiert werden.

Register

Offset Register Funktion Zugriff
0 I2C_CTRL Steuerrgister read/write
1 I2C_TXR Daten Register zum Senden von Daten read/write
2 I2C_RXR Daten Register der Empfangenen Daten read
3 I2C_CMD Commandoregister read/write
4 I2C_STATUS Statusregister read

Das Steuerregister I2C_CTRL enthält die 16 Bit des Vorteilers und die Freigabebits für den Modul und die Interruptarbeit. Auf das Register kann lesend und schreibend zugegriffen werden.

Das Statusregister I2C_STATUS enthält alle zur Arbeit mit dem I²C Master Moduls notwendigen Zustandsinformationen. Es kann nur gelesen werden.

In die Datenregister I2C_TXR wird das zu sendende Datenbyte geschrieben. Nach einem abgeschlossenem Empfang kann im I2C_RXR das empfangene Datenwort gelesen werden. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das I2C_TXR Register kann lesend und schreibend zugegriffen werden. Das I2C_RXR Register kann nur gelesen werden.

I2C_CTRL Bit Name Funktion
Bit 15 bis 0: 16 Bit Vorteiler für den Takt des Masters
Bit 16: I2C_EN I2C enable: 0 = disable, 1 = enable
Bit 17: I2C_IEN interrupt enable: 0 = disable, 1 = enable
I2C_TXR Funktion
Bit 7 bis 0: Datenbits
Bit 17 bis 8: nicht benutzt
I2C_RXR Funktion
Bit 7 bis 0: Datenbits
Bit 17 bis 8: nicht benutzt
I2C_CMD Bit Name Funktion
Bit 0: I2C_IACK 1 = Reset I2C_IF und Freigabe des nächsten Interrupt bei ACK
Bit 1: nicht benutzt
Bit 2: nicht benutzt
Bit 3: I2C_ACK 0 = I2C_ACK / 1 = I2C_NAK zum Slave am Ende des Byte senden
Bit 4: I2C_WR Schreibmodus: 0 = nicht aktiv, 1 = aktiv
Bit 5: I2C_RD Lesemodus: 0 = nicht aktiv, 1 = aktiv
Bit 6: I2C_STO Stoppmodus: 0 = nicht aktiv, 1 = aktiv
Bit 7: I2C_STA Startmodus: 0 = nicht aktiv, 1 = aktiv
Bit 17 bis 8: nicht benutzt
I2C_STATUS Bit Name Funktion
Bit 0: I2C_IF Interrupt Flag: 0 = nicht aktiv, 1 = aktiv
Bit 1: I2C_TIP Daten Transfer: 0 = nicht aktiv, 1 = aktiv
Bit 2: I2C_R_W Datenrichtung des letzten Byte Transfers: 0 = Read, 1 = Write
Bit 3: nicht benutzt
Bit 4: nicht benutzt
Bit 5: I2C_AL I²C Bus Kollision
Bit 6: I2C_BUSY kein Byte bereit zum lesen oder schreiben
Bit 7: I2C_RXACK empfangenes ACK Bit vom Slave: 0 = ACK, 1 = NAK
Bit 17 bis 8: nicht benutzt

Funktionen für den Anwender aus der Datei "i2c_master.h"

Der 1. Parameter aller Funktionen ist ein Zeiger auf die Registerstruktur des i²c Master Moduls. Wird im jConfig der Standart Name "i2c_master_0" beibehalten, dann hat der Zeiger den Namen "I2C_MASTER_0". Alle Funktionen geben eine "0" zurück, wenn die Funktion fehlerfrei ausgeführt wurde.

Funktion Parameter Bedeutung
int i2c_master_write(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * dataw) Slaveadresse, Anzahl der zu sendenden Byte, Zeiger auf zusendendes Datenfeld Schreiben einer beliebigen Anzahl von Bytes
int i2c_master_reada(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * datar) Slaveadresse, Anzahl der zu lesenden Byte, Zeiger auf ein Datenfeld Lesen einer beliebigen Anzahl von Bytes mit ACK beim letzten Byte
int i2c_master_readn(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * datar) Slaveadresse, Anzahl der zu lesenden Byte, Zeiger auf ein Datenfeld Lesen einer beliebigen Anzahl von Bytes mit NAK beim letzten Byte
int i2c_master_wr_rda(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anzw, unsigned int * dataw, unsigned int anzr, unsigned int * datar) Slaveadresse, Anzahl der zu sendenden Byte, Zeiger auf zusendendes Datenfeld, Anzahl der zu lesenden Byte, Zeiger auf ein Datenfeld Schreiben und lesen beliebiger Anzahl von Bytes mit ACK beim letzten Byte
int i2c_master_wr_rdn(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anzw, unsigned int * dataw, unsigned int anzr, unsigned int * datar) Slaveadresse, Anzahl der zu sendenden Byte, Zeiger auf zusendendes Datenfeld, Anzahl der zu lesenden Byte, Zeiger auf ein Datenfeld Schreiben und lesen beliebiger Anzahl von Bytes mit NAK beim letzten Byte

Fehler Codes der Funktionen:
  1. kein ACK beim Senden der Slaveadresse im READ-Mode.
  2. kein ACK beim Senden der Slaveadresse im WRITE-Mode.
  3. kein ACK beim Senden des 1. Datenbyte.
  4. kein ACK beim Senden des 2. Datenbyte....

Konfiguration und Instanziierung


Die Interruptleitung des Moduls muss an den gewünschten Eingang des Interruptkontrollers angeschlossen werden, SDA und SCL müssen an die IO-Ports des Top Level Moduls angeschlossen werden. Diese müssen dann noch den Pins des FPGA zugeordnet werden.

i2c_master.h(external link) mit der Register Struktur und den Funktionen für den Master.

Beispielprogramme zur Arbeit mit I²C Slave Modulen:

Lesen und schreiben des EEPROM m24c08 in C auf dem ml507 Board:
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit NAK beantworten!
Beschreibung zum m24c08 m24c08.pdf
C-Quelle des Test i2c_m24c08.c
Assemblerliste des Test i2c_m24c08.lst
Protokoll zum Test m24c08_prot.txt
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig i2c_ml507_m24c08.xml

Lesen und schreiben des Fan Controller IC adt7476a in C auf dem ml507 Board:
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit NAK beantworten!
Beschreibung zum adt7476a ADT7476A-D.PDF
C-Quelle des Test i2c_adt7476a.c
Assemblerliste des Test i2c_adt7476a.lst
Protokoll zum Test adt7476a_prot.txt
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig i2c_ml507_adt7476a.xml

Lesen und schreiben des DVI Transmitter Device ch7301c in C auf dem ml507 Board:
Der ch7301c kann nur angesprochen werden, wenn an seinem RESET Eingang nach dem zuschalten der Betriebspannungen ein Flanke von low auf high angelegt wird. Im SpartanMC ist das Signal am besten mit dem negierten System RESET zu verbinden! Ist das Signal staendig low oder staendig high bleit das i2c Interface inaktiv!
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit NAK beantworten!
Beschreibung zum ch7301c ch7301c.pdf
Beschreibung zum ch7301a ch7301a.pdf
Informationen zur Anwendung des ch7301c an41.pdf
C-Quelle des Test i2c_ch7301c.c
Assemblerliste des Test i2c_ch7301c.lst
Protokoll zum Test ch7301c_prot.txt
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig i2c_ml507_ch7301.xml

Lesen und schreiben des High Performance 8-Bit Display Interface AD9980 in C auf dem ml507 Board:
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit NAK beantworten!
Beschreibung zum ad9980 AD9980.pdf
Beschreibung zum ad9980 datasheet.pdf
Informationen zur Anwendung des ad9980 an794.pdf
Informationen zur Anwendung des ad9980 BA_E_Sahak.pdf
C-Quelle des Test i2c_ad9980.c
Assemblerliste des Test i2c_ad9980.lst
Protokoll zum Test ad9980_test_prot.txt
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig i2c_ml507_ad9980.xml

Lesen und schreiben des SpartanMC Slave in C auf dem ml507 Board mit 3000kHz Datentakt bei 60MHz Systemtakt:
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit ACK beantworten!
Beschreibung zum SpartanMC I²C Slave
C-Quelle des Test i2c_spmc_sl.c
Assemblerliste des Test i2c_spmc_sl.lst
Protokoll zum Test i2c_spmc_sl_prot.txt
Protokoll zum Test i2c_spmc_sl_prot.pdf
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig i2c_ml507_spmc_sl.xml

Lesen und schreiben des SpartanMC Slave in C auf dem sp601 Board mit 3085,714kHz Datentakt bei 61,714MHz Systemtakt:
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit ACK beantworten!
Beschreibung zum SpartanMC I²C Slave
C-Quelle des Test i2c_spmc_sl.c
Assemblerliste des Test i2c_spmc_sl.lst
Protokoll zum Test i2c_spmc_sl_prot.txt
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig i2c_master_slave_test.xml

Lesen und schreiben des SpartanMC Slave in C auf dem ml605 Board mit 3300kHz Datentakt bei 66,000MHz Systemtakt:
Bei diesem Slave muss der Master das letzte Daten lesen vor einem Stop mit ACK beantworten!
Beschreibung zum SpartanMC I²C Slave
C-Quelle des Test i2c_spmc_sl.c
Assemblerliste des Test i2c_spmc_sl.lst
Protokoll zum Test i2c_test_prot.txt
Protokoll zum Test i2c_test_prot.pdf
BIT Datei für das ml507 Board mit dem Programm spartanmc.bit
MSK Datei für das ml507 Board mit dem Programm spartanmc.msk
SpartanMC Konfigurationsdatei für jConfig iic_ml605_ms.xml



Modifizieren des Inhaltes der Speicherzellen des EEPROM 24LC64:24LC64.pdf
Dieses Programm ist noch für den alten I²C Modul in Assembler geschrieben
24lc64.a18
24lc64.sph
24lc64.lst Start mit G 40 im Monitor.

Lesen der Spannung eines ADC vom Typ ads1000: ads1000.pdf
Dieses Programm ist noch für den alten I²C Modul in Assembler geschrieben
ads1k.a18
ads1k.sph
ads1k.lst Start mit G 40 im Monitor.



SpartanMC