Ревич, Ю.В. Программирование микроконтроллеров 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
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==