Перекрестные помехи на общей коммуникационной шине MCU (1) — UART и USART
Перекрестные помехи на общей коммуникационной шине MCU (1) — UART и USART

🙌Домашняя страница программиста Акинаяма 😂oi Игрок на пенсии, увлекается Java, большими данными, микроконтроллерами и Интернетом вещей, любит технологии, технологии не виноваты. 🎉Добро пожаловать, подписывайтесь🔎Мне нравится👍Собрать⭐️Оставить сообщение📝

Предисловие

Во-первых, разъясним понятие о коммуникационной шине и протоколе связи в MCU. Коммуникационная шина — это физический интерфейс, используемый для подключения различных периферийных устройств и модулей. Он может передавать данные и управлять информацией. Протокол связи относится к правилам и соглашениям, которым следуют при передаче данных по коммуникационной шине, чтобы обеспечить правильный обмен информацией между различными устройствами. Мы также можем назвать его протоколом коммуникационной шины.

В этой серии статей в основном объясняются следующие протоколы шины, которые читатели могут выбрать в соответствии со своими потребностями:

  1. УАРТ и УАРТ
  2. Шина RS232, RS485
  3. автобус ИИК
  4. Шина SPI
  5. CAN-шина
  6. USB-шина

1. Введение

UART: универсальный асинхронный приемник/передатчик, универсальный асинхронный приемник и передатчик. USART: универсальный синхронный/асинхронный приемник/передатчик, универсальный синхронный/асинхронный последовательный приемник/передатчик.

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

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

2. Формат кадра

UART:

  1. Стартовый бит Bit):Индикация стартового битаданныеначало кадра。это всегдаНизкий логический уровень и указывает на то, что передача данных вот-вот начнется.
  2. данные Кусочек(Data Биты): Биты данных представляют собой фактическую часть передачи данных. Он представляет собой передаваемые данные, которые могут иметь длину 5, 6, 7 или 8 бит, в зависимости от выбранной длины данных.
  3. Паритет Бит): бит проверки является необязательным и используется для обнаружения ошибок во время передачи. Общие методы проверки включают нечетность, четность или отсутствие четности. Выбор контрольных цифр зависит от правил проверки, заранее согласованных обеими сторонами.
  4. Стоповый бит (Стоп Bit):останавливаться Кусочекотметкаданныеконец кадра。это всегдаВысокий логический уровень используется для информирования принимающей стороны о том, что кадр данных передан.

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

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

3. Подключение оборудования

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

  1. Аппаратное соединение UART:
  • UART обычно использует три провода: TX (передатчик), RX (приемник) и земля (GND). Линия TX на передающей стороне соединяется с линией RX на принимающей стороне.,Линия TX на принимающей стороне соединена с линией RX на передающей стороне. также,Заземляющие провода на обоих концах должны быть вместе.,чтобы гарантировать, что опорный потенциал сигналов одинаков.
  • В микроконтроллере или встроенной системе,UART обычно поступает через контакты на чипе.,Например, контакт TX микроконтроллера к контакту RX внешнего устройства.,Вывод RX микроконтроллера подключается к выводу TX внешнего устройства.
  1. Аппаратное обеспечение USART:
  • Метод соединения USART аналогичен UART.,Но в синхронном режиме также требуется линия тактирования (CLK). поэтому,USART обычно использует четыре провода в синхронном режиме: TX, RX, CLK и GND.
  • При синхронизации с USART связью,Отправителю и получателю необходимо использовать тактовый сигнал.,Поэтому для соединения необходимы дополнительные линии синхронизации.

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

4. Режим работы

  • передача данных Симплексный режим (Связь) односторонняя. общение между обеими сторонами,Одна сторона фиксируется как отправитель,Одна сторона фиксируется как принимающая сторона. Информация может распространяться только в одном направлении,Используйте линию передачи.
  • Полудуплексный режим (Полудуплексный режим) Дуплекс) используют одну и ту же линию передачи,Вы можете как отправлять, так и получать данные,Но отправка и получение не могут осуществляться одновременно. передача данных позволяет передавать данные в обоих направлениях,но,данные могут быть отправлены только одной из сторон в любое время,Другая сторона получает данные. Поэтому полудуплексный режим может использовать одну линию данных.,Также возможно использовать две строки данных. Полудуплексная связь требует наличия электронного переключателя трансивера на каждом конце.,Решите, в каком направлении будут передаваться данные путем переключения. Потому что есть переключатель,Так что будет задержка во времени,Эффективность передачи информации ниже.
  • Полнодуплексный режим (Polny Duplex) связи позволяет передавать данные в обоих направлениях одновременно. поэтому,Полнодуплексная связь представляет собой комбинацию двух режимов симплексной связи.,Для этого требуется, чтобы отправляющее устройство и принимающее устройство имели независимые возможности приема и отправки. В полнодуплексном режиме,На каждом конце есть передатчик и приемник,Есть две линии передачи,Эффективность передачи информации высокая.

