Цитата(singlskv @ Jun 22 2008, 19:54)

ИМХО:
- I2C статическая шина просто по определению
- вопросы подвешивания шины должны решаться механизмами таймаутов как на стороне мастера
так и на стороне слейва(особенно при софтовой реализации слейва)
- исходя из статической природы I2C обязателен мониторинг SCL мастером
- снижение скорости шины(для устройств которы не готовы отвечать мгновенно) только уменьшит
Наблюдал однако как LPC с его абсолютно правильным I2C модулем подвисал из-за того, что слейв передерживал SCL. И приходилось переинициализировать модуль.
Поэтому тормозные слейвы лучше сразу в сад. Природа обмена IMHO должна быть синхронной, чтобы мастер с множеством других девайсов на шине никак не зависел от конкретного одного слейва.
И я очень рад, что в SAM синхронный модуль.
Цитата
ИМХО, конкретный пример:
- слейв - микроконтроллер
- запрос от мастера может иметь разную длинну
- при получении запроса от мастера слейв должен чего-нить сделать(банально скопировать
запрошенные данные в буфер обмена)
- время готовности слейва зависит от типа(длинны)/сущности запроса
Пример не убедительный. Предложу свой протокол, который решает проблемы задержек при обмене МК-МК.
типы транзакций:
1. Команда (от мастера к слейву)
2. Ответ (от слейва к мастеру)
3. Индикатор (от слейва к мастеру)
4. Подтверждение индикатора (от мастера к слейву) по формату то же что и "1".
Теперь как это работает.
A. каждый пакет начинается байтом длины (что накладывает ограничение на длину пакета - 255)
B. от мастера к слейву - никаких проблем, мастер просто передает блок данных, слейв просто принимает и складывает по прерыванию каждый байт данных. (уж положить байт в буфер не бог весть какая задача, если программа сделана без delay_ms в обработчиках прерываний, то ACK слейв сформировать без задержек успеет).
C. По приему всего пакета слейв начинает его разбор. Столько веремени сколько нужно. Мастер в это время волен общаться с другим слейвом.
D. мастер забирает ответ слейва или индикатор (от слейва к мастеру).
- Если у слейва есть что отправить (команда выполнена есть
подготовленный к отправке "ответ", или есть запрос к мастеру "индикатор"), то первым байтом слейв передает длину блока. Мастер инициализирует счетчик ожидаемых байт и продолжает прием, зная когда надо отправить NACK на последный байт.
- Если у слейва ответ не подготовлен, то он сразу шлет 0 без разбора, мастер ставит NACK, вытаскивает еще один байт данных, завершает обмен. И переходит к другому слейву.
Вот и все, все синхронно и никаких задержек.
PS: в моей системе мастер выполняет роль маршрутизатора (принимает данные с одного быстрого канала и шлет (направляет пакеты) на несколько до 64х медленных каналов, которые обслуживаются I2C слейвами mega'ми). Мастер раздает команды всем слейвам, потом забирает ответы.