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

Глава 3. Периферийные устройства и прерывания 55 Однако эта простая идея натыкается на определенные трудности. Для приемника и передатчика, связанных между собой двумя проводами (два сигнальных провода: «туда» - TxD и «обратно» - RxD), · приходится задавать скорость передачи и приема, которая должна быть одинакова для устройств на обоих концах линии. Число передаваемых/принимаемых битов в секунду носит название битрейта (Ьitrate). Как мы уже говорили, в нашем случае биты в секунду совпадают с бода­ ми - числом посылок в секунду, поэтому нередко скорость передачи указывают именно в бодах (в Arduino это общепринятая практика), хотя, строго говоря, это неправильно. ПРИМЕЧАНИЕ В обозначениях интерфейсов (двухпроводный, трехпроводный и т. п . ) принято считать только сигнальные линии . Но не следует забывать, что в большинстве случаев, по крайней мере, шины заземления устройств также должны соединяться , поэтому .фор­ мально двухпроводный UART предполагает как минимум три соединительных прово­ да , трехпроводный SP I - четыре и т. д. Вместе с тем есть и «настоящие» двухпро­ водные интерфейсы - к ним относится , скажем , RS-485 (с некоторыми нюансами) , модемная линия или коаксиальный Etheгпet. Однако установления нужной скорости передачи еще недостаточно. Проблема со­ стоит в том, что приемник и передатчик - это физически совершенно разные сис­ темы, и скорости эти для них не могут быть строго одинаковыми в принципе (хотя бы из-за разброса параметров тактовых генераторов), и даже если их каким-то образом синхронизировать в начале, то они в любом случае быстро «разъедутся» . Чтобы избежать этого, в RS-232 передача каждого байта сопровождается старто­ вым битом, который служит для начальной синхронизации. После него идут восемь (или девять - если задана проверка на четность, а также в некоторых других слу­ чаях) информационных битов, а затем стоповые биты, которых может быть один, два и более (в большинстве случаев это не имеет принципиального значения, пото­ му что в паузах между импульсами линия находится обычно в состоянии непре­ рывного стопового бита) . Общая диаграмма передачи таких последовательностей показана на рис . 3 .2 . Здесь она приведена в обычных логических уровнях UART, т. е. в положительной логике с логическими уровнями 0-5 вольт или 0-3 вольта, в зависимости от питания . Хит­ рость заЮiючается в том, что состояния линии при передаче стартового и стопового битов имеют разные уровни: стартовый бит передается низким уровнем напряже­ ния (логическим нулем), а стоповый - высоким уровнем (логической единицей), потому начало стартового бита всегда распознается однозначно. В момент начала передачи стартового бита и происходит синхронизация . Приемопередатчики UART в АVR тактируются 1 6-кратной частотой по отношению к установленной скорости обмена. Приемник отсчитывает от фронта стартового бита несколько тактов (чтобы попасть в середину стартового бита) и три такта подряд проверяет состояние линии (оно должно быть логическим нулем). Если все три состояния совпали, то прини­ мается решение, что действительно пришел стартовый бит. Тогда восемь (или девять, если это задано заранее) раз подряд с заданным периодом регистрируется состояние линии (это т. н. процедура восстановления данных). Данные в UART

RkJQdWJsaXNoZXIy MTExODQxMg==