Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 13. Интерфейс ТW/ (12С) и его применение 345 ЗАМЕТКИ НА полях Это надо иметь в виду при подключении готовых модулей с 1 2 С-интерфейсом - они обычно имеют встроенные «подтягивающие» резисторы в пределах 4, 7-1 0 кОм , при­ чем чаще встречается сопротивление, равное нижнему пределу 4,7 кОм . И подключе­ ние более трех модулей к одной шине не рекомендуется . Обычно более трех и не требуется , но об этом надо помнить и стараться вместо готовых модулей (например, часов или каких-нибудь датчиков) устанавливать соответствующую «голую» микро­ схему, что обычно и удобнее, и существенно дешевле. Обратите внимание, что все устройства в этом случае обязаны иметь выход с «от­ крытым коллектором», а привязка к шине питания обеспечивается парой этих са­ мых внешних резисторов . Как мы знаем, выходы портов АVR построены иначе - по симметричной КМОП-схеме с третьим состоянием. Чтобы обеспечить совмес­ тимость с «открытым коллектором» и в программной имитации 1 2 С, и в аппаратном TWI предусмотрен хитрый прием : состояние «разрыва» (т. е. выключенного тран­ зистора на выходе) имитируется установкой выхода в третье состояние, т. е. факти­ чески - в режим работы вывода порта на вход, а включенное состояние - уста­ новкой вывода порта на выход и при этом обязательно в состояние логического нуля. ЗАМЕТКИ НА полях При такой постановке дела в качестве «подтягивающих» использовать встроенные резисторы портов неудобно - приходится каждый раз при переключении на вход сле­ дить за их подключением через регистр данных PORT х. Кроме того , номинал встроен­ ных «подтягивающих» резисторов чересчур велик и годится только для самых мед­ ленных скоростей обмена. Потому в схемах с интерфейсом 1 2 С принято всегда ставить внешние «подтягивающие» резисторы . Нужно только не забывать о том , что при пере­ ходе в «спящий» режим выводы , подсоединенные к этим резисторам, нельзя остав­ лять в состоянии выхода с логическим нулем . Вообще-то сам протокол 1 2 С такого не позволяет (о чем далее) , но лишний раз убедиться в этом никогда не вредно. Чтобы несколько соединенных по интерфейсу I 2 c устройств отличались друг от друга, каждое из них обязано иметь индивидуальный адрес . Он задается 7-битовым кодом (восьмой - младший - бит байта адреса служит для других целей, как мы увидим далее), потому всего таких устройств на одной линии может быть 1 27 . Этот адрес обычно задает изготовитель (в некоторых случаях его можно изменить про­ граммно или внешними соединениями). За право присвоения индивидуального ад­ реса изготовитель, возможно, по сей день платит лицензионные отчисления фирме Phi l ips - так или иначе, но найти два разных устройства с одинаковыми адресами мне не удалось. В самом АVR он, разумеется, задается программно, но для наших целей этого не потребуется, т. к. «мастер» (МК) у нас один, и «ведомые» устройст­ ва не будут к нему обращаться . Типовой вариант обмена информацией по интерфейсу I 2 c показан на рис . 1 3 . 2 . Кратко расшифруем эту диаграмму. Любой сеанс передачи по протоколу I 2 c начи­ нается с состояния линии, именуемого START (когда сигнал на линии SDA меняет­ ся с логической 1 на логический О при высоком уровне на линии SCL). START мо­ жет выдаваться неоднократно - тогда он называется «повторный старт». Заканчи­ вается сеанс сигналом STOP (состояние линии SDA меняется с логического О на

RkJQdWJsaXNoZXIy MTExODQxMg==