В общем действительно подтверждается, что все дело в этом буфере...
Меняю USIDR на USIBR и начинается какая-то ерунда.... А раз ерунда начинается при изменении в одном месте, то вывод очевиден )
На всякий случай код для конкретики.
Код
#define USIBR _SFR_IO8(0x000)
USICR = (1 << USISIE) | (1 << USIOIE) | (1 << USIWM1 ) | (1 << USIWM0) | (1 << USICS1);
ISR(USI_START_vect)
{
USISR &=~(15);
USISR |=(15);
i2c_state = I2C_START_WAITING;
buf_add_byte(start);
USISR |= (1 << USISIF);
}
ISR(USI_OVERFLOW_vect)
{
USISR &=~(15);
if( i2c_state & 0x03 )
{
USISR |= (14);
//buf_add_byte(USIBR);
buf_add_byte(USIDR);
i2c_state = I2C_ACK_RECEIVING;
}
else if( i2c_state == I2C_ACK_RECEIVING )
{
//if( USIBR & 0x1 )
if( USIDR & 0x1 )
buf_add_byte(nack);
else
buf_add_byte(ack);
i2c_state = I2C_DATA_RECEIVING;
}
else if( i2c_state == I2C_START_WAITING )
{
i2c_state = I2C_ADDR_RECEIVING;
}
USISR |= (1 << USIOIF);
}
The truth is out there...