PIC. Урок 23. Модуль USART. Передача данных. Часть 1



Сегодня мы начнём изучение программирование очень интересного интерфейса — это интерфейс USART.

USART (Universal Synchronous-Asynchronous Receiver-Transmitter (универсальный синхронно-асинхронный приемопередатчик)) — это такая последовательная шина, понодуплексный обменный интерфейс, который необходим для «общения» между собой двух устройств. Как правило используется для обмена данными между устройствами на контроллерах и ПК. Но вполне подходит и для связи между двумя микроконтроллерами, а также для связи любых устройств, где данная шина поддерживается.

В обиходе также используется аббревиатура UART — это тот же USART, но без синхронизации. Мы не будем использовать синхронизацию, так как и без этого данные нормально доходят, правда для этого на обоих соединяемых устройствах должна быть выставлена одна и та же скорость передачи.

Чтобы соединить два устройства по шине USART (UART), мы должны ножку TX одного устройства подключить к ножке RX другого и, наоборот, ножку RX одного устройства мы подключаем к ножке TX другого. То есть данные с выхода одного устройства попадают во вход другого и наоборот. Всё это можно наглядно представить в виде вот такой схемы

 

 

 

Поговорим немного, как передаются данные по шине USART.

Приблизительно диаграмма передачи данных по USART выглядит вот таким образом

Биты, обозначения которых даны в фигурных скобках, могут не использоваться при определённых режимах.

В начале диаграммы мы видим, что когда шина не используется и данные по определённому проводу не передаются или не принимаются в зависимости от назначения контакта, то данный контакт находится в высоком состоянии. Как ещё принято говорить, что пассивное состояние на шине высокое. Дальше идёт обязательный стартовый бит. Как видим, он направлен вниз, то есть в это время контакт переходит из высокого состояния в низкое. Сколько времени длится данный бит, подсчитать немудрено. Нужно 1 секунду разделить на скорость, установленную для передачи и приёма данных, которая измеряется в битах в секунду ну или, как ещё называют, в бодах. После того, как время стопового бита истечёт, контроллер будет считать следующие биты информационными. Их может быть от пяти до девяти в зависимости от режима. Вообще, чаще всего используется именно 8, так как удобнее всего данные передавать байтами. Ну здесь уже состояние ножки во время передачи определённого информационного бита будет диктоваться собственно самим информационным битом. То есть если надо передать единицу — то высокое, если ноль — низкое. Важно заметить также что передача информационных битов начинается с самого младшего, и затем более старшие.

Следующий бит P — это бит чётности. В зависимости от режима он может быть, а также его может и не быть. То есть когда мы передаём один блок, он будет выставлен, а следующий — сброшен, для ещё большей синхронизации.

Затем идут стоповые биты, гласящие о том, что передача посылки закончена. Данных битов может быть один или два также в зависимости от режима. Данные биты передаются с помощью организации высокого логического состояния на ножке. И затем процесс повторяется сначала, то есть передаём следующую посылку.

Теперь давайте познакомимся с процессом обмена данных по USART в нашем контроллере PIC16.

Модуль USART в контроллере PIC16 может работать в одном из трёх режимов:

  1. асинхронный, полный дуплекс,
  2. синхронный ведущий, полудуплекс,
  3. синхронный ведомый, полудуплекс.

Мы будем использовать только первый режим, поэтому в рамках нашего занятия для экономии времени последние два рассматриваться не будут.

Ножки для USART используются строго определённые — RC6 и RC7. Направление ножек устанавливается на вход (TRISC<7:6> = 1).

Тактирование в асинхронном режиме осуществляется от тактового генератора частоты обмена BRG, впрочем от которого также тактируется и шина I2C в модуле MSSP, что делает почти невозможным использование шин I2C и USART одновременно. Тактирование шины USART в синхронном режиме может также осуществляться от шины тактирования CK, когда устройство будет ведомым.

 

 

Чтобы понять, как работает шина USART у нашего контроллера, и чтобы её настроить, нам необходимо изучить регистры, которые управляют данным процессом, а также за ним следят.

TXSTA: TRANSMIT STATUS AND CONTROL REGISTER (ADDRESS 98h)

(Регистр состояния и управления передатчика)

Рассмотрим отдельные биты данного регистра.

CSRC — Clock Source Select bit (выбор источника тактирования)

Синхронный режим:

1 — тактирование от генератора частоты обмена BRG в режиме ведущего

0 — тактирование от ножки CK в режиме ведомого

Асинхронный режим: значение не важно.

TX9 — 9-bit Transmit Enable bit (разрешение 9-битной передачи)

1 — 9-разрядная передача

0 — 8-разрядная передача.

TXEN — Transmit Enable bit (разрешение передачи)

1 — передача разрешена

0 — передача запрещена.

Примечание: Биты SREN/CREN отменяют действие биты TXEN в синхронном режиме.

SYNC — USART Mode Select bit (режим работы USART)

1 — синхронный

0 — асинхронный.

BRGH — High Baud Rate Select bit (включение высокоскоростного режима обмена)

1 — Включен

0 — Выключен.

TRMT — Transmit Shift Register Status bit (флаг очистки сдвигового регистра передатчика TSR, только для чтения)

1 — TSR очищен

0 — TSR полон.

TX9D — 9th bit of Transmit Data, can be Parity bit (9-й бит передаваемых данных, может использоваться для проверки чётности)

1 — включен

0 — выключен

 

 

Следующий регистр

RCSTA: RECEIVE STATUS AND CONTROL REGISTER (ADDRESS 18h)

