เราศึกษาอินเทอร์เฟซ SPI และเชื่อมต่อ shift register กับ Arduino ซึ่งเราจะเข้าถึงโดยใช้โปรโตคอลนี้เพื่อควบคุม LED
จำเป็น
- - Arduino;
- - กะทะเบียน 74HC595;
- - ไฟ LED 8 ดวง;
- - ตัวต้านทาน 8 ตัว 220 โอห์ม
คำแนะนำ
ขั้นตอนที่ 1
SPI - Serial Peripheral Interface หรือ "Serial Peripheral Interface" เป็นโปรโตคอลการถ่ายโอนข้อมูลแบบซิงโครนัสสำหรับเชื่อมต่ออุปกรณ์หลักกับอุปกรณ์ต่อพ่วง (ทาส) เจ้านายมักเป็นไมโครคอนโทรลเลอร์ การสื่อสารระหว่างอุปกรณ์ดำเนินการผ่านสายสี่สาย ซึ่งเป็นสาเหตุที่บางครั้ง SPI ถูกเรียกว่า "อินเทอร์เฟซแบบสี่สาย" ยางเหล่านี้คือ:
MOSI (Master Out Slave In) - สายส่งข้อมูลจากมาสเตอร์ไปยังอุปกรณ์สเลฟ
MISO (Master In Slave Out) - สายส่งจากสเลฟไปยังมาสเตอร์
SCLK (นาฬิกาอนุกรม) - พัลส์นาฬิกาการซิงโครไนซ์ที่สร้างโดยต้นแบบ
SS (Slave Select) - บรรทัดการเลือกอุปกรณ์สเลฟ เมื่ออยู่ในบรรทัด "0" ทาส "เข้าใจ" ว่ามีการเข้าถึง
การถ่ายโอนข้อมูลมีสี่โหมด (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3) เนื่องจากการรวมกันของขั้วสัญญาณนาฬิกา (เราทำงานที่ระดับสูงหรือต่ำ) ขั้วนาฬิกา CPOL และเฟสของพัลส์นาฬิกา (การซิงโครไนซ์ บนขอบขึ้นหรือลงของพัลส์นาฬิกา), เฟสนาฬิกา, CPHA
รูปแสดงสองตัวเลือกสำหรับการเชื่อมต่ออุปกรณ์โดยใช้โปรโตคอล SPI: อิสระและแบบเรียงซ้อน เมื่อเชื่อมต่อกับบัส SPI อย่างอิสระ มาสเตอร์จะสื่อสารกับแต่ละสเลฟทีละตัว ด้วยน้ำตก - อุปกรณ์สเลฟจะถูกทริกเกอร์สลับกันในน้ำตก
ขั้นตอนที่ 2
ใน Arduino บัส SPI อยู่บนพอร์ตเฉพาะ แต่ละบอร์ดมีการกำหนดพินของตัวเอง เพื่อความสะดวก หมุดจะถูกทำซ้ำและวางบนตัวเชื่อมต่อ ICSP (In Circuit Serial Programming) แยกต่างหาก โปรดทราบว่าไม่มีพินเลือกทาสบนตัวเชื่อมต่อ ICSP - SS เนื่องจาก สันนิษฐานว่าจะใช้ Arduino เป็นต้นแบบในเครือข่าย แต่ถ้าจำเป็น คุณสามารถกำหนดพินดิจิทัลของ Arduino เป็น SS ได้
รูปแสดงการกำหนดมาตรฐานของพินไปยังบัส SPI สำหรับ Arduino UNO และ Nano
ขั้นตอนที่ 3
มีการเขียนไลบรารีพิเศษสำหรับ Arduino ที่ใช้โปรโตคอล SPI มีการเชื่อมต่อดังนี้: ที่จุดเริ่มต้นของโปรแกรม ให้เพิ่ม #include SPI.h
ในการเริ่มทำงานกับโปรโตคอล SPI คุณต้องตั้งค่าและเริ่มต้นโปรโตคอลโดยใช้ขั้นตอน SPI.beginTransaction () คุณสามารถทำได้ด้วยคำสั่งเดียว: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0))
ซึ่งหมายความว่าเราเริ่มต้นโปรโตคอล SPI ที่ความถี่ 14 MHz การถ่ายโอนข้อมูลเริ่มต้นจาก MSB (บิตที่สำคัญที่สุด) ในโหมด "0"
หลังจากการเริ่มต้น เราเลือกอุปกรณ์สเลฟโดยใส่พิน SS ที่สอดคล้องกันในสถานะ LOW
จากนั้นเราถ่ายโอนข้อมูลไปยังอุปกรณ์สเลฟด้วยคำสั่ง SPI.transfer ()
หลังจากส่ง เราจะคืน SS เป็นสถานะสูง
ทำงานกับโปรโตคอลลงท้ายด้วยคำสั่ง SPI.endTransaction () ขอแนะนำให้ลดเวลาดำเนินการของการถ่ายโอนระหว่างคำสั่ง SPI.beginTransaction () และ SPI.endTransaction () เพื่อไม่ให้เกิดการทับซ้อนกันหากอุปกรณ์อื่นพยายามเริ่มต้นการถ่ายโอนข้อมูลโดยใช้การตั้งค่าที่แตกต่างกัน
ขั้นตอนที่ 4
ลองพิจารณาการใช้งานจริงของอินเทอร์เฟซ SPI เราจะจุดไฟ LED โดยควบคุมการลงทะเบียนกะ 8 บิตผ่านบัส SPI มาเชื่อมต่อ 74HC595 shift register กับ Arduino เราเชื่อมต่อกับเอาต์พุตทั้ง 8 เอาต์พุตผ่าน LED (ผ่านตัวต้านทานที่จำกัด) แผนภาพแสดงในรูป
ขั้นตอนที่ 5
มาเขียนแบบร่างกันเถอะ
ขั้นแรก มาเชื่อมต่อไลบรารี SPI และเริ่มต้นอินเทอร์เฟซ SPI มากำหนดพิน 8 เป็นพินการเลือกสเลฟ มาล้างการลงทะเบียนกะโดยส่งค่า "0" ไปที่มัน เราเริ่มต้นพอร์ตอนุกรม
หากต้องการให้ไฟ LED เฉพาะโดยใช้ shift register คุณต้องใส่ตัวเลข 8 บิตกับอินพุต ตัวอย่างเช่น เพื่อให้ LED ดวงแรกสว่างขึ้น เราป้อนเลขฐานสอง 00000001 สำหรับอันที่สอง - 00000010 สำหรับอันที่สาม - 00000100 เป็นต้น เลขฐานสองเหล่านี้ในรูปแบบเลขฐานสิบมีลำดับต่อไปนี้: 1, 2, 4, 8, 16, 32, 64, 128 และเป็นกำลังสองจาก 0 ถึง 7
ดังนั้นในลูป () ด้วยจำนวน LED เราคำนวณใหม่จาก 0 ถึง 7 ฟังก์ชัน pow (ฐาน, องศา) ยก 2 เป็นกำลังของตัวนับรอบ ไมโครคอนโทรลเลอร์ทำงานไม่ถูกต้องนักกับตัวเลขประเภท "คู่" ดังนั้นในการแปลงผลลัพธ์เป็นจำนวนเต็ม เราใช้ฟังก์ชันปัดเศษ () และเราโอนหมายเลขผลลัพธ์ไปยังรีจิสเตอร์กะ เพื่อความชัดเจน จอภาพพอร์ตอนุกรมจะแสดงค่าที่ได้รับระหว่างการดำเนินการนี้: หนึ่งวิ่งผ่านตัวเลข - ไฟ LED จะสว่างเป็นคลื่น
ขั้นตอนที่ 6
ไฟ LED จะสว่างขึ้น และเราสังเกตเห็น "คลื่น" ที่กำลังเคลื่อนที่ LED ถูกควบคุมโดยใช้ shift register ซึ่งเราเชื่อมต่อผ่านอินเทอร์เฟซ SPI เป็นผลให้ใช้พิน Arduino เพียง 3 ตัวเพื่อขับเคลื่อน LED 8 ดวง
เราได้ศึกษาตัวอย่างที่ง่ายที่สุดว่า Arduino ทำงานร่วมกับบัส SPI อย่างไร เราจะพิจารณารายละเอียดเพิ่มเติมเกี่ยวกับการเชื่อมต่อของ shift register ในบทความแยกต่างหาก