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
- Chỉ dùng 3.3V cho sensor I2C (trừ khi module có level shifter).
- GND phải chung (GND sensor ↔ GND Pi).
- 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 và đấ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
- Cắm 1 thiết bị I2C (OLED/BME280) và chụp lại kết quả i2cdetect -y 1.
- Enable UART và test minicom (nếu có GPS/4G module).
- Ghi chú “địa chỉ I2C” của module bạn đang có để dùng cho các bài sau.


