Цитата(beer_warrior @ Mar 10 2007, 21:35)

Работаю со связкой - SAM7 + Mega8.
Мне сабж всю душу вымотал. Вот именно в аналогичной конфигурации.
Если вкратцее -- у at91sam7x256 недоделанный и глючый TWI. Сбоит и
зависает от любой помехи на шине. И без костылей и подпорок в виде
таймаутов, принудительных сбросов и принудительной же, ручной, манипуляции сигналами с целью освободить шину от "зависших" в таком состоянии slave -- зависает вусмерть. Благо что программно сбрасывается (причём где-то за несколько десятков микросекунд -- какие там процессы при этом внутри происходят, одному Билу Гейцу известно).
При том, что сам протокол I2C так интересно устроен, что отвалившийся
невовремя мастер в свою очередь вводит в неадекватное состояние
подчинённых (TWC если когда пропал невовремя), см. выше. С AVR проще, за ним
неадекватностей не замечено, за исключением того (у меня их много),
что арбитраж в режиме slave они "умеют" (именно, что в кавычках) только
на байтовом уровне. Требуют аккуратного обращения с флагом подтверждения обработки прерывания (ВНИМАНИЕ!) и, похоже, запись в CR без паузы в пару тактов иногда не имеет действия. В итоге -- у меня работает, вроде...
А, да, ещё в догонку. AR91SAM7 не умеет "repeated start condition" (для SMBUS),
впрочем ARV их толком и не распознаёт...
Цитата
SAM7 пишет управляющий байт и читает байт статуса.
И вот интересная картина получается. Поставил как возврат статуса константу 0x55.
1. После включения питания первое чтение 0x55, второе 0xFF, все последующие - 0x55.
2. После записи первое чтение 0xFF, все последующие - 0x55.
90%, что забыл, что в конце последнего байта NACK давать надо.
А, ещё одно. Перед установкой MREAD прочитай RHR...