3.21. พื้นฐาน SPI

SPI (Serial Peripheral Interface) คือบัสอนุกรมแบบซิงโครนัสที่ออกแบบมาสำหรับการเชื่อมต่อระยะสั้นความเร็วสูงระหว่างตัวควบคุมหนึ่งตัวกับอุปกรณ์ต่อพ่วงหนึ่งตัวหรือมากกว่าบนบอร์ดเดียวกัน เป็นอินเทอร์เฟซมาตรฐานสำหรับการ์ด SD, จอแสดงผล, หน่วยความจำแฟลช, ADC และ DAC รวมถึง sensor หลากหลายประเภท

ในขณะที่ UART ไม่มีสัญญาณนาฬิการ่วมและกู้คืนจังหวะเวลาจากสายข้อมูลเองนั้น SPI จะเดินสายนาฬิกาควบคู่ไปกับสายข้อมูล ตัวควบคุมขับสัญญาณนาฬิกาด้วยอัตราที่ต้องการ และอุปกรณ์ทุกตัวบนบัสจะสุ่มตัวอย่างข้อมูลพร้อมกับสัญญาณนาฬิกานั้น ไม่มีการเดาอัตราบอดและไม่มีค่าใช้จ่ายด้านการจัดเฟรม -- มีแค่ขอบสัญญาณนาฬิกาและบิตข้อมูลเท่านั้น

3.21.1. สี่สายสัญญาณ

บัส SPI แบบฟูลดูเพล็กซ์มีสี่สายดังนี้:

  • SCK (สัญญาณนาฬิกาอนุกรม) ขับโดยตัวควบคุม บิตทุกบิตถูกรับหรือส่งออกตามขอบของสัญญาณนี้

  • MOSI (ตัวควบคุมออก, อุปกรณ์ต่อพ่วงรับเข้า) สายเอาต์พุตของตัวควบคุม อุปกรณ์ต่อพ่วงสุ่มตัวอย่างบิตจากสายนี้

  • MISO (ตัวควบคุมรับเข้า, อุปกรณ์ต่อพ่วงออก) สายเอาต์พุตของอุปกรณ์ต่อพ่วง ตัวควบคุมสุ่มตัวอย่างบิตจากสายนี้

  • CS (ชิปเซเล็กต์) หรือบางครั้งเรียกว่า SS (อุปกรณ์ต่อพ่วงเซเล็กต์) เป็นสายแยกต่างหากสำหรับอุปกรณ์ต่อพ่วงแต่ละตัว ตัวควบคุมดึง CS ลงต่ำเพื่อเริ่มต้นการรับส่งข้อมูลและดึงขึ้นสูงเพื่อสิ้นสุด อุปกรณ์ต่อพ่วงใดที่มี CS ไม่ถูกเลือกจะไม่สนใจบัสทั้งหมดและหยุดขับสัญญาณ MISO ออก

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

หนึ่งไบต์ SPI: CS ลดลงต่ำเพื่อเลือกอุปกรณ์ต่อพ่วง, SCK ส่งสัญญาณนาฬิกาแปดบิต, และ MOSI กับ MISO ถ่ายโอนข้อมูลหนึ่งไบต์แต่ละทิศทางพร้อมกัน

ทุกขอบสัญญาณนาฬิกาจะเลื่อนหนึ่งบิตในแต่ละทิศทางพร้อมกัน พัลส์ SCK เดียวส่งหนึ่งบิตบน MOSI และรับหนึ่งบิตบน MISO พร้อมกัน -- SPI เป็น ฟูลดูเพล็กซ์ ในระดับสายสัญญาณ ซอฟต์แวร์ไม่จำเป็นต้องใช้ทั้งสองทิศทาง: การรับส่งแบบเขียนอย่างเดียวและอ่านอย่างเดียวเป็นเรื่องปกติ โดยสายที่ไม่ได้ใช้อาจถูกละเว้นหรือคงอยู่ในสถานะสูง

3.21.2. ขั้วและเฟสของสัญญาณนาฬิกา

