Как мило, оказывается модераторы перенесли тему в "интерфейсы"! А то, что она называется I2C в
AVR - это ничего? И вопрос был именно о коде состояния "Last data byte in TWDR has been transmitted", имеющейся только в AVR? И, конечно, в раздел для начинающих - после того, как она сутки провисела в разделе AVR и на нее пришел только один ответ - да, значит только начинающие могут рассказать о тонкостях в кодах состояния контроллера I2C!
Цитата(ILYAUL @ May 29 2010, 01:32)

Ваш slave работает в режиме "Ведомый передатчик" и может передавать данные сколько ему угодно. При передачи последнего байта , не забудьте сбросить бит TWEA , после чего передачик "впадёт" в состояние $C0 "думая" , что сейчас он получит NA , но получит естественно ACK , после чего уже и перейдёт в состояние С8 и будет гнать на шину SDA FFаки. Т.е сам то он остановится.
Спасибо, я тоже наконец прочитал.

Сам он остановится, но мастер об этом не узнает. То есть сбрасывает TWEA он для самого себя.
Я решил изменить протокол - первым байтом всегда передается длина, а приемник, получив первый байт, сразу узнает сколько байт придет. Немного через задницу, но зато можно обойтись без отдельного запроса длины, как предлагал Kane
Цитата(ILYAUL @ May 29 2010, 01:32)

Мастер в регистре TWSR будет иметь скорее всего код 50 , т.е будет продолжать приём байтов. Можно попробывать отловить "неожиданный" пакет FF и сбросить мастер.
А вдруг FF будет среди байтов данных?
Цитата(ILYAUL @ May 29 2010, 01:32)

Cам slave правильно остановить обмен не сможет , но он может "засадить" ,программно , шину SCL в 0 , после чего уже мастер не получив нормальный код ответа прекратит передачу. Не правильно это, но попробывать можно.
Не получится, если засадить SCL в 0, то мастер остановится и будет ждать пока он не освободится, и ждать будет до бесконечности. Slave использует это для задержки передачи данных если они еще не готовы.