Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 13. Интерфейс ТWI (12С) и его применение 347 протокол поддерживает (в том числе и в описаниях AVR, изложенных по-русски в [6,7]) . Как видим, организовать обмен по протоколу 1 2 С непросто, но это плата за универ сальность и простоту электрической схемы. Большинство современных устройств с интерфейсом I 2 c могут работать с тактовой частотой до 400 кГц и более, но из-за не слишком высокой помехоустойчивости такой линии, максимальные частоты це лесообразны только, когда микросхемы установлены на одной плате недалеко друг от друга. При соединении проводами (например, МК с каким-нибудь датчиком) лучше ограничиться частотами до 1 00 кГц, а при длинных линиях связи (провода в полметра длиной и более) частоту обмена следует снизить до 1 0-3 0 кГц. Мы, вслед за разработчиками библиотеки Wire для Arduino, будем ориентироваться на величину 1 00 кГц, как наиболее универсальную. П рограммная эмуляция протокола 12С Мы рассмотрим только программную эмуляцию этого протокола, и свою задачу сформулируем так: есть контроллер, и есть некое (одно или более) внешнее устрой ство. Нужно прочесть/записать данные . Контроллер тут всегда будет выступать как Master, а устройство - как S lave . Для того чтобы программно эмулировать прото кол I 2 C, нам тогда придется сначала решить вопрос о том, как формировать такти рующую последовательность на линии SCL. Это, конечно, можно сделать с помощью таймера, что на самом деле неудобно - и таймеры обычно заняты более полезными делами, и нет тут у нас каких-либо жестких требований ни к стабильности, ни к конфигурации сигнала. Потому мы воспользуемся способом формирования временной задержки на основе пустого цикла (см. главу 6) и задействуем для формирования импульса счетчик cnt (пусть это будет регистр из числа старших: от rl б до rЗl ) . Тогда простейший пустой цикл, повторенный NN раз, запишется так: ldi cnt , NN cyk_delay : dec cnt brne cyk_delay Подсчитаем, чему должно равняться число NN. Пусть мы хотим обеспечить такто вую частоту 1 2 С около 1 00 кГц, тогда длительность одного импульса (полпериода тактовой частоты) должна равняться примерно 5 мкс . Сам цикл занимает три такта (команда dec один такт + команда brne с переходом - два такта), т. е. , например, при частоте кварцевого генератора 4 МГц цикл будет длиться 0,75 мкс . Итого, что бы получить при этой частоте импульс в 5 мкс, нам нужно повторить цикл 6-7 раз . Выбираем меньшее число из этих двух, поскольку вызов процедуры и возврат из нее занимают сами по себе не менее 7 тактов . Точно подогнать частоту не удастся, но это и не требуется, - работоспособность I 2 c от частоты не зависит, главное - не превышать максимально допустимую скорость обмена для выбранного устрой ства.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==