ISR(TWI_vect)
{
status = (TWSR & 0xFC);
UART_SEND(0xFF); UART_SEND(status);
switch (status)
{
case 0x08:
case 0x10:
{
err_flag = 1;//START OK
TWDR = (0xE0 | ((adr << 1) & 0x1F));
TWDR |= BIT(0);//SLA-R
TWCR = ((1 << TWINT)|(1 << TWEN)|(1 << TWEA)|(1 << TWIE));
flag_len=0;
break;
}
case 0x38: //lost prioritet
{
err_flag=0;
flag_len=0;
TWCR = ((1 << TWINT)|(1 << TWEN)|(1 << TWSTO)|(1 << TWIE));
break;
}
case 0x40:
{
if(err_flag==2)
{
goto pp;
}
else
{
err_flag = 2;
TWCR = ((1 << TWINT)|(1 << TWEN)|(1 << TWEA)|(1 << TWIE));
idx=0;
flag_len=0;
}
break;
}
case 0x48:
case 0x00:
{
pp:
err_flag = 0x10;
TWCR = ((1 << TWINT)|(1 << TWSTO)|(1 << TWEN)|(1 << TWIE));
idx=0;
flag_len=0;
break;
}
case 0x50:
{
if(flag_len==0)
{
max_len=TWDR;
flag_len=1;
goto me;
}
else
{
rx_buff[idx]=TWDR;
idx++;
if(idx!=(max_len-1))
{
me:
TWCR = ((1 << TWINT)|(1 << TWEA)|(1 << TWEN)|(1 << TWIE));
}
else
{
TWCR = ((1 << TWINT)|(1 << TWEN)|(1 << TWIE));
}
}
break;
}
case 0x58:
{
if((err_flag & BIT(1)) && (flag_len==1))
{
rx_buff[idx]=TWDR;
idx++;
if(idx==max_len)
{
pp=0;
for(kkk=0;kkk {
pp^=rx_buff[kkk];
}
if(pp!=2)
{
err_flag = 0x20;
goto err_data1;
}
err_flag = 0x04;
}
else
{
err_data:
err_flag = 0x08;
}
err_data1:
TWCR = ((1 << TWINT)|(1 << TWSTO)|(1 << TWEN)|(1 << TWIE));
}
}
}
}