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 */
Lesezeichen