Hi,
ich hab mal den Code zusammengeschrumpft und getestet die Fehler bleiben.
Nun soll der Slave einfach nur die Daten einlesen / der Master nur senden.
Code:#define NACK 0 #define ACK 1 void twi(void) { cli(); //Pullups DDRC &= ~((1<<PC1) | (1<<PC0)); PORTC |= ((1<<PC1) | (1<<PC0)); //TWI Init TWBR = 10; TWAR = (15<<1); TWCR = (1<<TWEN)|(1<<TWEA); uint8_t i = 0; while(1) { // If TWINT set if (TWCR & (1<<TWINT)) { switch (TWSR) { // Slave & Read Flag case 0x60: i = twi_read(ACK); dectohex(i); i = twi_read(NACK); dectohex(i); //TWI Stop TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWEA) | (1<<TWSTO)); break; } } } } uint8_t twi_read(uint8_t ack_flag) { if (ack_flag) { TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWEA)); } else { TWCR = ((1<<TWINT) | (1<<TWEN)); } while (!(TWCR & (1<<TWINT))); return TWDR; }
Code:$regfile = "m168def.dat" $crystal = 14745000 $baud = 19200 $lib "i2c_twi.lbx" ' Für Hardware TWI ' Externe Pullups vorhanden Config Scl = Portc.5 Config Sda = Portc.4 'Funktioniert nur mit Waitms 1 Config Twi = 50000 ' Init TWBR und TWS 'Funktioniert 'Config Twi = 400000 ' Init TWBR und TWS Twcr = &B00000100 ' nur TWEN setzen Dim A As Byte Do I2cstart 'start condition A = &B00011110 I2cwbyte A 'slave address A = &H30 I2cwbyte A 'slave address A = &H30 I2cwbyte A 'slave address I2cstop ' Waitms 1 Loop End







Zitieren

Lesezeichen