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 ทุกรุ่น)

P3

P2

P1

P0

SPI(4) (เฉพาะ OpenMV Cam N6)

P15

P16

P17

P18

NSS ไม่ได้ถูกขับเคลื่อนโดยอุปกรณ์ต่อพ่วง SPI บนบัสใดก็ตาม สามารถใช้งานได้อย่างอิสระเป็น GPIO chip-select ปกติ

เมธอด

deinit() None

ปิดบัส SPI

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.PERIPHERAL

  • baudrate คืออัตรานาฬิกา SCK (มีความหมายสำหรับตัวควบคุมเท่านั้น)

  • prescaler คือตัวหารล่วงหน้าที่ใช้สำหรับหา SCK จากความถี่บัส APB; การใช้ prescaler จะแทนที่ baudrate

  • polarity สามารถเป็น 0 หรือ 1 และเป็นระดับที่สายนาฬิกาไม่ใช้งานอยู่

  • phase สามารถเป็น 0 หรือ 1 เพื่อสุ่มตัวอย่างข้อมูลบนขอบนาฬิกาแรกหรือที่สองตามลำดับ

  • bits สามารถเป็น 8 หรือ 16 และเป็นจำนวนบิตในแต่ละคำที่ถ่ายโอน

  • firstbit สามารถเป็น SPI.MSB หรือ SPI.LSB

  • ti True หมายถึง 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 และเป็นผู้ควบคุมธุรกรรม

PERIPHERAL: int

เริ่มต้นบัส SPI เป็นสเลฟ (อุปกรณ์ต่อพ่วง) -- OpenMV Cam ตอบสนองต่อสัญญาณนาฬิกาที่ขับเคลื่อนโดยตัวควบคุมระยะไกล

MSB: int

ส่งไปยัง firstbit เพื่อส่ง/รับบิตที่มีนัยสำคัญสูงสุดก่อน (การจัดลำดับที่พบบ่อยที่สุด)

LSB: int

ส่งไปยัง firstbit เพื่อส่ง/รับบิตที่มีนัยสำคัญน้อยที่สุดก่อน