ja, die Addresse wird in TWAR gesetzt
hier eine init-Methode:
dann eine zum starten:Code:void TWI_init(uchar ownaddr) { TWAR = ownaddr; TWCR = 0x45; TWSR &= 0xFC; TWBR = 0xA; }
zum senden:Code:uchar TWI_start(uchar ndevaddr) { uchar errcounter; errcounter = 0; TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); { if(errcounter==10) { errcounter = 0; return 1; } errcounter++; } TWDR = ndevaddr; TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); for(unsigned char i = 0; i < 20; i++) asm("nop"); if( !((TWSR & 0xf8) == 0x18 ) ) { return 1; } return 0; }
und schließlich zum stoppen:Code:void TWI_sendbyte(uchar nbyte) { TWDR = nbyte; TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); }
ob meine ganzen nops wirklich nötig sind, hab ich noch nicht ausprobiert, schaden wirds aber nichtCode:void TWI_stop(void) { TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); for(unsigned char i = 0; i < 40; i++) asm("nop"); TWCR |= 0x45; for(unsigned char i = 0; i < 40; i++) asm("nop"); }






Zitieren

Lesezeichen