IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series: Lập trình Raspberry Pi – Bài 7: I2C / SPI / UART — Scan bus, wiring chuẩn, và lỗi thường gặp

Series: Lập trình Raspberry Pi & Ứng dụng thực tế Phần 2 — Lập trình GPIO & phần cứng Bài 7: I2C / SPI / UART — Scan bus, wiring chuẩn, và lỗi thường gặp


1) Mục tiêu bài học

Sau bài này bạn sẽ:

  • Hiểu 3 chuẩn giao tiếp phổ biến trên Pi: I2C, SPI, UART (dùng khi nào).
  • Bật từng interface đúng cách.
  • Scan I2C để phát hiện cảm biến.
  • Test nhanh SPI/UART bằng lệnh cơ bản.
  • Biết các lỗi wiring hay gặp và cách debug.

2) Tổng quan nhanh: dùng cái nào?

  • I2C: nhiều sensor trên cùng 2 dây (SDA/SCL), có địa chỉ (0x..). Rất phổ biến: BME280, OLED SSD1306, INA219…
  • SPI: tốc độ cao, thường cho màn hình, ADC, RF module… Có nhiều dây hơn I2C (MOSI/MISO/SCLK/CS).
  • UART: giao tiếp serial 2 dây (TX/RX), hay dùng cho GPS, module 4G, console debug.

3) Bật I2C / SPI / UART trên Raspberry Pi

Chạy:

sudo raspi-config

Vào:

  • Interface Options
    • I2C → Enable
    • SPI → Enable
    • Serial Port:
      • Disable login shell over serial (khuyến nghị)
      • Enable serial hardware

Reboot:

sudo reboot

4) Cài tools cần thiết

sudo apt update
sudo apt -y install i2c-tools spi-tools minicom

5) I2C: kiểm tra & scan bus

5.1 Kiểm tra I2C device node

ls -l /dev/i2c*

Thường sẽ có: /dev/i2c-1

5.2 Scan I2C

sudo i2cdetect -y 1

Bạn sẽ thấy bảng địa chỉ. Ví dụ:

  • OLED SSD1306 thường: 0x3C hoặc 0x3D
  • BME280 thường: 0x76 hoặc 0x77

Nếu không thấy gì: 90% là do wiring hoặc chưa enable I2C.

6) Wiring I2C chuẩn (nhớ 3 quy tắc)

Chân I2C trên Raspberry Pi (phổ biến)

  • SDA: GPIO2 (Pin 3)
  • SCL: GPIO3 (Pin 5)
  • 3.3V: Pin 1
  • GND: Pin 6

3 quy tắc

  1. Chỉ dùng 3.3V cho sensor I2C (trừ khi module có level shifter).
  2. GND phải chung (GND sensor ↔ GND Pi).
  3. Dây ngắn, gọn; bus I2C dài dễ nhiễu.

7) SPI: kiểm tra nhanh

7.1 Kiểm tra SPI device node

ls -l /dev/spidev*

Thường có:

  • /dev/spidev0.0
  • /dev/spidev0.1

7.2 Wiring SPI (khái niệm)

  • SCLK, MOSI, MISO + CS (chip select)
  • SPI thường cần CS riêng cho từng thiết bị

SPI debug thường khó hơn I2C: sai CS hoặc sai mode/clock là “im lặng”.

8) UART: kiểm tra nhanh

8.1 Xem serial devices

ls -l /dev/serial*
ls -l /dev/ttyAMA0 /dev/ttyS0 2>/dev/null || true

Trên nhiều bản Pi OS:

  • /dev/serial0 là alias đúng nên dùng (ổn định theo model)

8.2 Test bằng minicom (khi bạn có thiết bị UART như GPS)

sudo minicom -b 9600 -D /dev/serial0

Thoát minicom: Ctrl+A rồi X

Nếu RX/TX không ra gì: kiểm tra baudrateđấu TX↔RX (chéo dây).

9) Lỗi thường gặp & cách xử lý nhanh

I2C không thấy device (scan trống)

  • Chưa enable I2C → bật trong raspi-config
  • Đấu sai SDA/SCL → dùng đúng GPIO2/GPIO3
  • Cấp nhầm 5V → nguy hiểm (có thể hỏng)
  • Module đã có pull-up, dây dài quá → rút ngắn dây

I2C thấy device nhưng code không chạy

  • Sai địa chỉ (0x76 vs 0x77 / 0x3C vs 0x3D)
  • Sai library / sai bus (i2c-1)

UART không nhận

  • TX/RX cắm cùng chiều (phải chéo)
  • Baud sai (9600/115200…)
  • Serial console chưa disable (xung đột)

SPI “im lặng”

  • Sai CS (spidev0.0 vs spidev0.1)
  • Sai mode (0/1/2/3) hoặc speed quá cao
  • Thiếu GND chung

10) Bài tập nâng cấp

  1. Cắm 1 thiết bị I2C (OLED/BME280) và chụp lại kết quả i2cdetect -y 1.
  2. Enable UART và test minicom (nếu có GPS/4G module).
  3. Ghi chú “địa chỉ I2C” của module bạn đang có để dùng cho các bài sau.