class SPI -- โปรโตคอลอนุกรมที่ขับเคลื่อนโดยตัวควบคุม¶
SPI เป็นโปรโตคอลอนุกรมแบบซิงโครนัสที่ขับเคลื่อนโดยตัวควบคุม ในระดับฟิสิคัลใช้สามสาย (SCK, MOSI, MISO) บวกกับสายเลือกชิปต่ออุปกรณ์ต่อพ่วงหนึ่งสาย
การใช้งานคล้ายกับ I2C; ความแตกต่างหลักคือพารามิเตอร์ที่ส่งเมื่อเริ่มต้นบัส:
from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)
พารามิเตอร์ที่จำเป็นเพียงอย่างเดียวคือ mode (SPI.CONTROLLER หรือ SPI.PERIPHERAL) polarity คือระดับไม่ใช้งานของ SCK (0 หรือ 1) phase เลือกว่าข้อมูลถูกสุ่มตัวอย่างบนขอบนาฬิกาแรก (0) หรือที่สอง (1) crc เป็น None (ไม่มี CRC) หรือพหุนาม CRC
การถ่ายโอนข้อมูล:
data = spi.send_recv(b"1234") # send 4 bytes and receive 4 bytes
buf = bytearray(4)
spi.send_recv(b"1234", buf) # send 4 bytes and receive 4 into buf
spi.send_recv(buf, buf) # send/receive 4 bytes through buf
ตัวสร้าง¶
- class pyb.SPI(bus: int | str, *args, **kwargs)¶
สร้างออบเจกต์ SPI บน
busที่กำหนด (ดัชนีอุปกรณ์ต่อพ่วง SPI เป็นจำนวนเต็ม เช่น2สำหรับSPI2) เมื่อไม่มีพารามิเตอร์เพิ่มเติม ออบเจกต์จะถูกสร้างแต่ไม่ได้เริ่มต้น (เก็บการตั้งค่าบัสก่อนหน้าหากมี); หากมีอาร์กิวเมนต์เพิ่มเติม บัสจะถูกเริ่มต้นด้วยอาร์กิวเมนต์เหล่านั้น ดูinit()สำหรับพารามิเตอร์ที่มีSPI(2)เชื่อมต่อกับพินส่วนหัวเดียวกันบน OpenMV Cam STM32 ทุกรุ่น; OpenMV Cam N6 เปิดเผยSPI(4)เพิ่มเติม:บัส
NSS
SCK
MISO
MOSI
SPI(2)(OpenMV Cam STM32 ทุกรุ่น)P3P2P1P0SPI(4)(เฉพาะ OpenMV Cam N6)P15P16P17P18NSSไม่ได้ถูกขับเคลื่อนโดยอุปกรณ์ต่อพ่วง SPI บนบัสใดก็ตาม สามารถใช้งานได้อย่างอิสระเป็น GPIO chip-select ปกติเมธอด¶
- init(mode: int, baudrate: int = 328125, *, prescaler: int = -1, polarity: int = 1, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, ti: bool = False, crc: int | None = None) None¶
เริ่มต้นบัส SPI ด้วยพารามิเตอร์ที่กำหนด:
modeต้องเป็นSPI.CONTROLLERหรือSPI.PERIPHERALbaudrateคืออัตรานาฬิกา SCK (มีความหมายสำหรับตัวควบคุมเท่านั้น)prescalerคือตัวหารล่วงหน้าที่ใช้สำหรับหา SCK จากความถี่บัส APB; การใช้prescalerจะแทนที่baudratepolarityสามารถเป็น 0 หรือ 1 และเป็นระดับที่สายนาฬิกาไม่ใช้งานอยู่phaseสามารถเป็น 0 หรือ 1 เพื่อสุ่มตัวอย่างข้อมูลบนขอบนาฬิกาแรกหรือที่สองตามลำดับbitsสามารถเป็น 8 หรือ 16 และเป็นจำนวนบิตในแต่ละคำที่ถ่ายโอนfirstbitสามารถเป็นSPI.MSBหรือSPI.LSBtiTrue หมายถึง Texas Instruments ซึ่งตรงข้ามกับ Motorola สำหรับข้อตกลงสัญญาณcrcสามารถเป็น None สำหรับไม่มี CRC หรือตัวระบุพหุนาม
ความถี่นาฬิกา SPI อาจไม่ตรงกับ
baudrateพอดี ฮาร์ดแวร์รองรับเฉพาะนาฬิกาที่เป็นความถี่บัส APB หลักหารด้วยตัวหารล่วงหน้าที่เป็นกำลังสองของสอง (2, 4, 8, 16, 32, 64, 128หรือ256); ไดรเวอร์จะเลือกตัวที่สูงสุดที่ไม่เกินbaudrateที่ร้องขอSPI(2)อยู่บน APB1 สำหรับการควบคุมนาฬิกาที่แม่นยำ ตั้งค่าprescalerโดยตรงแทนbaudrateการพิมพ์ออบเจกต์ SPI แสดงอัตราบอดที่คำนวณได้และตัวหารล่วงหน้าที่เลือก
- recv(recv: int | bytearray, *, timeout: int = 5000) bytes¶
รับข้อมูลบนบัส:
recvสามารถเป็นจำนวนเต็ม ซึ่งเป็นจำนวนไบต์ที่จะรับ หรือบัฟเฟอร์ที่แก้ไขได้ ซึ่งจะถูกเติมด้วยไบต์ที่รับtimeoutคือระยะหมดเวลาในมิลลิวินาทีสำหรับรอการรับ
ค่าที่คืน: หาก
recvเป็นจำนวนเต็ม จะคืนค่าบัฟเฟอร์ใหม่ของไบต์ที่รับ มิฉะนั้นจะคืนค่าบัฟเฟอร์เดียวกับที่ส่งไปยังrecv
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
ส่งข้อมูลบนบัส:
sendคือข้อมูลที่จะส่ง (จำนวนเต็มที่จะส่ง หรือออบเจกต์บัฟเฟอร์)timeoutคือระยะหมดเวลาในมิลลิวินาทีสำหรับรอการส่ง
- send_recv(send: int | bytes | bytearray, recv: bytearray | None = None, *, timeout: int = 5000) bytes¶
ส่งและรับข้อมูลบนบัสพร้อมกัน:
sendคือข้อมูลที่จะส่ง (จำนวนเต็มที่จะส่ง หรือออบเจกต์บัฟเฟอร์)recvคือบัฟเฟอร์ที่แก้ไขได้ซึ่งจะถูกเติมด้วยไบต์ที่รับ อาจเป็นบัฟเฟอร์เดียวกับsendหรือละเว้นได้ หากละเว้น บัฟเฟอร์ใหม่จะถูกสร้างtimeoutคือระยะหมดเวลาในมิลลิวินาทีสำหรับรอการรับ
ค่าที่คืน: บัฟเฟอร์พร้อมไบต์ที่รับ
ค่าคงที่¶
- CONTROLLER: int¶
เริ่มต้นบัส SPI เป็นมาสเตอร์ (ตัวควบคุม) -- OpenMV Cam ขับ
SCKและMOSIและเป็นผู้ควบคุมธุรกรรม