Очевидно, что при одинаковых других параметрах полнодуплексная передача происходит быстрее и эффективнее полудуплексной.

5. Процесс использования

  1. Инициализация: Сначала необходимо инициализировать модуль UART, включая настройку скорости передачи данных (Baud Скорость), длина бита данных, проверочный бит и стоповый бит и другие параметры. Эти параметры должны соответствовать одноранговому устройству связи, чтобы обеспечить нормальную передачу данных.
  2. Отправка данных: Чтобы отправить данные, сначала запишите данные для отправки в буфер отправки UART. После программной записи данных в буфер передачи модуль UART автоматически отправит данные. Перед отправкой данных необходимо проверить, пуст ли буфер отправки, чтобы гарантировать возможность безопасной записи новых данных.
  3. Получение данных: При получении данных необходимо проверить, есть ли новые данные, доступные для чтения в буфере приема. Если в приемном буфере есть читаемые данные, их можно считать и обработать программно.
  4. Обработка ошибок: Во время процесса связи UART могут возникнуть некоторые ошибки, такие как ошибки проверки или ошибки кадра. При получении данных необходимо своевременно проверять флаг ошибки для соответствующей обработки и восстановления ошибки.
  5. Обработка прерываний. Чтобы повысить скорость отклика и эффективность системы, прерывания UART обычно используются для обработки приема и передачи. В случае использования прерываний необходимо написать соответствующую процедуру обслуживания прерываний (ISR) для обработки ситуации, когда получено новое сообщение или буфер отправки пуст.
  6. Завершение работы и очистка: когда программа завершается или UART больше не нужен, необходимо выключить модуль UART и выполнить соответствующую работу по очистке ресурсов, чтобы освободить связанные ресурсы и закрыть соответствующие прерывания.

Конкретный пример (MCU — STM32F103)

Язык кода:javascript
копировать
#include "bsp_usart.h"
 /**
  * @brief  Конфигурация Вложенный векторный контроллер прерываний NVIC
  * @param  никто
  * @retval никто
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Выбор группы вложенных векторных контроллеров прерываний */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* КонфигурацияUSART — источник прерываний */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* Кража приоритета*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* подприоритет */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* Включить прерывания */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* Инициализация конфигурации NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

 /**
  * @brief  USART GPIO Конфигурация,Рабочие параметры Конфигурация  * @param  никто
  * @retval никто
  */
void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// Включите часы последовательного порта GPIO.
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// Включите часы периферийного устройства последовательного порта.
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// Будет ли USART GPIO Tx — это режим двухтактного мультиплексирования.
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // Будет ли USART Конфигурация GPIO Rx находится в режиме плавающего ввода.
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// Рабочие параметры Конфигурация последовательного порта
	// Конфигурация
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// Конфигурация Длина слова данных иглы
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// Конфигурацияостанавливаться Кусочек
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// Конфигурацияпроверять Кусочек
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// Конфигурация аппаратного управления потоком данных
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// Конфигурация рабочего режима, отправка и получение одновременно
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// Завершите инициализацию последовательного порта. Конфигурация.
	USART_Init(DEBUG_USARTx, &USART_InitStructure);
	
	// Уровень приоритета прерывания последовательного порта Конфигурация
	NVIC_Configuration();
	
	// Включить прерывание приема последовательного порта
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
	
	// Включить последовательный порт
	USART_Cmd(DEBUG_USARTx, ENABLE);		

  // Очистить флаг завершения отправки
	//USART_ClearFlag(USART1, USART_FLAG_TC);     
}

/*****************  отправить персонажа **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* Отправить один байт данных в USART */
	USART_SendData(pUSARTx,ch);
		
	/* Ожидание отправки данных. Регистр пуст. */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

/*****************  Отправить строку **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* Дождитесь завершения отправки */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}

/*****************  Отправьте 16-значный номер **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
	uint8_t temp_h, temp_l;
	
	/* Уберите верхние восемь цифр */
	temp_h = (ch&0XFF00)>>8;
	/* Удалить младшие восемь бит */
	temp_l = ch&0XFF;
	
	/* Отправить старшие восемь битов */
	USART_SendData(pUSARTx,temp_h);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
	/* Отправить младшие восемь битов */
	USART_SendData(pUSARTx,temp_l);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

///Перенаправление функции библиотеки c printf на последовательный порт. Функцию printf можно использовать после перенаправления.
int fputc(int ch, FILE *f)
{
		/* Отправьте байтовые данные в последовательный порт */
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		
		/* Ожидание завершения отправки */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

///Перенаправляем функцию библиотеки c scanf на последовательный порт. После перезаписи вы можете использовать scanf, getchar и другие функции.
int fgetc(FILE *f)
{
		/* Ожидание ввода данных последовательного порта */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(DEBUG_USARTx);
}

наконец

Если эта статья была для вас полезна, пожалуйста, поддержите блогера трижды!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose