I2C_LED_Matrix/twislave.h
2008-07-16 05:44:45 +00:00

73 lines
3.0 KiB
C

/**
* \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 <ronald@schatenseite.de>
* \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 <util/twi.h> // enthaelt z. B. die Bezeichnungen fuer die Statuscodes in TWSR
#include <avr/interrupt.h> // dient zur behandlung der Interrupts
#include <stdint.h> // 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