Цитата(Папа Карло @ Jan 10 2009, 12:06)

Объясните пожалуйста, как мне сделать, чтоб ведущий прекратил приём при окончании символов в буфере ведомого ?
Сделать соответвующий протокол... Который будет следовать хотя бы трем основным пунктам:
1. Слейв первым байтом шлет длину сообщения, если нечего слать - соответвенно первым байтом шлет 0.
2. Мастер посылает
NACK перед приемом последнего байта.
3. Когда слать больше нечего (сообщение полностью отправлено),
Слейв всегда шлет GAP символ 0xA5
до тех пор пока мастер выдает ACK.
(выделенное - должно быть реализовано обязательно!)
т.о. даже если слейву вообще нечего слать, минимальная I2C транзация будет состоять минимум из двух символов - 0x0 (длина) и GAP (т.к. мастер перед приемом первого символа всегда выдает ACK).
По Вашему коду, конкретно по состояниям 0xA8 и 0xB8:
Код
case 0xA8:
case 0xB8://Data transmitted, ACK received
if(i2c_size--) // if got no more data to send not last data byte transmitted
{
I2C0DAT = *i2c_data++; // send next data byte
I2C0CONSET = 0x04;//
}
else
{
I2C0CONCLR = 0x04;//
i2c_stat = 0; //
i2c_size = 0;
}
break;
поменяйте на:
Код
case 0xA8: // SLA+R (slave transmitter start)
if(!i2c_size) // NO DATA TO SEND?
I2C0DAT = 0; // Notify Master - we have no data
else
I2C0DAT = i2c_size; // send message len
I2C0CONSET = 0x04; // enable ACK for data byte
break;
case 0xB8: //Data transmitted, ACK received
if(!i2c_size) // NO DATA TO SEND?
I2C0DAT = 0xA5; // MUST send GAP data byte
else
{
i2c_size--;
I2C0DAT = *i2c_data++; // send next data byte
}
I2C0CONSET = 0x04; // enable ACK for data byte
break;
Цитата(singlskv @ Jan 10 2009, 21:47)

А у AVR разьве не честный OD ?
Не честный - во всех AVR. В обесточенном состоянии садят шину через защитные диоды (МК питается от шины

).