xmega_tutorial.jpg

Library - I2C/TWI Slave USI

Bewertung:  / 4
SchwachSuper 

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

Kommentar hinzufügen
  • Zepp

    Ich wollte diese Lib für den ATTiny841 benutzen, leider wird dieser wohl nicht unterstuetzt.
    Weiss jemand, wie man die Lib für den ATTiny841 erweitern kann?

  • Bernd Kreuss

    Die ISR für die Startbedingung enthält nen bug. Er äußert sich erst wenn in der Adresse des Slaves das Höchste Bit gesetzt ist also sofort nach der Startbedingung die Datenleitung hochgeht und zusätzlich der Slave arg ausgelastet ist durch anderweitige Interrupts und direkt nach dem Start den clock stretchen muss. In diesem Falle hab ich beobachtet daß fälschlicherweise auf Stop erkannt wird und die Übertragung ignoriert wird. Untiger Patch behebt das zuverlässig und es läuft jetzt wie geschmiert.

    Der Unterschied zwischen Start und Stop kann zuverlässig erkannt werden wenn man statt auf SDA auf die SCL-Leitung schaut, SCL bleibt low nach dem Ende der Startbedingung während SDA zu diesem Zeitpunkt beliebig sein darf. Ich vermute das war ohnehin ein Versehen, denn ansonsten funktioniert diese Library 100% perfekt! Vielen Dank für diese exzellente Stückchen Code!

    
    --- usiTwiSlave_old.c   2011-10-21 12:17:44.000000000 +0200
    +++ usiTwiSlave.c       2014-10-25 17:00:17.794250296 +0200
    @@ -255,7 +255,7 @@
     
            while ( ( PIN_USI & ( 1 << PIN_USI_SCL ) ) &&   !( ( PIN_USI & ( 1 << PIN_USI_SDA ) ) ));// SCL his high and SDA is low
     
    -       if ( !( PIN_USI & ( 1 << PIN_USI_SDA ) ) )
    +       if ( !( PIN_USI & ( 1 << PIN_USI_SCL ) ) )
                    {       // A Stop Condition did not occur
                    USICR =
                    ( 1 << USISIE ) |                                                               // Keep Start Condition Interrupt enabled to detect RESTART
    

  • CyMech

    Ich hab diese Bibliothek gerade heruntergeladen.
    Der beschriebene Fehler mit dem "Hig" --> "High" ist immer noch vorhanden.

    Gruß

  • ja sorry da fehlte mir einfach die Zeit zum Ändern, ist aber jetzt behoben.

  • Clemens

    In der main.c befindet sich in Zeile 79 ein Fehler! Es muss "high" anstatt "hig" heißen!

  • Hallo Clemens<br />Vielen dank! Ich habe es geändert

Neuste Beiträge

03/09/2015
In den letzten Monaten habe ich lange das CAD Programm und meinen kleinen Ultimaker 3D Drucker gequält....
15/05/2015
Zuerst wurde eine kleine Katze am Computer konstruiert. Der erste Druck mit 0,3mm Schichtstärke war...
06/05/2015
Da beim Ultimaker keine Beleuchtung des Arbeitstisches vorgesehen ist, muss ich mir hier selber eine...
10/03/2015
Nach vielen Überlegungen habe ich mich nun endlich dazu entschieden meinen Machinenpark mit einem 3D...
01/02/2015
Diese Hardware besteht aus einem mächtigem Hardwarecontroller und vier leistungsstarken...
16/08/2014
Für meine StepCraft CNC Fräse habe ich mir eigene Spanneisen bzw. Spannpratzen, zum schnellen und...