Get Adobe Flash player
Banner

Library - I2C/TWI Slave USI

Benutzerbewertung: / 8
SchwachPerfekt 

Diese Biblitothek 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)

1. send - "SLave-Address + write"
2. send - "Buffer-Address" Address in which you like to start with write or read.
3. send - "SLave-Address + read"
4. 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)

1. send - "SLave-Address + write"
2. send - "Buffer-Address" Address in which you like to start with write or read.
3. 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 !!!!

I2C_USI_Slave_Epprom

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

Downloads

Lib - I2C_USI_Slave_Epprom

Lib_TWI_USI_Slave_EEProm_1v3.zip


Kommentare  

 
0 # Clemens 2012-04-29 17:30
In der main.c befindet sich in Zeile 79 ein Fehler! Es muss "high" anstatt "hig" heißen!
Antworten | Antworten mit Zitat | Zitieren
 
 
0 # admin 2012-07-31 00:21
Hallo Clemens
Vielen dank! Ich habe es geändert
Antworten | Antworten mit Zitat | Zitieren
 

Kommentar schreiben


Sicherheitscode
Aktualisieren

Was verwendet Ihr?
 

Neue Beiträge

16 Juni 2013
Folgend gibt es ein kleines Beispiel wie man über den SPI-Bis dess Xmegas mit einer SD Karte kommunizieren...
15 Juni 2013
Bei den Xmega Controllern hat sich auch am Interruptsystem so einiges geändert. Das System ist im Vergleich zu...
15 Juni 2013
Neben den standard Timer/Counter Modulen bringen die Xmega-COntroller auch einen Realtimecounter mit. In ...
15 Juni 2013
Mit Hilfe des I2C/ TWI Moduls des Xmegas kann den Ultraschall Entfernungsmesser SRF02 auslesen. Dieser ist...
24 Mai 2013
Vor kurzem ist mein erstem kleines Rennboot fertig geworden. Vom Typ gehört das Boot zur Familie der...
14 Mai 2013
Für den Aufbau eine Laserbank oder die präzise Ablenkung eines Laserstrahls benötigt man neben den speziellen...