Цитата
Цитата
основная проблема TWI на SAM7 это то, что он работает в "синхронном" режиме То есть ему глубоко наплевать на то что мега держит линию SCL в 0(пока данные не готовы)и у него (SAM7) весь трансфер происходит "синхронно"то есть SAM7 вобще не мониторит состояние линии SCL перед тем как начать передачу!
Опс! Спасибо за наколку. Как-то внимания не обращал.
А они(Atmel) нигде об этом прямо и не пишут
У них есть только одна фраза на этот счет в документации:
"Модуль TWI прекрасно подходит для обмена информацией с EEPROM производства Atmel"
примерно так

>> if(hTimer_1ms) hTimer_1ms();
>> if(hTimer_1s) hTimer_1s();
Насколько бысторо выполняются эти 2 функции ?
Цитата
Цитата
Я бы в Вашем коде тоже кое-что поменял.
Согласен, код писан 3 года назад и с тех пор кочует по проектам. Вижу косяки, только руки не доходят преписать.
Код
case TWS_DATAW_ACK:
//SLAVE has been transmit a byte and got ACK
//SLAVE transmit next byte
{
break;
}
любая транзакция(прерывание) по i2c должна заканчиваться записью TWINT в TWCR
иначе будем бесконечно ловить прерывания
по этому в конце switch обязательно должно быть:
default:
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
так же обязательно ловить код
#define I2C_BUS_ERROR 0xF8
примерно так:
case (I2c_BUS_ERROR):
TWCR= (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE);
продолжение следует ....