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

388 Часть 111. Практическое программирование микроконтроллеров АVR водную метеостанцию, не привлекая никаких других контроллеров. Потому такие слу­ чаи нам здесь не очень интересны , и мы рассмотрим только то , что непосредственно касается функций UARТ. Мы также уже упоминали в главе 3, что интерфейс UART двухпроводный (не счи­ тая «земли»), причем линии имеют разное назначение: одна (TxD) - для передачи данных от модуля, другая (RxD) - для приема данных в модуле. Отметим, что не­ смотря на это, регистры данных у модуля UART и на прием, и на передачу распо­ ложены по одному адресу, который носит наименование UDR или UDRx, где х - О, 1 , . . . , если модулей UART более одного (в «наших» контроллерах модуль всего один, потому этот регистр всегда будет именоваться uoR ) . Однако физически реги­ стры данных приемника и передатчика разделены. Кроме того, эти регистры по адресу UDR являются лишь буферами, а собственно передача/прием ведется с по­ мощью отдельных сдвиговых регистров . Потому интерфейс UART считается пол­ нодуплексным, т. е. в каждый момент времени может вестись передача и прием данных одновременно, хотя пишутся и читаются эти данные по одному адресу. В протоколе UART (см. рис. 3 .2 в главе 3) не предусматривается никаких особых состояний «Старт» или «Стоп», как в I 2 c, - просто каждая посылка всегда сопро­ вождается стартовым и стоповым битами для синхронизации (при оговоренной за­ ранее скорости обмена) . Следующая посылка может прийти через произвольный промежуток времени, потому протокол и называется асинхронным. Посылка в большинстве случаев состоит из 8 битов (как обычный байт), но может быть и 9-битовой (с битом контроля четности), а в модулях USART ее длина может со­ ставлять от 5 до 9 битов. В промежутке между посылками линия TxD (если UART инициализирован) нахо­ дится в состоянии логической единицы, а на линии RxD должна присутствовать логическая единица, установленная внешним передатчиком. Поэтому, если UART включен, не рекомендуется эти линии использовать еще для каких-то функций, иначе приемопередатчики могут вас «неправильно понять». Исключением является ситуация, когда по этому интерфейсу контроллеры обмениваются данными друг с другом, - обычно предполагается, что линии RxD и TxD подсоединены к адап­ теру, конвертирующему логические уровни UART в сигналы соответствующего интерфейса (например, RS-232) . Этим определяется основное назначение UART, в отличие от SPI или I 2 c - связь удаленных устройств между собой. Давайте сна­ чала остановимся на том, как организовать обмен данными с персональным ком­ пьютером, т. к. отлаживать прием и передачу с помощью собственно UART удоб­ нее в режиме двухстороннего обмена. Но прежде всего следует затвердить главное правило при любом соединении UART или RS232-портов между собой: Линии передачи и приема всегда соединяются перекрестно! То есть RxD (RX) с одной (первой) стороны подключается к TxD (ТХ) с другой (второй) стороны, и наоборот. Никаких исключений из этого правила не существу­ ет - применение Arduino в качестве USВ-адаптера (см. главу 4) противоречит это­ му правилу лишь по видимости, т. к. перекрестное соединение уже выполнено внутри платы Arduino.

RkJQdWJsaXNoZXIy MTExODQxMg==