======Упрощенная схема Echo и разбор кадра UART======
//Данный материал подготовлен на основании существующей [[https://startmilandr.ru/doku.php/prog:uart:echo_rate|статьи]] по работе с UART на МК "Миландр".//
Статья поделена на две части:
* В первой части статьи попробуем описать более простую реализацию эхо-сигнала на примере МК 1986BE4, но благодаря SPL, данный пример может быть адаптирован под любой другой МК производства "Миландр".
* Во второй же части попробуем разобрать кадр, присланный с UART, и разбить его на базовые составляющие.
//Для общения с МК будем использовать разъем типа RS-232. Подключение будет происходить к разъему типа "Папа" на МК с помощью нуль-модемного кабеля, входящего в состав отладочной платы, обратный конец которого подключить к компьютеру можно с помощью переходника RS232-USB.
Для отправки и приёма команд используется терминальная программа: например, PuTTY или Terminal v1.9b.//
**1. Разбор программы, реализующей ЭХО-сигнал.**
Мы разберем стандартный пример ArraySend, входящий в состав пака Keil для МК серии 1986BExx. Проект демонстрирует следующую работу: символы, введенные на ПК, будут отправлены на МК и обратно.
В начале нужно создать структуры для инициализации портов и блока UART.
В основной функции main, мы должны инициализировать массив кодом:
static uint8_t ReciveByte[16];
Данный массив и будет содержать данные для обмена.
Нужно не забыть применить настройки тактирования к UART от внешнего источника HSE, который тактирует МК, чтобы осуществить высокую точность передачи.
Далее мы должны сконфигурировать порт B для МК 1986BE4, в том числе на выход для TX и на вход для RX.
//Заполнение структуры инициализации для UART и применение всех настроек вынесено для объяснения в код ниже с подробными комментариями://
/* Применение внешнего тактирования для 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//.
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. Выбираем Serial во вкладке “Тип соединения”
* 2. Нужно указать действующий COM-порт. Это можно узнать в диспетчере устройств, вкладка COM-порты.
* 3. Нужно задать скорость для связи ПК и МК (в коде программы скорость была задана **115200** бод, то есть, бит в секунду, поэтому здесь ставим такую же)
* 4. Подключаемся. =)
{{prog:uart:uart_putty_1.png}}
После подключения можно набрать набор символов на клавиатуре, и они отобразятся в консоли – именно эти данные и были пересланы с МК.
{{prog:uart:uart_putty_2.png}}
**2. Разбор структуры кадра UART с помощью осциллографа**
По схеме подключения и коду, что представлены в первой части статьи, не очень удобно снимать показания с помощью осциллографа, чтобы разобрать структуру стандартного кадра UART.
Для этого мы вместо программы, отправляющей эхо-сигнал в бесконечном цикле **while(1)**, добавим одну единственную команду, которая будет постоянно посылать пакет с одним и тем же содержанием, при этом оставив предыдущие настройки по инициализации UART:
* Скорость – 115200 бод (бит в секунду).
* Длина слова – 8 бит.
* Один стоповый бит.
* Четность отключена.
Функция отправки данных:
UART_SendData(MDR_UART1, 0x6E); // Непрерывная отправка десятичного числа 110 (bin 0110 1110)
Так же, чтобы подключиться с помощью осциллографа, нужно отключить кабель COM-порта, используемый в первой части статьи, а щуп расположить на третью верхнюю ножку порта RS-232, именно на этот пин МК присылает данные (TX).
Схематично представлено на рисунке ниже:
{{prog:uart:uart_com_port.png}}
В итоге, если мы всё сделали правильно, то на осциллограмме появятся сигналы логических уровней. Учтем, что сигнал с выхода RS-232 инвертирован, а логические уровни выстраиваются с младшего разряда числа.
{{prog:uart:uart_oscill.png}}
На рисунке наглядно показана структура принимаего фрейма с UART. В стандартном кадре еще присутствует бит чётности, но по настройке он у нас отключен.
Вы можете повторить данный материал, добавить бит четности в структуре инициализации UART и посмотреть, как изменится фрейм.