⇐ 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:
- Das Hauptprogramm kann jederzeit unterbrochen werden. Dies kann Konsequenzen auf das Timing
von Schleifen haben.
- Die Interrupt-Service-Routinen sind als nicht unterbrechbare Interrupts ausgelegt.
- Das Hauptprogramm muss die Interrupts freigeben (sei).
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