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 ออก
หนึ่งไบต์ SPI: CS ลดลงต่ำเพื่อเลือกอุปกรณ์ต่อพ่วง, SCK ส่งสัญญาณนาฬิกาแปดบิต, และ MOSI กับ MISO ถ่ายโอนข้อมูลหนึ่งไบต์แต่ละทิศทางพร้อมกัน¶
ทุกขอบสัญญาณนาฬิกาจะเลื่อนหนึ่งบิตในแต่ละทิศทางพร้อมกัน พัลส์ SCK เดียวส่งหนึ่งบิตบน MOSI และรับหนึ่งบิตบน MISO พร้อมกัน -- SPI เป็น ฟูลดูเพล็กซ์ ในระดับสายสัญญาณ ซอฟต์แวร์ไม่จำเป็นต้องใช้ทั้งสองทิศทาง: การรับส่งแบบเขียนอย่างเดียวและอ่านอย่างเดียวเป็นเรื่องปกติ โดยสายที่ไม่ได้ใช้อาจถูกละเว้นหรือคงอยู่ในสถานะสูง
3.21.2. ขั้วและเฟสของสัญญาณนาฬิกา¶
บิตกำหนดค่าสองบิตกำหนดว่าขอบสัญญาณนาฬิกาใดจะเลื่อนข้อมูล:
ขั้วสัญญาณนาฬิกา (
polarityหรือบางครั้งCPOL) -- สถานะ idle ของ SCK0หมายความว่าสัญญาณนาฬิกา 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 หรือบัสแบบมีเฟรมอื่นๆ เหมาะสมกว่า