/** * \file twislave.h * \brief I2C slave library. taken from http://www.roboternetz.de/wissen/index.php/TWI_Slave_mit_avr-gcc * * Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave. Zu Beginn muss * init_twi_slave mit der gewuenschten Slave-Adresse als Parameter aufgerufen * werden. Der Datenaustausch mit dem Master erfolgt ueber die Buffer rxbuffer * und txbuffer, auf die von Master und Slave zugegriffen werden kann. rxbuffer * und txbuffer sind globale Variablen (Array aus uint8_t). * Die Ansteuerung des rxbuffers, in den der Master schreiben kann, erfolgt * aehnlich wie bei einem normalen I2C-EEPROM. * Man sendet zunaechst die Bufferposition, an die man schreiben will, und dann * die Daten. Die Bufferposition wird automatisch hochgezaehlt, sodass man * mehrere Datenbytes hintereinander schreiben kann, ohne jedesmal die * Bufferadresse zu schreiben. * Um den txbuffer vom Master aus zu lesen, uebertraegt man zunaechst in einem * Schreibzugriff die gewuenschte Bufferposition und liest dann nach einem * repeated start die Daten aus. Die Bufferposition wird automatisch * hochgezaehlt, sodass man mehrere Datenbytes hintereinander lesen kann, ohne * jedesmal die Bufferposition zu schreiben. * * Autor: Uwe Grosse-Wortmann (uwegw) * Status: Testphase, keine Garantie fuer ordnungsgemaesse Funktion! * letze Aenderungen: * 23.03.07 Makros fuer TWCR eingefuegt. Abbruch des Sendens, wenn der TXbuffer * komplett gesendet wurde. * 24.03.07 verbotene Buffergroessen abgefangen * 25.03.07 noetige externe Bibliotheken eingebunden * * Abgefangene Fehlbedienung durch den Master: * - Lesen ueber die Grenze des txbuffers hinaus * - Schreiben ueber die Grenzen des rxbuffers hinaus * - Angabe einer ungueltigen Schreib/Lese-Adresse * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben * * \author Uwe Grosse-Wortmann (uwegw), reformatted by Ronald Schaten * \version $Id: twislave.h,v 1.1 2008/07/16 05:44:45 rschaten Exp $ * * License: GNU GPL v2 (see License.txt) */ #ifndef _TWISLAVE_H #define _TWISLAVE_H #include // enthaelt z. B. die Bezeichnungen fuer die Statuscodes in TWSR #include // dient zur behandlung der Interrupts #include // definiert den Datentyp uint8_t // von Benutzer konfigurierbare Einstellungen #define buffer_size 9 ///< Groesse der Buffer in Byte (2..254) // Globale Variablen, die vom Hauptprogramm genutzt werden /** * Der Buffer, in dem die empfangenen Daten gespeichert werden. Der Slave * funktioniert aehnlich wie ein normales Speicher-IC [I2C-EEPROM], man sendet * die Adresse, an die man schreiben will, dann die Daten, die interne * Speicher-Adresse wird dabei automatisch hochgezaehlt. */ volatile uint8_t rxbuffer[buffer_size]; /** * Der Sendebuffer, der vom Master ausgelesen werden kann. */ volatile uint8_t txbuffer[buffer_size]; // Funktionen, die vom Hauptprogramm aufgerufen werden koennen void init_twi_slave(uint8_t adr); #endif //#ifdef _TWISLAVE_H