class SPI – פרוטוקול סדרתי מונע בקר

SPI הוא פרוטוקול סדרתי סינכרוני המונע על ידי בקר. ברמה הפיזית הוא משתמש בשלושה קווים (SCK, MOSI, MISO) בתוספת קו chip-select לכל התקן היקפי.

השימוש דומה ל-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 באף אחד מהאפיקים; הוא חופשי לשימוש כ-chip-select רגיל מסוג GPIO.

מתודות

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 הוא מחלק התדר (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 יכול להיות מספר שלם, שהוא מספר הבייטים לקבלה, או חוצץ (buffer) בר-שינוי, שיתמלא בבייטים שהתקבלו.

  • 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 כ-master (בקר) – ה-OpenMV Cam נוהג את SCK ו-MOSI והוא האחראי על הטרנזקציה.

PERIPHERAL: int

אתחול אפיק ה-SPI כ-slave (התקן היקפי) – ה-OpenMV Cam מגיב לפעימות השעון שמונע בקר מרוחק.

MSB: int

מועבר ל-firstbit כדי לשדר/לקבל את הסיבית המשמעותית ביותר תחילה (הסדר הנפוץ ביותר).

LSB: int

מועבר ל-firstbit כדי לשדר/לקבל את הסיבית הפחות משמעותית תחילה.