L'UART: controller hardware per comunicazioni seriali
L'UART (Universal Asynchronous Receiver/Transmitter) è il circuito hardware dedicato — sia un IC discreto (es. 16550, 16C550, SC16IS7xx) sia un blocco IP all'interno di un microcontrollore/SoC — che implementa il protocollo seriale asincrono (bit di start, 5–9 bit di dati, parità, bit di stop) e gestisce la segnalazione elettrica (RS-232, RS-485, TTL, LVTTL).
Funzioni principali
- Parallelo-to-Seriale (TX): Prende un byte dalla CPU/bus dati → carica nel TX Shift Register → invia bit alla velocità baud con framing start/stop/parità.
- Seriale-to-Parallelo (RX): Rileva bit di start → campiona la linea a 16x velocità baud (oversampling) → sposta bit nel RX Register → controlla parità/stop → attiva interrupt / imposta flag → CPU legge byte.
- Generatore di velocità baud: Divisore latch (DLL/DLM) divide l'orologio di sistema (1.8432 MHz, 14.7456 MHz, 48 MHz, ecc.) verso velocità baud target (300–921600+).
- Buffer FIFO (16550A+): FIFO TX/RX da 16 byte riducono l'overhead di interrupt della CPU. Livelli di attivazione programmabili (1, 4, 8, 14).
- Controllo di flusso: Hardware (RTS/CTS, DTR/DSR) o Software (XON/XOFF) tramite registro di controllo modem.
- Stato modem/Controllo linea: Input DCD, RI, DSR, CTS; output DTR, RTS, OUT1, OUT2, Loopback.
UART vs. "Porta seriale"
- UART: Il motore hardware (silicio).
- Porta seriale: L'interfaccia di sistema (COM1, ttyS0, /dev/ttyUSB0) presentata da OS/driver, comprendente UART + trasceiver (MAX232, MAX485, CP210x, FT232) + connettore (DB9, RJ45, USB, header).
Implementazioni comuni
- PC (Legacy): Chip Super I/O (ITE, Nuvoton, SMSC) → UART compatibile 16550 → DB9 (RS-232).
- Adattatore USB-Seriale: FTDI FT232R, Silicon Labs CP2102, Prolific PL2303, CH340 — controller dispositivo USB + UART integrato + trasceiver.
- Microcontrollore (STM32, ESP32, AVR, PIC, RP2040): Molteplici periferiche UART on-chip (USART, LPUART). TTL diretto (3.3V/5V).
- FPGA/ASIC: Soft IP core (Xilinx UARTlite, Intel Avalon UART) o macro indurito.
Registri chiave (Standard 16550)
| Offset (DLAB=0) | Registro | Funzione |
|---|---|---|
| 0x00 | RBR / THR | Receive Buffer / Transmit Holding |
| 0x01 | IER | Interrupt Enable (RX, TX, Line Status, Modem Status) |
| 0x02 | IIR / FCR | Interrupt ID (Read) / FIFO Control (Write) |
| 0x03 | LCR | Line Control (Word Length, Stop Bits, Parity, DLAB, Break) |
| 0x04 | MCR | Modem Control (DTR, RTS, OUT1, OUT2, Loop) |
| 0x05 | LSR | Line Status (DR, OE, PE, FE, BI, THRE, TEMT, FIFOERR) |
| 0x06 | MSR | Modem Status (DCD, RI, DSR, CTS, Delta bits) |
| 0x07 | SCR | Scratchpad |
| 0x00/0x01 (DLAB=1) | DLL / DLM | Divisor Latch Low/High (Velocità baud) |
In sintesi: L'UART è il cavallo di battaglia in silicio; la porta seriale è l'astrazione del sistema operativo. Senza UART = niente comunicazione seriale (tranne bit-banging GPIO).