i2c_start liefert 0 oder 1 zurück. Wird aber vom Programm nicht ausgewertet da nur mit if(!(i2c_start(such))) abgefragt wird. Wenn jetzt der Bus hängt kommt man auch nicht mehr raus. Ein eventueller Stop Befehl hat gar keine Wirkung
Wenn man aber bei 1 einen Bus reset macht, wird die nächste Abfrage an einen andere Slave funktionieren.
Ich hatte das gleich in die library eingebaut, zB:
zB:
Code:void i2c_stop(void){ unsigned short timeout=0; //uint8_t twst; /* send stop condition */ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // wait until stop condition is executed and bus released while((TWCR & (1<<TWSTO))&& ++timeout); if( TW_STATUS & 0xF8 == TW_BUS_ERROR) { // TWI aus, Pause, wiedereinschalten. TWCR &= ~((1 << TWSTO) | (1 << TWEN)); _delay_ms(2); TWCR |= (1<<TWEN); } _delay_us(5); }/* i2c_stop */







Zitieren

Lesezeichen