48437

[i] Упрощенная схема Echo и разбор кадра UART

Автор статьи: Лампадов Илья Александрович (Инженер)
Дата последнего изменения: 29.11.2023 17:01:09
Материал из настоящей статьи, относящийся к микросхеме К1986ВЕ92QI, распространяется в том числе на микроконтроллеры К1986ВЕ92FI, К1986ВЕ92F1I и К1986ВЕ94GI

Данный материал подготовлен на основании существующей статьи по работе с UART на микроконтроллерах компании "Миландр".

Статья поделена на две части:

  • В первой части статьи будет описана простая реализация эхо-сигнала на примере микроконтроллера К1986ВЕ92QI. Благодаря библиотеке SPL, данный пример может быть адаптирован под любой другой микроконтроллер производства "Миландр".
  • Во второй части приведен разбор кадра, присланного с UART, рассмотрены его базовые составляющие.

Для общения с микроконтроллером будет использоваться разъем типа RS-232. Подключение будет происходить к разъему типа "Папа" на микроконтроллере с помощью нуль-модемного кабеля, входящего в состав отладочной платы, обратный конец которого подключить к компьютеру можно с помощью переходника RS232-USB. Для отправки и приёма команд используется терминальная программа: например, PuTTY или Terminal v1.9b.

1. Разбор программы, реализующей ЭХО-сигнал.

Разберем стандартный пример ArraySend, входящий в состав пака IDE Keil для микроконтроллеров в пластиковых корпусах. Проект демонстрирует следующую работу: символы, введенные на персональном компьютере, будут отправлены сначала на микроконтроллер, а затем обратно. В начале нужно создать структуры для инициализации портов и блока UART. В основной функции main проинициализируем массив кодом:

Фрагмент кода 1

static uint8_t ReciveByte[16];
Данный массив и будет содержать данные для обмена.

Не забудем применить настройки тактирования к UART от внешнего источника HSE, который тактирует микроконтроллер, чтобы осуществить высокую точность передачи. Далее мы должны сконфигурировать порт B для микроконтроллера К1986ВЕ92QI, в том числе на выход для TX и на вход для RX.

Заполнение структуры инициализации для UART и применение всех настроек вынесено для объяснения в код ниже с подробными комментариями:

Фрагмент кода 2

/* Применение внешнего тактирования для UART1 и UART2 */ RST_CLK_PCLKcmd(RST_CLK_PCLK_UART1, ENABLE);

/* Делитель частоты = 1 для UART */
UART_BRGInit(MDR_UART1, UART_HCLKdiv1 );

/* Заполнение структуры инициализации UART */
UART_InitStructure.UART_BaudRate = 115200; // Скорость обмена UART_InitStructure.UART_WordLength = UART_WordLength8b; // Количество бит-данных UART_InitStructure.UART_StopBits = UART_StopBits1; // 1 стоп-бит UART_InitStructure.UART_Parity = UART_Parity_No; // Четность отключена UART_InitStructure.UART_FIFOMode = UART_FIFO_ON; // Буфер включен UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE; // Разрешение работы приемопередатчика

/* Применение параметров структуры к UART1*/
UART_Init(MDR_UART1, &UART_InitStructure);

/* Включение UART1 */
UART_Cmd(MDR_UART1, ENABLE);

Для непрерывного обмена данными между микроконтроллером и компьютером в бесконечном цикле while(1) расположим два цикла for, которые условно будут названы "Получение" и "Отправка".

В блоке “Получение” микроконтроллер ожидает, когда на блок UART поступит информация, чтобы заполнить буфер. Ожидание заполнения буфера контролируется флагом UART_FLAG_RXFE (Буфер FIFO приемника пуст). После того, как в буфер поступили данные, происходит присвоение данных буфера массиву, созданному в начале с названием ReciveByte

Блок “Отправка” передает ранее полученный массив ReciveByte обратно на компьютер командой UART_SendData.

Фрагмент кода 3

while (1)
          {
          /* Заполнение данных в массив */
          for (i = 0; i < 16; i++)
               {
               while(UART_GetFlagStatus(MDR_UART1, UART_FLAG_RXFE ) == SET);
               ReciveByte[i] = UART_ReceiveData(MDR_UART1 );
               }

               /* Отправка массива по UART во внешнюю среду */
               for (i = 0; i < 16; i++)
               {
               while (UART_GetFlagStatus(MDR_UART1, UART_FLAG_TXFE ) != SET);
               UART_SendData(MDR_UART1, (uint16_t) ( ReciveByte[i]));
               }
         }

Проверка работоспособности.

После того, как мы записали программу в микроконтроллер, можно установить связь с микроконтроллером по интерфейсу RS-232. Для простоты и наглядности работы примера был использован терминал PuTTY. Настраиваем подключение к микроконтроллеру, наглядно на рисунке 1.

  • 1. Выбираем Serial во вкладке “Тип соединения”
  • 2. Нужно указать действующий COM-порт. Это можно узнать в диспетчере устройств, вкладка COM-порты.
  • 3. Нужно задать скорость для связи персонального компьютера и микроконтроллера (в коде программы скорость была задана 115200 бод, то есть, бит в секунду, поэтому здесь ставим такую же)
  • 4. Производим подключение.

Рисунок 1 - Настройки терминала Putty

После подключения можно набрать набор символов на клавиатуре, и они отобразятся в консоли – именно эти данные и были пересланы с микроконтроллера после отправки их со стороны компьютера. Как пример, информация приведена на рисунке 2.

Рисунок 2 - Рабочее окно терминала Putty

2. Разбор структуры кадра UART с помощью осциллографа

Произведем модернизацию кода для удобства снятия показаний осциллографом для разбора структуры стандартного кадра UART.

Для этого мы вместо программы, отправляющей эхо-сигнал в бесконечном цикле while(1), добавим одну единственную команду, которая будет постоянно посылать пакет с одним и тем же содержанием, при этом оставив предыдущие настройки по инициализации UART:

  • Скорость – 115200 бод (бит в секунду).
  • Длина слова – 8 бит.
  • Один стоповый бит.
  • Четность отключена.

Функция отправки данных:

Фрагмент кода 4

UART_SendData(MDR_UART1, 0x6E); // Непрерывная отправка десятичного числа 110 (bin 0110 1110)

Чтобы подключиться с помощью осциллографа, нужно отключить кабель COM-порта, используемый в первой части статьи, а щуп расположить на третью верхнюю ножку порта RS-232, именно на этот вывод микроконтроллер присылает данные (TX). Схематично представлено на рисунке 3:

Рисунок 3 - Распиновка коннектора DB9M

В итоге, если мы всё сделали правильно, то на осциллограмме появятся сигналы логических уровней. Учтем, что сигнал с выхода RS-232 инвертирован, а логические уровни выстраиваются с младшего разряда числа. Рисунок 4 в качестве примера ниже:

Рисунок 4 - Осциллограмма кадра UART с его последующим разбором

На рисунке наглядно показана структура принимаемого кадра с UART. В стандартном кадре еще присутствует бит чётности, но по настройке проекта он отключен. В качестве практики Вы можете добавить бит четности в структуре инициализации UART и посмотреть, как изменится кадр.

Сохранить статью в PDF

Теги

Была ли статья полезной?