73 lines
3.0 KiB
C
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
|