Universal Asynchronous Receiver-Transmitter (UART)

Kompilasi oleh : Reza Ervani bin Asmanu

Bagian 1: Konsep Fundamental, Arsitektur, dan Mekanisme Sinyal

1. Definisi dan Filosofi UART

UART (Universal Asynchronous Receiver-Transmitter) bukanlah sebuah protokol komunikasi seperti Wi-Fi atau Bluetooth, melainkan sebuah sirkuit fisik (perangkat keras) di dalam mikrokontroler atau prosesor.

Dalam konteks Bare Metal Programming, UART adalah “jembatan pertama” yang menghubungkan dunia internal prosesor (yang bekerja dengan data biner paralel di dalam bus memori) dengan dunia eksternal (pengiriman data serial bit-per-bit).

Kata kunci yang membedakan UART dari antarmuka lain (seperti SPI atau I2C) adalah Asynchronous (Asinkron).

  • Sinkron (SPI/I2C): Memiliki kabel khusus bernama Clock (CLK). Master mengirim ketukan tempo, dan Slave mengikuti tempo tersebut.
  • Asinkron (UART): Tidak ada kabel Clock. Pengirim (TX) dan Penerima (RX) bekerja independen. Agar data bisa terbaca, kedua belah pihak harus menyepakati “kecepatan bicara” yang sama persis sebelum komunikasi dimulai. Kecepatan ini disebut Baud Rate.

2. Arsitektur Fisik (Wiring)

Secara fisik, UART sangat sederhana namun memiliki aturan ketat yang sering menjadi sumber kesalahan pemula. Koneksi UART membutuhkan minimal 3 kabel:

  1. TX (Transmit): Jalur pengiriman data keluar.
  2. RX (Receive): Jalur penerimaan data masuk.
  3. GND (Ground): Referensi tegangan 0V bersama.

Aturan Emas Wiring:

Koneksi harus dilakukan secara silang (Crossover).

  • Pin TX pada Raspberry Pi harus terhubung ke RX pada USB-to-TTL Converter.
  • Pin RX pada Raspberry Pi harus terhubung ke TX pada USB-to-TTL Converter.
  • GND harus terhubung ke GND (Wajib, agar level tegangan 3.3V atau 5V memiliki titik nol yang sama).

3. Paket Data (The Data Frame)

Bagaimana huruf ‘A’ (biner: 01000001) dikirimkan melalui satu kabel saja?

Karena tidak ada sinyal clock untuk memberi tahu kapan bit dimulai dan berakhir, UART menggunakan perubahan tegangan (Voltage Level) dengan format paket standar.

Saat saluran UART sedang idle (diam/tidak mengirim data), tegangan di kabel TX akan selalu HIGH (1). Ini disebut Mark State.

Struktur paket data adalah sebagai berikut:

A. Start Bit (1 Bit)

Untuk memulai transmisi, pengirim menarik tegangan dari HIGH ke LOW (0) selama satu periode bit.

  • Ini berfungsi sebagai “bel pintu”. Saat penerima mendeteksi perubahan tegangan drastis dari 1 ke 0, ia mereset penghitung waktu internalnya dan bersiap membaca data.

B. Data Bits (5-9 Bit, Standar 8 Bit)

Segera setelah Start Bit, data dikirim. Biasanya 8 bit (1 Byte).

  • Penting: UART mengirimkan data dengan urutan LSB First (Least Significant Bit atau bit terkecil duluan).
  • Contoh: Huruf ‘A’ (ASCII 65 = 01000001).Yang dikirim adalah urutan terbalik: 1 -> 0 -> 0 -> 0 -> 0 -> 0 -> 1 -> 0.

C. Parity Bit (Opsional)

Digunakan untuk pengecekan error sederhana. Jarang digunakan dalam bare metal debugging modern (biasanya diset ke None).

D. Stop Bit (1 atau 2 Bit)

Setelah data selesai, pengirim mengembalikan tegangan ke HIGH (1).

  • Ini memberi waktu “istirahat” bagi penerima untuk memproses byte yang baru masuk sebelum byte berikutnya datang. Jika Stop Bit tidak terdeteksi (sinyal tetap LOW), akan terjadi Framing Error.

4. Tantangan dalam Implementasi Bare Metal (Timing)

Inilah bagian tersulit dalam menulis driver OS sendiri.

Jika kita menyepakati Baud Rate 115200 bps (bit per second), itu berarti setiap satu bit data hanya boleh memakan waktu sekitar 8.68 mikrodetik.

Jika Raspberry Pi mengirim data sedikit lebih lambat (misal 9 mikrodetik per bit) karena osilator clock yang tidak stabil atau pembagi (divisor) yang salah hitung, maka pada bit ke-8, penerima akan membaca data yang salah (bit slip).

Oleh karena itu, perhitungan matematika untuk mengisi register BAUD_RATE_DIVISOR nanti harus sangat presisi berdasarkan kecepatan CPU (Core Clock) saat itu.


Penutup Bagian 1

Sekarang kita memahami bahwa “Menulis ke UART” sebenarnya adalah:

  1. Mengatur kecepatan (Baud Rate) agar sinkron dengan sisi penerima.
  2. Memformat data menjadi paket (Start + Data + Stop).
  3. Memasukkan data ke dalam antrian kirim (FIFO).

Hardware UART pada BCM2835 (Raspberry Pi) melakukan poin 2 secara otomatis. Tugas kita sebagai pengembang OS adalah melakukan poin 1 dan 3 melalui manipulasi Register.