บิตกำหนดค่าสองบิตกำหนดว่าขอบสัญญาณนาฬิกาใดจะเลื่อนข้อมูล:

  • ขั้วสัญญาณนาฬิกา (polarity หรือบางครั้ง CPOL) -- สถานะ idle ของ SCK 0 หมายความว่าสัญญาณนาฬิกา idle ต่ำและพัลส์สูง; 1 หมายความว่าสัญญาณนาฬิกา idle สูงและพัลส์ต่ำ

  • เฟสสัญญาณนาฬิกา (phase หรือบางครั้ง CPHA) -- ขอบใดที่สุ่มตัวอย่างข้อมูล 0 สุ่มตัวอย่างที่ขอบแรกของแต่ละพัลส์สัญญาณนาฬิกา (ขอบนำ); 1 สุ่มตัวอย่างที่ขอบที่สอง (ขอบท้าย)

ทั้งสองนี้รวมกันให้สี่ โหมด ที่เรียกตามธรรมเนียมว่า Mode 0 ถึง Mode 3 Mode 0 (polarity=0, phase=0) เป็นที่นิยมมากที่สุดและเป็นค่าเริ่มต้นที่ปลอดภัยสำหรับอุปกรณ์ที่ไม่ทราบค่า

กฎสำคัญคือทั้งสองฝ่ายต้องตกลงกันในเรื่องโหมด โหมดที่ไม่ตรงกันจะให้ข้อมูลที่ผิดพลาดแม้ว่าสายนาฬิกาและสายข้อมูลจะต่อสายถูกต้อง หากอุปกรณ์ส่งคืนข้อมูลไร้สาระในการรับส่งครั้งแรก โหมดคือสิ่งแรกที่ต้องตรวจสอบ

3.21.3. อุปกรณ์ต่อพ่วงหลายตัว

อุปกรณ์ต่อพ่วงหลายตัวสามารถแชร์สาย SCK, MOSI และ MISO เดียวกันได้ ตราบใดที่แต่ละตัวมีสาย CS ของตัวเองที่ขับโดยตัวควบคุม:

  • อุปกรณ์ต่อพ่วงทั้งหมดรับสัญญาณนาฬิกาและข้อมูลเดียวกัน แต่แต่ละตัวดู CS ของตัวเอง เมื่อ CS ไม่ถูกเลือก (สูง) อุปกรณ์ต่อพ่วงจะไม่สนใจ SCK และ MOSI ทั้งหมดและปล่อย MISO ในสถานะอิมพีแดนซ์สูงเพื่อไม่ให้รบกวนอุปกรณ์อื่นในสาย

  • ตัวควบคุมเลือก CS เพียงตัวเดียวในครั้งเดียว ทำการรับส่งข้อมูล และยกเลิกการเลือก CS เพื่อปล่อยบัส

ไมโครคอนโทรลเลอร์ที่มีบล็อกฮาร์ดแวร์ SPI เพียงหนึ่งบล็อกสามารถสื่อสารกับอุปกรณ์ต่อพ่วงได้มากเท่ากับจำนวนพิน GPIO ว่างที่มีสำหรับสาย CS -- ไม่มีการกำหนดที่อยู่บนบัสเอง

3.21.4. จุดแข็งและจุดอ่อน

จุดแข็งและจุดอ่อนของ SPI มาจากการออกแบบของมัน:

  • เร็ว. สามารถทำได้หลายสิบเมกะเฮิรตซ์บนรอยสั้นๆ ด้วยการแปลงระดับสัญญาณอย่างง่าย ตัวอ่านการ์ด SD และจอแสดงผล SPI ใช้ประโยชน์นี้

  • เรียบง่ายในระดับสายสัญญาณ. ไม่มีการกำหนดที่อยู่ ไม่มีการตอบรับ ไม่มีเงื่อนไขเริ่ม/หยุดพิเศษ -- เพียงแค่บิตบนสายที่ซิงโครไนซ์กับสัญญาณนาฬิกา

  • ใช้พินมาก. มีสามสายร่วมกันบวกหนึ่ง CS ต่ออุปกรณ์ต่อพ่วงหนึ่งตัว บอร์ดที่มีอุปกรณ์ SPI ห้าตัวใช้แปดพิน (สาม + ห้า)

  • ระยะสั้น. SPI ต้องการขอบสัญญาณที่ชัดเจนและเร็ว ซึ่งหมายถึงรอยสั้นๆ บนบอร์ดเดียวกัน สำหรับการเชื่อมต่อระยะยาว I2C หรือบัสแบบมีเฟรมอื่นๆ เหมาะสมกว่า