#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/twi.h>
#include <stdint.h>
Include-Abhängigkeitsdiagramm für main.c:
gehe zum Quellcode dieser Datei
Datenstrukturen | |
struct | tstMenue |
struct | tstZeile |
Makrodefinitionen | |
#define | SLAVE_ADD 0x50 |
#define | REGISTER_ANZ 7 |
#define | TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); |
#define | TWCR_NACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); |
#define | TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); |
Aufzählungen | |
enum | enRegisterAdr { INBuffer = 1, OUTBuffer, INCounter, OUTCounter, PaketReqID, Status, GPIO } |
Funktionen | |
void | init_twi_slave (uint8_t adr) |
Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse. | |
int | main (void) |
ISR (TWI_vect) | |
Interrupt wird ausgelöst ein Ereigniss auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann. | |
Variablen | |
volatile uint8_t | register_adr |
struct { | |
unsigned bFirstAccess:1 | |
} | twi_status |
#define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); |
#define TWCR_NACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); |
#define TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); |
enum enRegisterAdr |
Definiert in Zeile 47 der Datei main.c.
00047 { INBuffer=1, OUTBuffer, INCounter, OUTCounter, PaketReqID, Status, GPIO };
void init_twi_slave | ( | uint8_t | adr | ) |
Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse.
adr | gewünschte Slave-Adresse |
Definiert in Zeile 88 der Datei main.c.
Benutzt register_adr und twi_status.
Wird benutzt von main().
00089 { 00090 TWAR= adr; // Adresse setzen 00091 TWCR &= ~(1<<TWSTA)|(1<<TWSTO); // START und STOP deaktivieren 00092 TWCR|= (1<<TWEA) | (1<<TWEN) | (1<<TWIE); // aktivieren von: Acknowledge, Interrupt und TWI 00093 register_adr=0x00; // registeradresse zurücksetzen 00094 twi_status.bFirstAccess = 1; // erster zugriff nach stop 00095 00096 DDRB = 0xff; 00097 PORTB = 0x00; 00098 DDRA = 0xff; 00099 PORTA = 0x00; 00100 }
ISR | ( | TWI_vect | ) |
Interrupt wird ausgelöst ein Ereigniss auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann.
Definiert in Zeile 110 der Datei main.c.
Benutzt GPIO, INBuffer, INCounter, OUTBuffer, OUTCounter, PaketReqID, register_adr, Status, TWCR_ACK, TWCR_RESET und twi_status.
00111 { 00112 uint8_t data = 0; 00113 switch (TW_STATUS) // TWI-Statusregister prüfen und nötige Aktion bestimmen 00114 { 00115 case TW_SR_SLA_ACK: // 0x60 Slave Receiver, wurde adressiert 00116 TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach 00117 PORTA = 0xFC; 00118 break; 00119 00120 /*** Daten Empfangen ****/ 00121 case TW_SR_DATA_ACK: // 0x80 Slave Receiver,Daten empfangen 00122 data=TWDR; // Empfangene Daten auslesen 00123 if(twi_status.bFirstAccess) // erte Adressierung nach STOP 00124 { 00125 register_adr = data;// Empfangene Register Adresse speciern 00126 PORTA = register_adr; 00127 twi_status.bFirstAccess = 0; 00128 } 00129 else 00130 { 00131 switch( register_adr) 00132 { 00133 case INBuffer: 00134 case OUTBuffer: 00135 case INCounter: 00136 case OUTCounter: 00137 case PaketReqID: 00138 case Status: 00139 case GPIO: 00140 PORTB = data; 00141 break; 00142 default: 00143 PORTB = 0xff; 00144 } 00145 register_adr++; 00146 } 00147 TWCR_ACK; 00148 break; 00149 00150 /*** Daten versenden ***/ 00151 case TW_ST_SLA_ACK: // 0xA8 Slave Transmitter wurde adressiert 00152 case TW_ST_DATA_ACK: // 0xB8 Slave Transmitter, weitere Daten wurden angefordert 00153 TWCR_ACK; 00154 break; 00155 00156 case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert 00157 case TW_SR_DATA_NACK: // 0x88 Keine Daten weiteren empfangen 00158 case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received 00159 case TW_SR_STOP: // 0xA0 STOP empfangen 00160 default: // alle anderen codes 00161 twi_status.bFirstAccess = 1; 00162 TWCR_RESET; // Übertragung beenden, warten bis zur nächsten Adressierung 00163 } // end switch 00164 }// end ISR
int main | ( | void | ) |
Definiert in Zeile 72 der Datei main.c.
Benutzt init_twi_slave() und SLAVE_ADD.
00073 { 00074 init_twi_slave(SLAVE_ADD); 00075 sei(); 00076 while(1); 00077 }
unsigned bFirstAccess |
volatile uint8_t register_adr |
struct { ... } twi_status |
Wird benutzt von init_twi_slave() und ISR().