บทเรียน 4.2 — ถอดรหัส I2C และ UART

ใช้ protocol decoder ของ sigrok อ่านธุรกรรม I2C และเฟรม UART จากบอร์ดจริง

โมดูล 4 — Logic analyzer และ protocol analyzer

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เป้าหมาย

เมื่อจบบทเรียนนี้ คุณจะ

  1. ตั้ง decoder ของ I2C แล้วอ่าน address, read/write และ ACK จากการสแกนบัสได้
  2. ตั้ง decoder ของ UART ที่ baud rate ถูกต้อง และอธิบายอาการเมื่อตั้งผิด
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม

  • ต่อ logic analyzer ตั้งอัตราสุ่ม และใช้ trigger ได้แล้ว (บทเรียน จับสัญญาณดิจิทัลครั้งแรก)
  • TESAIoT Dev Kit ที่ flash QWA309 Header I/O Test — มีปุ่ม Scan (สแกนบัส I2C) และ UART Echo (ส่งแพ็กเก็ตออกขา UART)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ดูของจริงก่อน

กดปุ่ม Scan — โปรแกรมพิมพ์ตารางที่อยู่ 0x08 ถึง 0x77 แล้วสรุป "Found N device(s)"

โปรแกรมรู้ได้อย่างไรว่ามีอุปกรณ์อยู่ที่ที่อยู่ไหน — มันถามทีละที่อยู่ 112 ครั้ง แล้วฟังว่ามีใครตอบ "มีครับ" หรือไม่ วันนี้เราจะดักฟังบทสนทนาทั้ง 112 ครั้งนั้นบนสายจริง และพิสูจน์ด้วยตาตัวเองว่าตารางบนจอพูดความจริง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (1) — เฟรม I2C บนสาย

SCL SDA 0 1 1 0 0 0 0 W A S address 0x30 R/W ACK P
เฟรม I2C: START (S) คือ SDA ตกขณะ SCL สูง address 7 บิต บิต R/W (0=เขียน) ACK แล้ว STOP (P)

address 7 บิตกับไบต์บนสาย เลื่อนซ้ายหนึ่งบิตแล้วต่อ R/W — 0x30 เขียนเป็น 0x60 อ่านเป็น 0x61

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (2) — ขนาด pull-up ของ I2C

R_p(min) = (V_CC − V_OL(max)) / I_OL = (3.3 − 0.4) V / 3 mA = 967 Ω
R_p(max) = t_r / (0.8473 × C_b)
  Fast-mode 400 kHz (t_r ≤ 300 ns), บัส 100 pF → 3.54 kΩ
  Standard-mode 100 kHz (t_r ≤ 1000 ns), บัส 100 pF → 11.8 kΩ

บัส 400 kHz ความจุ 100 pF จึงเลือกได้ระหว่าง 967 Ω ถึง 3.54 kΩ เช่น 2.2 kΩ (ค่าคงที่ 0.8473 = ln(0.7/0.3))

บัส I2C บน header ของ TESAIoT Dev Kit มีชิป CapSense (PSoC 4000T) ตอบที่ 0x08

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (3) — เฟรม UART 8N1

start 0 stop 1 idle 0xA5 = 1010 0101, sent LSB first · 115200 baud: 8.68 µs per bit
เฟรม UART 8N1: สายว่างเป็น 1 บิตเริ่มเป็น 0 ข้อมูล 8 บิตจาก LSB แล้วบิตหยุดเป็น 1
1 บิต = 1/115200 = 8.68 µs   1 ไบต์ = 10 บิต = 86.8 µs   สูงสุด 11,520 ไบต์/วินาที
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (4) — อ่านภาพสัญญาณให้เจอความผิดพลาด

ตั้ง baud ผิด decoder วัดบิตผิดจังหวะ

สิ่งที่เห็น สาเหตุที่เป็นไปได้
I2C: address ได้ NACK ทุกที่อยู่ ไม่มีอุปกรณ์ ไฟเลี้ยงไม่มา SDA/SCL สลับกัน หรือ address ผิด
I2C: SDA หรือ SCL ค้างต่ำตลอด อุปกรณ์ค้างกลางธุรกรรม หรือสายลัดกราวด์
UART: ไม่มีอะไรบน RX ทั้งที่อีกฝั่งส่ง ต่อ TX เข้า TX (ต้องไขว้ TX กับ RX) หรือลืมต่อ GND ร่วม

