MASTER sendet 1byte:
slave emfängt byte und sendet 1byte zurück:Code:#include <avr/io.h> #include <compat/twi.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <avr/delay.h> #define master_adresse 0x01 void I2C_init(void); void I2C_MASTER_TRANSCEIVE_ERROR(void); void I2C_ERROR(void); unsigned char transceive(unsigned char, unsigned char); void main(void); void I2C_init(void) { TWAR = (master_adresse<<1); //TWI-Addresse des Masters festlegen TWSR &= 0b11111100; //Prescaler auf 1 setzen, Bit 1 und 0 auf 0 TWBR = 0xD; //Bitrate auf 12 setzen sei(); //Interrupts global aktivieren TWCR=(0<<TWINT)|(1<<TWEA)|(1<<TWEN); } void I2C_MASTER_TRANSCEIVE_ERROR(void) { PORTE=0x02; I2C_ERROR(); } void I2C_ERROR(void) { //STOP TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); TWCR=(0<<TWEN); //neu initialisieren I2C_init(); } unsigned char transceive(unsigned char slave_adresse,unsigned char transmit_data) { unsigned char received_data=0x00; TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //START senden while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x08) {I2C_MASTER_TRANSCEIVE_ERROR();} //warten auf start //Addresse des Slaves angeben TWDR = (slave_adresse<<1); TWCR = (1<<TWINT) | (1<<TWEN); //Addresse senden while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x18) {I2C_MASTER_TRANSCEIVE_ERROR();} //master transmit slave adresse ack TWDR = transmit_data; PORTE =transmit_data; //DATEN senden TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x28) {I2C_MASTER_TRANSCEIVE_ERROR();} //master transmit slave daten ack TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //REPEATED START senden while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x10) {I2C_MASTER_TRANSCEIVE_ERROR();} //warten auf rep start TWDR = (slave_adresse<<1) | 1; //Addresse des Slaves angeben TWCR = (1<<TWINT) | (1<<TWEN) | (0<<TWSTA) | (0<<TWSTO); while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x40) {I2C_MASTER_TRANSCEIVE_ERROR();} TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x50) {I2C_MASTER_TRANSCEIVE_ERROR();} TWCR = (1<<TWINT) | (0<<TWEA) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); //warten bis TWINT gesetzt if ((TWSR & 0xF8) != 0x58) {I2C_MASTER_TRANSCEIVE_ERROR();} received_data = TWDR; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); //STOP return received_data; } void main(void) { unsigned char slave_adresse,daten; slave_adresse =0x02; daten=0x01; DDRB=0xFF; DDRE=0xFF; I2C_init(); _delay_loop_1(1); PORTB=transceive(slave_adresse,daten); _delay_loop_1(15); }
bittschö nicht schön aber selten...Code:#include <avr/io.h> #include <compat/twi.h> #include <avr/interrupt.h> #include <avr/signal.h> #define slave_adresse 0x02 void init(void) { TWAR = (slave_adresse<<1); TWCR = 0b11000101; TWBR = 0xC; TWSR &= 0b11111100; sei(); TWCR |= 0b10000000; } SIGNAL (SIG_2WIRE_SERIAL) { switch(TWSR & 0b11111000) { case 0x80: PORTB=TWDR; //byte vom master an portb break; case 0xB8: //byte zum master TWDR=0xF0; PORTE=TWDR; break; // default: //TWSR=0xFF; TWCR |= 0b10000000; } void main(void) { init(); DDRB=0xFF; DDRE=0xFF; for(;;); }
und nun viel spass beim testen
mfg







Zitieren

Lesezeichen