⇐ zurück zur Hauptseite

Die Atmel Application Note "AVR312 - Using the USI module as a TWI slave" war Basis für den Code. In dieser Application Note erfolgt der Datenaustausch über einen Ringpuffer. Hier wurden im wesentlichen die entsprechenden Funktion durch Aufrufe von Eventhandlern ersetzt. Eine Initialisierungsfunktion und eine Möglichkeit zum Ändern der I²C-Geräte-Adresse runden den Funktionsumfang ab.

Der Code wurde mit dem avr-gcc (Version: WinAVR-20100110) übersetzt. Dies ist bei der Parameterübergabe an Funktionen und der Registerbenutzung zu berücksichtigen.

Prototypen für nachfolgend besprochenen Funktionen finden sich in der Datei "I2CInterface.h" im Source-Code-Archiv.

Interrupts:
Der Slave arbeitet –wie in der Application Note beschrieben– interrupt-getrieben. Dies muss im Hauptprogramm entsprechend berücksichtigt werden:

Ereignisse:
Der I²C-Datenaustausch funktioniert ereignisgetrieben. Dem Hauptprogramm werden die Ereignisse auf dem I²C-Bus durch den Aufruf von Ereignisbehandlungsroutinen (event handler) mitgeteilt. Das Hauptprogramm kann dann entsprechend reagieren. Zu berücksichtigen ist, dass diese Funktionen innerhalb einer nicht unterbrechbaren Interrupt-Service-Routine aufgerufen werden. Die Handler müssen deshalb so schnell wie möglich zurückkehren.

Handler Beschreibung
void I2CSlave_TransmissionStart(void) Diese Funktion wird immer dann aufgerufen, wenn die "Startbedingung" auf dem I²C-Bus erkannt wird. Nicht beendete Übertragungen können abgeschlossen werden.
void I2CSlave_DataReceived(uint8_t data) Der I²C-Master hat ein Byte an den Slave übertragen. Das übertragene Byte wird im Funktionsparameter data übergeben.
uint8_t I2CSlave_DataRequest(void) Der I²C-Master hat ein Byte angefordert. Der Slave stellt ein Byte bereit.


Initialisierung:
Über die Initialisierungsfunktion werden dem Slave die I²C-Geräte-Adresse und die Adressen der Event-Handler-Funktionen bekannt gemacht. Der I²C-Slave speichert diese Daten in einem acht Byte großen reservierten Bereich des SRAM. Danach wird das USI für den TWI-Modus (TWI = I²C) konfiguriert. Der Prototyp der Funktion:

void I2C_Initialize (uint8_t                      DeviceAddress,  // Geräteadresse
                     I2CSlave_TransmissionStart_t Start,          // Transmision Start Handler
                     I2CSlave_DataRequest_t       Request,        // Data Request Handler 
                     I2CSlave_DataReceived_t      Received);      // Data Received Handler

Um die Funktionen einfach zugänglich zu machen wurde an den Anfang des Bootloader-Codes ein Sprung zu dieser Funktion codiert. Dieser Wert ist ist über die Konstante "BOOTLOADERSTART" in "GlobalConstants.h" abrufbar. Bei der Benutzung der avr-gcc kann auch "Interface.o" eingebunden werden. In der Version 1.0 des Bottloaders ist dieser Wert 0x0c80.

Adressänderung:
Über die Funktion void I2C_SetAddress(uint8_t DeviceAddress) kann die Geräteadresse im laufenden Betrieb geändert werden. Dies ist wichtig, wenn die Geräte-Adresse nicht fixiert ist und über eine Hauptprogrammfunktionalität geändert werden soll (z.B. Ablage der Adresse im EEPROM).

⇐ zurück zur Hauptseite