หา baud จากภาพ ซูมหาพัลส์ที่แคบที่สุด (หนึ่งบิต) แล้วคำนวณ baud ≈ 1/ความกว้าง — พัลส์ 8.68 µs คือ 115200

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — ถอดรหัสการสแกนบัส I2C

1. ต่อสาย   GND→GND, CH0→SCL, CH1→SDA
2. อัตราสุ่ม   ยังไม่รู้ความเร็วบัส ใช้ 8 MHz ไว้ก่อน (ครอบคลุมถึง 400 kHz)
3. trigger   ขอบขาลงของ SDA (เกิดตอน START)
4. เพิ่ม decoder   I2C, SCL=CH0, SDA=CH1
5. อ่านผล   Start → Address write: 08 → ACK/NACK → Stop ซ้ำไปเรื่อย ๆ
6. ตรวจ   0x08 ควรได้ ACK (ชิป CapSense) นับที่อยู่ที่ ACK ทั้งหมด เทียบกับ "Found N device(s)"
7. ดูไบต์ดิบ   address แบบ 8 บิต ที่อยู่ 0x08 แบบเขียนต้องเป็น 0x10

ถ้าจำนวน ACK ไม่ตรงกับจอ ตรวจก่อนว่าจับครบทั้ง 112 ที่อยู่ และอัตราสุ่มเร็วพอไหม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ฝึกเติม / แล็บ

ฝึกเติม

  1. อุปกรณ์มี address 7 บิตเป็น 0x44 ไบต์แรกบนสายแบบเขียนและแบบอ่านเป็นเท่าไร
  2. UART 9600 8N1 หนึ่งบิตยาวเท่าไร หนึ่งไบต์ยาวเท่าไร ส่งได้สูงสุดกี่ไบต์ต่อวินาที

แล็บ ส่วน A สแกนบัส I2C ตามตัวอย่างสมบูรณ์ เติมตาราง (ความถี่ SCL, จำนวนที่ถูกถาม, ที่อยู่ที่ ACK)

แล็บ ส่วน B UART Echo — ตั้ง decoder baud 115200, 8N1 เทียบไบต์ที่ decoder อ่านกับบรรทัด TX: บนจอ แล้ว ทำให้ผิดโดยตั้งใจ เปลี่ยน baud เป็น 57600 และ 9600 ดูว่า decoder แสดงอะไร

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เช็กความเข้าใจ

  1. อุปกรณ์มี address 7 บิตเป็น 0x30 ไบต์แรกบนสาย SDA เมื่อมาสเตอร์ขอเขียนคืออะไร

    • ก) 0x30 · ข) 0x60 · ค) 0x61 · ง) 0x18
  2. ข้อใดถูกต้องเกี่ยวกับสัญญาณ I2C (เลือกได้มากกว่าหนึ่งข้อ)

    • ก) START คือ SDA ตกลงขณะ SCL สูง · ข) ACK คือฝั่งรับดึง SDA ลงในจังหวะนาฬิกาที่ 9 · ค) ข้อมูลบน SDA ควรเปลี่ยนขณะ SCL สูง · ง) STOP คือ SDA ขึ้นขณะ SCL สูง
  3. สัญญาณจริงเป็น 115200 baud แต่ตั้ง decoder ไว้ที่ 9600 จะเห็นอะไร

    • ก) ไบต์ถูกต้องแต่แสดงช้าลง · ข) ไบต์เพี้ยนหรือหายไปจำนวนมาก และมี framing error · ค) decoder ปรับ baud ให้เองอัตโนมัติ · ง) สายสัญญาณจะเปลี่ยนเป็น 9600 ตาม
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ไปต่อ

logic analyzer บอกได้ว่าสัญญาณเป็น 0 หรือ 1 เมื่อไร แต่ไม่บอกว่าแรงดันจริงหน้าตาเป็นอย่างไร บทเรียนถัดไป ออสซิลโลสโคปเบื้องต้น จะให้เราเห็นขอบสัญญาณ แรงดันเกิน และสัญญาณรบกวนที่ logic analyzer มองไม่เห็น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แหล่งที่มาและเครดิต

"อิเล็กทรอนิกส์และเครื่องมือวัดสำหรับนักพัฒนาระบบฝังตัว" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย
(Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program
สัญญาอนุญาต CC BY-NC 4.0

แผนภาพในบทเรียนนี้เป็นงานวาดของหลักสูตรนี้เอง (CC BY-NC 4.0)

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0