xmega_tutorial.jpg

Library - I2C/TWI Slave

Bewertung:  / 8
SchwachSuper 

Diese Biblitothek ermöglicht eine I2C/TWI Kommunikation über das Hardware I2C/TWI Interface von Atmel. Der verwendete Controller wird dabei als Slave in dem Bussystem verwendet. Unterstützt werden eigentlich alle Controller der Reihe ATmega von ATmel.

Die Bibliothek ist so programmiert, dass der Slave wie ein I2C-Speicher (I2C-Epprom) funktioniert.

Unterstützt werden alle Controller mit Atmel TWI Interface.

I²C / TWI

I²C ist ein synchroner serieller Zweidraht-Bus (eine Daten- und eine Taktleitung), der für die Kommunikation zwischen ICs über kleine Distanzen geeignet ist. Entwickelt wurde er Anfang der 80er Jahre von Philips. Aus Lizenzgründen heißt der I²C Bus bei manchen Herstellern auch TWI, two wire interface.

TWI - Slave Epprom

alle Beschreibungen findet man in der "TwiSlave.h" Datei.

The Slave works like a I2C-EEPROM.
1. send - "SLave-Address + write"
2. send - "Buffer-Address" Address in which you like to start with write or read.

write data in to Slave rxbuffer

3. send - "SLave-Address + write"
4. send - "data" writes data in the buffer, start by rxbuffer[Buffer-Address]

or

read data from Slave txbuffer

3. send - "SLave-Address + read"
4. send - data = i2c_readAck(); Demands the Slave to send data, start by txbuffer[Buffer-Address].

Info:

  • you have to change the buffer_size in the TwiSlave.h file
  • Buffer-Address is counted up automatically
  • if Buffer-Address > buffersize --> start by Buffer-Address= 0

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!

Links

 
Produktseite
Produktseite

Downloads

Kommentar hinzufügen
  • Mirko

    Hallo,
    erstmal danke für den Beitrag. Der letzte Kommentar ist zwar schon etwas älter, aber ich wollte meine Erfahrungen damit mal als Feedback weitergeben.
    Ich habe bei meiner Anwendung festgestellt, dass der Atmel (ATmega8 mit 8Mhz) als Slave beim Senden von Daten das höchste Bit nicht übertragen hat (z.B. im Buffer stand 0xFF und beim Master kam 0x7F an). Bei einer anderen Schaltung mit einem Atmega8 mit 12Mhz trat dieser Fehler nur sehr sporadig auf. Also hab ich vermutet das an einer Stelle ein zeitliches Problem lag und hab den Code im Case-Fall "TW_ST_DATA_ACK" um einen kurzen Delay erweitert:

    case TW_ST_DATA_ACK:
    if (buffer_adr == 0xFF) {
    buffer_adr=0;
    }
    TWDR = txbuffer[buffer_adr];
    buffer_adr++;
    _delay_us(5); <-- Hier kurz warten
    if(buffer_adr<(buffer_size-1)) {
    TWCR_ACK;
    }
    else {
    TWCR_NACK;
    }
    break;

    Danach trat der Fehler nicht mehr auf. Keine Ahnung ob das noch jemanden interessiert...;)
    Gruß
    Mirko

  • Andreas

    Hallo

    um auf einen "general call" zu reagieren, ist in der Datei "twislave.c" folgende Modifikation notwendig.

    Original: case TW_SR_SLA_ACK:

    Änderung: case TW_SR_SLA_ACK:
    case TW_SR_GCALL_ACK:

    sowie

    Original: case TW_SR_DATA_ACK:

    Änderung: case TW_SR_DATA_ACK:
    case TW_SR_GCALL_DATA_ACK:

    Also unter dem vorhandenen "case" einfach ein weiteres "case" schreiben und schon reagiert der TWI (I2C) Slave auch auf "general call", also auf das Schreiben der Slaveadresse 0.
    Lesen kann man nicht mit einem "general call" (macht auch kein Sinn), weil alle Slaves darauf antworten würden und der Master kann die Antwort nicht einer Adresse zuordnen.

    Viel Erfolg dabei...

  • Ingolf

    Hallo,<br /><br />ich habe einen kleinen Fehler beim Setzen der Adresse gefunden. Zumindest bei den Controllern ATmega16 und ATmega32 muss die Adresse in die 7 höchstwertigen Bits des TWAR geschrieben werden. Hier meine korrigierte Version der init_twi_slave():<br /><br />void init_twi_slave(uint8_t adr)<br />{<br /> adr = adr

  • gast

    Hallo,<br /><br />erstmal möchte ich sagen, ein sehr gelungener Beitrag. Was mich bei der Biblothek noch stutzig macht:<br /><br />1) Wo stelle ich die Busgeschwindigkeit ein?<br />2) Muss ich noch die Ports für den I2C definieren?<br /><br />Gruß gast

  • Hallo,<br />1) Die Lib implementiert einen I2C Slave, das bedeutet, dass der jeweilige Master über die SCL Leitung den Takt vorgibt. Du musst daher im Slave keinen Takt einstellen.<br />2) Da bei der Lib das interne Hardware I2C Modul verwendet wird, kann man die Pins nicht auswählen, diese sind von der Hardware vorgegeben(siehe SCL & SDA).

  • Mirco

    Hallo!<br /><br />Ist mit dieser libary auch möglich Daten per Broadcast und gleichzeitg eigener Adresse zu empfangen?

  • Hallo Mirco,<br />bei der Frage musste ich selber nochmal nachlesen. Aber nein das ist in der Lib nicht umgesetzt. Wenn du es aber noch hinzufügen möchtest, so würde ich mich über eine Rückmeldung freuen.

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...