01076051Lecture 10

Serial Communication: SPI

บทที่ 10: การสื่อสารอนุกรมแบบ SPI (Serial Peripheral Interface)

ต่อจาก UART (asynchronous) และ I2C (synchronous แบบบัส 2 เส้น) บทนี้เรียน Serial protocol ตัวที่สามคือ SPI (Serial Peripheral Interface) ซึ่งเป็น synchronous เช่นกันแต่ใช้สาย 4 เส้น. SPI เร็วกว่า I2C ใช้ chip select เลือก Slave แทน address และรับ-ส่งข้อมูลพร้อมกันได้ (full-duplex). เราจะดูสายสัญญาณ, การต่อ Slave หลายตัว, 4 โหมดของ clock และตัวอย่างอุปกรณ์จริงที่ใช้ SPI เช่น DAC ภายนอกและ SD Card.

ผลการเรียนรู้ (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 ตัวนั้น.

สายชื่อเต็มหน้าที่
MOSIMaster Out Slave InMaster ส่งข้อมูลไป Slave
MISOMaster In Slave OutSlave ส่งข้อมูลกลับ Master
SCKSerial Clockclock จาก Master
SS / CSSlave Select / Chip Selectเลือก Slave (active low)
สายสัญญาณ 4 เส้นของ SPI
VIZ-53SPI สี่สาย (master ↔ slave เดียว)
MasterSlaveMOSIMISOSCKCS = 0

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 ต้องควบคุมเอง.

หัวข้อI2CSPI
จำนวนสาย2 (SDA, SCL)4 (MOSI, MISO, SCK, CS)
เลือก Slaveด้วย addressด้วยขา chip select
Masterหลายตัวได้ (multi-master)ปกติตัวเดียว (single-master)
Duplexhalf-duplexfull-duplex ได้
ความเร็วช้ากว่าเร็วกว่า
สายเมื่อ Slave เยอะเท่าเดิม 2 เส้นต้องเพิ่มขา CS
เปรียบเทียบ SPI กับ I2C
VIZ-54SPI เทียบกับ I2C
I2C
MasterSlave0x44Slave0x5C
SPI
MasterSlaveSlave
หัวข้อ
I2C
SPI

คลิกแถวในตารางเพื่อไฮไลต์ส่วนที่เกี่ยวข้องในไดอะแกรมทั้งสองฝั่ง

§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) เร็วกว่าการทำทีละทิศ.

VIZ-55SPI: independent เทียบ daisy-chain
MasterMOSI · MISO · SCK (ร่วมกัน)Slave 1CS1Slave 2CS2Slave 3CS3สาย = 3 + N

แต่ละ 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)
00ขอบแรก
10ขอบที่สอง
21ขอบแรก
31ขอบที่สอง
4 โหมดของ SPI (CPOL/CPHA)
VIZ-56SPI clock modes (CPOL / CPHA)
เทียบอุปกรณ์:
Mode 0CPOL=0 CPHA=0
SCKDATA
Mode 1CPOL=0 CPHA=1
SCKDATA
Mode 2CPOL=1 CPHA=0
SCKDATA
Mode 3CPOL=1 CPHA=1
SCKDATA

CPOL = ระดับขณะว่างของนาฬิกา, CPHA = ขอบที่ใช้สุ่มข้อมูล (ขอบแรก/ขอบสอง). master และ slave ต้องตั้งโหมดตรงกัน

แบบฝึกหัด

12 ข้อ — แต่ละข้อมีชนิดและระดับความยากกำกับ กดปุ่ม "ดูเฉลย" เพื่อดูคำตอบและคำอธิบาย

  1. 1.ปรนัยง่าย

    SPI ใช้สายสัญญาณกี่เส้น

  2. 2.ปรนัยง่าย

    สาย MOSI ของ SPI ทำหน้าที่อะไร

  3. 3.ปรนัยง่าย

    SPI เลือกว่าจะคุยกับ Slave ตัวใดด้วยวิธีใด

  4. 4.ถูก/ผิดง่าย

    ขา chip select (SS/CS) ของ SPI เป็นแบบ active low

  5. 5.ปรนัยกลาง

    ข้อใดเป็นข้อแตกต่างระหว่าง SPI กับ I2C ที่ถูกต้อง

  6. 6.ปรนัยกลาง

    เหตุใด SPI จึงรับและส่งข้อมูลพร้อมกันได้ (full-duplex)

  7. 7.ปรนัยกลาง

    ข้อใดอธิบายการต่อ Slave แบบ daisy-chain ถูกต้อง

  8. 8.ถูก/ผิดกลาง

    ในการต่อแบบ daisy-chain ยิ่งมี Slave มากตัว throughput ยิ่งช้าลง

  9. 9.เติมคำกลาง

    SPI มีทั้งหมดกี่โหมด ที่เกิดจากการจับคู่ของ CPOL และ CPHA

  10. 10.ปรนัยยาก

    พารามิเตอร์ CPHA ใน SPI กำหนดสิ่งใด

  11. 11.วิเคราะห์ยาก

    ทำไมเมื่อต้องการ DAC ความละเอียดสูงกว่าที่ STM32 มีในตัว (12-bit) จึงมักเลือกต่อ DAC ภายนอกผ่าน SPI แทน I2C

  12. 12.วิเคราะห์ยาก

    SPI ไม่มี acknowledgement และ flow control เหมือน I2C/UART การใช้งาน SD Card ผ่าน SPI จึงต้องพึ่งอะไรเพิ่มเพื่อให้จัดการข้อมูลเป็นไฟล์ได้