Главная / Без рубрики / Встроенные интерфейсы связи: UART/USART, SPI, I²C, CAN, USB

Встроенные интерфейсы связи: UART/USART, SPI, I²C, CAN, USB

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‑контроллера);
    • накладные расходы на заголовки кадров;
    • стоимость трансиверов.

5

Оставить комментарий

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