1. Введение: зачем нужны интерфейсы связи в МК
Микроконтроллеры редко работают изолированно — чаще они входят в состав распределённых систем, обмениваясь данными с:
- датчиками и исполнительными механизмами;
- другими МК и модулями;
- ПК и облачными сервисами;
- человеко‑машинными интерфейсами (дисплеи, клавиатуры).
Ключевые требования к интерфейсам:
- надёжность передачи;
- скорость;
- дальность;
- количество подключаемых устройств;
- энергопотребление;
- простота реализации.
Ниже — разбор пяти наиболее распространённых протоколов, встроенных в современные МК.
2. UART/USART: универсальный асинхронный приёмопередатчик
2.1. Принцип работы
- Асинхронность: нет общего тактового сигнала; синхронизация по стартовым/стоповым битам.
- Формат пакета: стартовый бит (0) → 5–9 бит данных → бит чётности (опционально) → 1–2 стоповых бита (1).
- Скорость (бод): типично 9600, 19200, 115200; максимум до 921600 и выше.
2.2. Сигнальные линии
- TX (Transmit) — передача;
- RX (Receive) — приём;
- GND — общий провод.
2.3. Особенности
- Плюсы:
- минимум проводов (2 + GND);
- простота настройки;
- широкая поддержка (от МК до ПК).
- Минусы:
- низкая помехозащищённость;
- ограничение по дальности (метры при 115200 бод);
- нет адресации (точка‑точка).
2.4. Физические уровни
- TTL (0–3,3/5 В) — для коротких соединений внутри платы;
- RS‑232 (±12 В) — для длинных линий (до 15 м);
- RS‑485 (дифференциальный) — до 1200 м, многоточечность.
2.5. Пример настройки (STM32 HAL)
UART_HandleTypeDef huart2;
void UART_Init(void) {
__HAL_RCC_USART2_CLK_ENABLE();
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart2);
}
// Передача строки
HAL_UART_Transmit(&huart2, (uint8_t*)"Hello", 5, 100);
3. SPI: последовательный периферийный интерфейс
3.1. Принцип работы
- Синхронный обмен (общий тактовый сигнал SCK).
- Полноценный дуплекс: данные передаются и принимаются одновременно.
- Ведущее/ведомые устройства: один мастер управляет несколькими slave.
3.2. Сигнальные линии
- SCK (Serial Clock) — тактовый сигнал от мастера;
- MOSI (Master Out Slave In) — данные от мастера к slave;
- MISO (Master In Slave Out) — данные от slave к мастеру;
- SS/CS (Slave Select/Chip Select) — выбор ведомого (активный низкий).
3.3. Режимы работы (CPOL, CPHA)
Определяют фазу и полярность тактового сигнала:
- Mode 0: CPOL=0, CPHA=0 (данные считываются на переднем фронте);
- Mode 1: CPOL=0, CPHA=1 (на заднем фронте);
- Mode 2: CPOL=1, CPHA=0;
- Mode 3: CPOL=1, CPHA=1.
3.4. Особенности
- Плюсы:
- высокая скорость (до десятков МГц);
- простой протокол;
- поддержка множества ведомых (через CS).
- Минусы:
- много проводов (4 + CS на каждое устройство);
- нет встроенной проверки ошибок;
- ограниченная дальность (десятки см).
3.5. Пример настройки (AVR)
#include <avr/io.h>
void SPI_Init(void) {
DDRB |= (1 << PB2) | (1 << PB3) | (1 << PB5); // MOSI, SCK, SS как выход
SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR0); // Включить, мастер, предделитель 16
}
uint8_t SPI_Transfer(uint8_t data) {
SPDR = data;
while (!(SPSR & (1 << SPIF))); // Ждать завершения
return SPDR;
}
4. I²C: двухпроводной интерфейс
4.1. Принцип работы
- Синхронный, с общей шиной данных и такта.
- Многомастерность (с арбитражем).
- Адресация: 7‑битный или 10‑битный адрес устройства.
4.2. Сигнальные линии
- SDA (Serial Data) — двунаправленная шина данных;
- SCL (Serial Clock) — тактовый сигнал.
4.3. Скорость и режимы
- Standard Mode: 100 кбит/с;
- Fast Mode: 400 кбит/с;
- Fast Mode Plus: 1 Мбит/с;
- High‑Speed Mode: до 3,4 Мбит/с.
4.4. Особенности
- Плюсы:
- всего 2 провода;
- поддержка до 127 устройств на шине;
- встроенная проверка ACK/NACK;
- горячая замена устройств (при поддержке).
- Минусы:
- низкая скорость по сравнению с SPI;
- сложность арбитража при множестве мастеров;
- требования к подтягивающим резисторам.
4.5. Пример настройки (STM32 HAL)
I2C_HandleTypeDef hi2c1;
void I2C_Init(void) {
__HAL_RCC_I2C1_CLK_ENABLE();
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
hi2c1.Init.DutyCycle = I2C_FASTMODE_DUTY2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
HAL_I2C_Init(&hi2c1);
}
// Запись в регистр устройства с адресом 0x50
uint8_t data = 0xAA;
HAL_I2C_Mem_Write(&hi2c1, 0x50, 0x00, I2C_MEMADD_MODE_8BIT,
&data, 1, 100);
5. CAN: сеть контроллеров (Controller Area Network)
5.1. Принцип работы
- Широковещательная шина: все узлы видят все сообщения.
- Приоритетная арбитраж: сообщения с высоким приоритетом передаются первыми.
- Кадры данных: идентификатор (11/29 бит), длина (0–8 байт), данные, CRC.
5.2. Физический уровень
- Дифференциальный сигнал (CAN_H, CAN_L);
- Терминирующие резисторы (120 Ом на концах шины);
- Скорость: от 10 кбит/с до 1 Мбит/с (в зависимости от длины шины).
5.3. Особенности
- Плюсы:
- высокая помехозащищённость;
- поддержка десятков узлов на одной шине;
- гарантированная доставка с повторной отправкой при ошибках;
- жёсткие временные рамки (для реального времени).
- Минусы:
- сложная реализация (требует CAN‑контроллера);
- накладные расходы на заголовки кадров;
- стоимость трансиверов.