(Регистр состояния и управления приёмника)

Назначение битов данного регистра:

SPEN — Serial Port Enable bit (разрешение работы порта USART)

1 — модуль включен

0 — модуль выключен.

RX9 — 9-bit Receive Enable bit (разрешение 9-битного приёма)

1 — 9-разрядный приём

0 — 8-разрядный приём.

SREN — Single Receive Enable bit (разрешение одиночного приёма)

Асинхронный режим: значение не важно

Синхронный режим — ведущий

1 — одиночный приём разрешён

0 — одиночный приём запрещён

Синхронный режим — ведомый: значение не важно

CREN — Continuous Receive Enable bit (разрешение приёма)

Асинхронный режим:

1 — приём разрешён

0 — приём запрещён

Синхронный режим:

1 — приём разрешён (при установке данного бита бит SREN автоматически сбрасывается)

0 — приём запрещён

ADDEN — Address Detect Enable bit (разрешение детектирования адреса)

Асинхронный 9-битный режим:

1 — Детектирование адреса разрешено. Если последний 9-й бит в регистре RSR равен 1, то генерируется прерывание и загружается приёмный буфер

0 — Детектирование адреса запрещено. Принимаются все биты, 9-й бит может использоваться для проверки чётности.

Асинхронный 8-битный режим: значение не важно.

FERR — Framing Error bit (ошибка кадра, сбрасывается при чтении регистра RCREG)

1 — произошла ошибка кадра

0 — нет ошибки

OERR — Overrun Error bit (ошибка переполнения внутреннего буфера, сбрасывается при сбросе бита CREN)

1 — произошла ошибка переполнения

0 — нет ошибки

RX9D — 9th bit of Received Data (9-й бит принимаемых данных, может использоваться для проверки чётности)

1 — включен

0 — выключен

Теперь посмотрим, как же данные передаются по шине USART

Как только мы загрузили данные в регистр буфера TXREG, они переместятся в сдвиговый регистр TSR. Для этого также должны быть соблюдены некоторые условия. Одно из них то, что в данный момент шина должна быть свободна. То есть мы получили последний стоповый бит предыдущей передачи и после этого сразу же данные из буфера TXREG перемещаются в регистр TSR, если, конечно, данные в буфере TXREG присутствуют. После этого генерируется прерывание TXIF, если оно конечно разрешено битом TXIE регистра PIE1. И, как только биты переместятся в TSR, при условии, что у нас передача разрешена установкой бита TXEN, данные начнут передаваться с ножки TX.

Теперь посмотрим, как данные принимаются, чтобы нам к этому больше не возвращаться

При приёме данные с ножки RX поступают в регистр RSR. После получения стопового бита данные поступают в регистр RCREG, после чего генерируется прерывание RCIF, которое можно разрешить или запретить включением или выключением бита RCIE в регистре PIE1. Установится флаг прерывания RCIF, который затем программно сбрасывать не нужно, он сбросится аппаратно при чтении регистра RCREG.

Регистр RCREG имеет двойную буферизацию. Поэтому мы можем принять два байта в регистр RCREG и третий в регистр RSR, так что запас некоторый у нас есть, так как байты могут приходить в момент занятости шины или ещё в какой-то момент, когда мы их принять полноценно не можем, вот тогда-то нам и поможет данная буферизация.

Также стоит рассмотреть, как мы можем установить требуемую скорость передачи данных USART для нашего модуля. Мы помним, что для тактирования шины USART используется генератор BRG. Данный генератор управляется значением регистра SBRG, а также включением или выключением бита BRGH.

Скорость рассчитывается следующим образом (нажмите на картинку для увеличения изображения)

Только нам, наоборот, нужно вычислить не скорость (она известна), а значение, которое мы будем заносить в регистр SPBRG. Для этого нужно просто перевернуть немного формулу, что несложно, либо воспользоваться готовой таблицей, которая дана в технической документации. Таблицу я сюда приводить не буду, так как она очень громоздкая, и вы сможете посмотреть её в даташите.

В практической части нашего занятия мы подключим нашу плату с контроллером PIC16F877A к ПК с помощью переходника, так как у ПК нет разъёма для USART и мы для этого должны преобразовать сигнал от шины USART в сигнал USB, а затем уже передать его на ПК. Существует очень огромное количество таких переходников, мы даже, изучая подобную тему для контроллера AVR, пользовались самодельным, который также нетяжело изготовить из старого DATA-кабеля телефона.

На данном уроке мы будем пользоваться вот таким вот переходником FTDI на микросхеме FT232

Данный переходник в моей практике показал себя с лучшей стороны и поэтому я его постоянно использую. Ссылку на него я дам в конце статьи.

Также на данный переходник всегда есть драйвера и они всегда отлично работают в различных ОС.

Контакт GND данного переходника мы соединим также с контактом GND нашей платы, контакт RxD — с контактом TX, а контакт TxD — с контактом RX

Подключим также логический анализатор к тем же ножкам платы, только воспользуемся для этого официальным разъёмом USART, подключим программатор и подключим и переходник, и программатор, и логический анализатор к ПК соответствующими кабелями USB

Если что-то мы в теории недосмотрели, то разберёмся в процессе написания проекта, к которому мы перейдём в следующей части нашего урока, в которой мы также настроим наш модуль USART и научим его передавать данные различных типов.

 

 

Предыдущий урок Программирование МК PIC Следующая часть

 

 

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

PIC Модуль USART. Передача данных

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*