Diese AVR Library I2C/TWI Slave USI ermöglicht eine I2C/TWI Kommunikation über das USI Interface von Atmel. Der verwendete Controller wird dabei als Slave in dem Bussystem verwendet. Neben Controllern der Reihe ATTiny, wie dem ATTiny2313, werden auch eine Reihe von anderen Controllern mit USI Interface unterstützt. Die Bibliothek hat sich in Ihrer Funktion bewährt und erfüllt zuverlässig ihre Aufgabe.
Der I2C, bzw. TWi Slave ist so programmiert, dass dieser wie ein I2C-Speicher (I2C-Epprom) funktioniert.
USI
USI (Universal Serial Interface) steht für Universelle serielle Schnittstelle, die vor allem in kleineren Atmel AVR Controllern, wie z.B. beim ATTiny2313, aber auch in einigen ATMegas anzutreffen ist.
Wie der Name schon sagt, handelt es sich dabei um ein All-in-One-Interface, das lediglich die Hardware zur seriellen Kommunikation enthält, jedoch praktisch keine Protokoll-Implementierung. Diese muss in der Software implementiert werden, je nachdem, welchen Interface-Typ man nutzen will.
Unterstützt werden bisher folgende Controller:
ATtiny2313, ATtiny25, ATtiny45, ATtiny85, ATtiny26, ATtiny261, ATtiny461, ATtiny861, ATmega165, ATmega325, ATmega3250, ATmega645, ATmega6450, ATmega329, ATmega3290, ATmega169,ATtiny24, ATtiny44, ATtiny88
USI – Slave Epprom
alle Beschreibungen findet man in der “usiTwiSlave.h” Datei.
The Slave works like a I2C-EEPROM.
Read Bytes from the Slave (read data from Slave txbuffer)
- send – Slave-Address + write
- send – Buffer-Address, Address in which you like to start with write or read.
- send – Slave-Address + read data
- send – data = i2c_readAck(), Demands the Slave to send data, start by txbuffer[Buffer-Address].
Write Bytes to the Slave Registers (write data in to Slave rxbuffer)
- send – Slave-Address + write
- send – Buffer-Address, Address in which you like to start with write or read.
- send – data, writes data in the buffer, start by rxbuffer[Buffer-Address] Write Bytes to the Slave Registers (write data in to Slave rxbuffer)
- send – Slave-Address + write
- send – Buffer-Address, Address in which you like to start with write or read.
- send – data, writes data in the buffer, start by rxbuffer[Buffer-Address]
Info:
- you have to change the buffer_size in the usiTwiSlave.h file
- Buffer-Address is counted up automatically
- if Buffer-Address > buffersize –> start by Buffer-Address= 0
- You have to change the CPU Frequenz in the files main.c and makefile !!!!
{gallery}elektronik, width=500,height=50, single=I2C_USI_Slave_Epprom.JPG{/gallery}
Software – Beispiel für I2C Master
Beispiel Code die Abfrage des Slaves durch den Master mit der I2C Lib von Peter Fleury.
Abfrage einzelner Bytes.
//############# I2C/TWI Adressen
#define Adr_Attiny 0b00110100
//############# I2C ATTiny
void read_Attiny(void)
{
i2c_start_wait(Adr_Attiny + I2C_WRITE); // Adr_AttinyII ansprechen
i2c_write(0); // startadresse zum lesen
i2c_rep_start (Adr_Attiny + I2C_READ ); // Lesen beginnen
Byte0 = i2c_readAck(); // Byte empfangen
Byte1 = i2c_readAck(); // Byte empfangen
Byte2 = i2c_readAck(); // Byte empfangen
Byte3 = i2c_readNak(); // letes Byte empfangen
i2c_stop(); // stopt I2C Verbindung
}
Beispiel Code die Abfrage des Slaves durch den Master mit der I2C Lib von Peter Fleury.
Abfrage einzelner Bytes (8 Bits) und anschließend zusammenfügen zu einem Word (16 Bit)
//############# I2C/TWI Adressen
#define Adr_Attiny 0b00110100
//############# Macro 2x 8Bit --> 16Bit
#define uniq(LOW,HEIGHT) ((HEIGHT << 8)|LOW)
//############# I2C ATTiny
void read_Attiny(void)
{
uint8_t hig,low = 0; // hight und Low Variable
i2c_start_wait(Adr_Attiny + I2C_WRITE); // Adr_AttinyII ansprechen
i2c_write(0); // startadresse zum lesen
i2c_rep_start (Adr_Attiny + I2C_READ ); // Lesen beginnen
low = i2c_readAck(); // Byte0 lesen
hig = i2c_readAck(); // Byte1 lesen
word1 = uniq(low,hig); // 2x 8Bit --> 16Bit
low = i2c_readAck(); // Byte2 lesen
hig = i2c_readAck(); // Byte3 lesen
word2 = uniq(low,hig); // 2x 8Bit --> 16Bit
i2c_stop(); // stopt I2C Verbindung
}
Beispiel Code für das senden von Daten zu einem Slave durch den Master mit der I2C Lib von Peter Fleury.
Senden einzelner Bytes (8 Bits) und anschließend senden von einem Word (16 Bit), durch zerlegen in 2 Bytes
void write_slave(void)
{
uint8_t hig,low = 0; // hight und Low Variable
//############# I2C Adr_AttinyI
i2c_start_wait(Adr_AttinyI + I2C_WRITE)
i2c_write(0); // Startadresse / Register
i2c_write(30); // 8bit Information - adresse 0
i2c_write(31); // 8bit Information - adresse 1
i2c_write(LOW_BYTE(5678)); // 16bit --> 8bit - adresse 2
i2c_write(HIGH_BYTE(5678)); // 16bit --> 8bit - adresse 3
i2c_stop(); // stopt I2C Verbindung
}
Anwendungen
Aufbau einer Kommunikation von mehreren Controllern untereinander. Dabei ist ein Controller der Master, welcher den Slaves Informationen zusenden oder von Ihnen anfordern kann.
Bei einem Messsystem könnten die einzelnen Slaves verschiedene Messaufgaben haben. Die fertigen Daten werden von dem Slave in den Versendespeicher abgelegt. Fordert der Master Daten an, so werden diese in einer Interruptroutine als Antwort gesendet.
Aufgrund dieser Struktur muss sich der Master nicht um die vielleicht rechentechnisch aufwendigen Aufgaben, wie das Messen und die anschließende Kalibrierung kümmern. Der Master kann sofort die empfangenen Daten der einzelnen Slaves auswerten oder mit ihnen weiter rechnen.
Beispiel
Die Biblitothek enthält ein voll funktionsfähiges Beispiel, inclusive makefile. Das Programm sollte sich ohne Probleme mit dem Programmers Notepad kompilieren lassen.
Viel erfolg!
Erweiterungen & Status
- 01.05.2010 – Version 1v3
- 04.08.2011 – ATtiny24, ATtiny44, ATtiny88
- 21.10.2011 – bisher 1400 Downloads
Bitte melden Sie in die von Ihnen in der Bibliothek gefunden Fehler oder von Ihnen vorgenommene Änderungen, die auch anderen helfen können, damit die Software kontinuierlich weiter verbessert und auf dem aktuellen Stand gehalten wird. Vielen Dank.
Links | |
Hilfe gibt es hier: Produktseite Produktseite | www.mikrocontroller.net Atmel – USI – Slave Atmel – USI – Master |