ผลการเรียนรู้ (Learning Outcomes)
- ระบุสายสัญญาณ 4 เส้นของ SPI (MOSI, MISO, SCK, SS/CS) และหน้าที่ของแต่ละเส้น
- เปรียบเทียบ SPI กับ I2C ได้ (จำนวนสาย, การเลือก Slave, ความเร็ว, duplex)
- อธิบายการต่อ Slave หลายตัวแบบ independent และแบบ daisy-chain
- อธิบาย 4 โหมดของ SPI จาก CPOL/CPHA และบอกได้ว่าต้องตั้งให้ตรงกับ Slave
- ยกตัวอย่างอุปกรณ์ที่ใช้ SPI (DAC ภายนอก, SD Card) และข้อดี/ข้อจำกัดของ SPI
§10.1 SPI คืออะไร และสายสัญญาณ 4 เส้น
SPI ย่อมาจาก Serial Peripheral Interface เป็น synchronous serial protocol (มี clock) เหมือน I2C แต่ใช้สาย 4 เส้น. ออกแบบสำหรับการสื่อสารระยะสั้น เช่นระหว่างชิปบนแผ่น PCB เดียวกัน.
SPI มีบทบาท Master และ Slave เหมือน I2C แต่โดยทั่วไปมี Master ได้เพียงตัวเดียว (single-master) ต่างจาก I2C ที่เป็น multi-master. MCU มักเป็น Master ส่วนเซนเซอร์/IC เป็น Slave.
เพราะ SPI มีสายข้อมูลแยกสองเส้น (เข้าและออก) จึงรับและส่งพร้อมกันได้ (full-duplex) ถ้าวงจรรองรับ. STM32F767ZI รองรับ full-duplex ได้. โดยรวม SPI เร็วกว่า I2C.
SPI ไม่ใช้ address แบบ I2C. แทนที่จะส่ง address ไปเรียก Master จะใช้ขา chip select (SS หรือ CS) เลือกว่าจะคุยกับ Slave ตัวใด. ขานี้เป็น active low คือดึงลงเป็น 0 เพื่อเปิดใช้ Slave ตัวนั้น.
| สาย | ชื่อเต็ม | หน้าที่ |
|---|---|---|
| MOSI | Master Out Slave In | Master ส่งข้อมูลไป Slave |
| MISO | Master In Slave Out | Slave ส่งข้อมูลกลับ Master |
| SCK | Serial Clock | clock จาก Master |
| SS / CS | Slave Select / Chip Select | เลือก Slave (active low) |
MISO + MOSI มีทั้งคู่ = full-duplex รับส่งพร้อมกัน. วางเมาส์บนสายเพื่อดูทิศทาง
§10.2 SPI เทียบกับ I2C
ทั้งคู่เป็น synchronous serial แต่ต่างกันหลายจุด. I2C ใช้ 2 สายและเลือกอุปกรณ์ด้วย address ส่วน SPI ใช้ 4 สายและเลือกด้วยขา chip select.
SPI มีสายข้อมูลแยกไป-กลับ (MOSI/MISO) จึง full-duplex ได้ ส่วน I2C มีสายข้อมูลเส้นเดียว (SDA). SPI โดยรวมเร็วกว่า I2C.
มองจากขา control (chip select) การต่อ Slave หลายตัวแบบแยกกันจะเป็นลักษณะ star topology (ขา CS แยกไปแต่ละ Slave). แต่สายข้อมูล MOSI/MISO/SCK จะแชร์กันแบบบัส.
ข้อแลกเปลี่ยน: SPI ตั้งค่าง่าย ไม่มีเรื่อง address ให้ปวดหัว แต่ต้องเดินสายมากกว่า และถ้ามี Slave หลายตัวต้องมีขา chip select หลายขา ซึ่ง Master ต้องควบคุมเอง.
| หัวข้อ | I2C | SPI |
|---|---|---|
| จำนวนสาย | 2 (SDA, SCL) | 4 (MOSI, MISO, SCK, CS) |
| เลือก Slave | ด้วย address | ด้วยขา chip select |
| Master | หลายตัวได้ (multi-master) | ปกติตัวเดียว (single-master) |
| Duplex | half-duplex | full-duplex ได้ |
| ความเร็ว | ช้ากว่า | เร็วกว่า |
| สายเมื่อ Slave เยอะ | เท่าเดิม 2 เส้น | ต้องเพิ่มขา CS |
คลิกแถวในตารางเพื่อไฮไลต์ส่วนที่เกี่ยวข้องในไดอะแกรมทั้งสองฝั่ง
§10.3 การต่อ Slave หลายตัว: Independent และ Daisy-chain
แบบ independent: Slave แต่ละตัวมีขา chip select ของตัวเอง แยกจาก Master แบบ point-to-point ส่วนสาย MOSI/MISO/SCK แชร์กันแบบบัส. Master เลือกคุยทีละตัวโดยดึง CS ของตัวนั้นลงเป็น 0. ข้อดีคือควบคุมชัดเจน ข้อเสียคือต้องมีขา CS เท่าจำนวน Slave.
แบบ daisy-chain: ต่อ Slave พ่วงกันเป็นลูกโซ่เพื่อลดจำนวนสาย โดยใช้ CS ร่วมกัน. ข้อมูลออกจาก Master เข้า Slave ตัวแรก แล้วส่งต่อไปตัวถัดไปเรื่อยๆ เหมือนตัวแรกเก็บข้อมูลของตัวเองไว้แล้วส่งที่เหลือต่อ. สุดท้ายข้อมูลจาก Slave ทุกตัวจะวนกลับเข้า Master.
ข้อแลกเปลี่ยนของ daisy-chain: สายน้อยลง แต่ข้อมูลต้องไหลผ่านทุกตัวตามลำดับ ทำให้ throughput ช้าลงเมื่อมี Slave จำนวนมาก เพราะต้องรอส่งต่อกันไปทีละตัว.
เพราะ SPI มีสายข้อมูลสองเส้น (MOSI/MISO) ข้อมูลจึงถูกเลื่อน (shift) เข้า-ออกพร้อมกันผ่าน shift register ภายใน ทำให้รับและส่งเกิดในจังหวะ clock เดียวกัน (full-duplex) เร็วกว่าการทำทีละทิศ.
แต่ละ slave มีสาย CS ของตัวเอง → สาย = 3 + N. ควบคุมแยกกันได้ แต่ใช้สายเยอะ
§10.4 โหมดของ SPI (CPOL / CPHA)
SPI มี 4 โหมด เกิดจากการจับคู่ของพารามิเตอร์สองตัว. CPOL (Clock Polarity) กำหนดว่าตอนไม่มีการส่ง (idle) สาย clock อยู่ที่ระดับ 0 หรือ 1. CPHA (Clock Phase) กำหนดว่าจะ sample ข้อมูลที่ขอบ clock ขอบแรกหรือขอบที่สอง.
Master และ Slave ต้องตั้งโหมดให้ตรงกันถึงจะคุยกันได้. ถ้า Master เป็น multi-master หรือมี Slave หลายตัวที่ใช้โหมดต่างกัน Master ต้องเปลี่ยน CPOL/CPHA ให้ตรงกับ Slave ตัวที่จะคุยด้วย.
โหมด 0 กับโหมด 2 จะ sample ข้อมูลที่ขอบแรก ส่วนโหมด 1 กับโหมด 3 จะ sample ที่ขอบที่สอง ความต่างระหว่างโหมดคู่กันคือ idle ของ clock เป็น 0 หรือ 1 (CPOL). ในทางปฏิบัติที่พบบ่อยคือโหมด 0 และโหมด 3.
STM32F767ZI มีโมดูล SPI 6 ตัว (SPI1–SPI6) ความเร็วสูงสุดราว 54 Mbit/s สำหรับบางตัว. ตั้งค่าได้ว่าเป็น Master หรือ Slave, ขนาด frame ต่อครั้งเลือกได้ 4–16 bit, และทำ full-duplex ได้เมื่อใช้คำสั่ง TransmitReceive.
| โหมด | CPOL (idle) | CPHA (sample) |
|---|---|---|
| 0 | 0 | ขอบแรก |
| 1 | 0 | ขอบที่สอง |
| 2 | 1 | ขอบแรก |
| 3 | 1 | ขอบที่สอง |
CPOL = ระดับขณะว่างของนาฬิกา, CPHA = ขอบที่ใช้สุ่มข้อมูล (ขอบแรก/ขอบสอง). master และ slave ต้องตั้งโหมดตรงกัน
แบบฝึกหัด
12 ข้อ — แต่ละข้อมีชนิดและระดับความยากกำกับ กดปุ่ม "ดูเฉลย" เพื่อดูคำตอบและคำอธิบาย
- 1.ปรนัยง่าย
SPI ใช้สายสัญญาณกี่เส้น
- 2.ปรนัยง่าย
สาย MOSI ของ SPI ทำหน้าที่อะไร
- 3.ปรนัยง่าย
SPI เลือกว่าจะคุยกับ Slave ตัวใดด้วยวิธีใด
- 4.ถูก/ผิดง่าย
ขา chip select (SS/CS) ของ SPI เป็นแบบ active low
- 5.ปรนัยกลาง
ข้อใดเป็นข้อแตกต่างระหว่าง SPI กับ I2C ที่ถูกต้อง
- 6.ปรนัยกลาง
เหตุใด SPI จึงรับและส่งข้อมูลพร้อมกันได้ (full-duplex)
- 7.ปรนัยกลาง
ข้อใดอธิบายการต่อ Slave แบบ daisy-chain ถูกต้อง
- 8.ถูก/ผิดกลาง
ในการต่อแบบ daisy-chain ยิ่งมี Slave มากตัว throughput ยิ่งช้าลง
- 9.เติมคำกลาง
SPI มีทั้งหมดกี่โหมด ที่เกิดจากการจับคู่ของ CPOL และ CPHA
- 10.ปรนัยยาก
พารามิเตอร์ CPHA ใน SPI กำหนดสิ่งใด
- 11.วิเคราะห์ยาก
ทำไมเมื่อต้องการ DAC ความละเอียดสูงกว่าที่ STM32 มีในตัว (12-bit) จึงมักเลือกต่อ DAC ภายนอกผ่าน SPI แทน I2C
- 12.วิเคราะห์ยาก
SPI ไม่มี acknowledgement และ flow control เหมือน I2C/UART การใช้งาน SD Card ผ่าน SPI จึงต้องพึ่งอะไรเพิ่มเพื่อให้จัดการข้อมูลเป็นไฟล์ได้