class SPI – פרוטוקול אפיק Serial Peripheral Interface (צד הבקר)#

SPI הוא פרוטוקול טורי סינכרוני המונע על ידי בקר. ברמה הפיזית, אפיק מורכב מ-3 קווים: SCK, MOSI, MISO. התקנים מרובים יכולים לחלוק את אותו האפיק. לכל התקן צריך להיות אות נפרד, רביעי, CS (Chip Select), כדי לבחור התקן מסוים באפיק שאיתו מתבצעת התקשורת. ניהול אות ה-CS צריך להתבצע בקוד המשתמש (באמצעות המחלקה machine.Pin).

קיימים מימושי SPI חומרתיים ותוכנתיים כאחד באמצעות המחלקות SPI ו-SoftSPI. SPI חומרתי משתמש בתמיכת החומרה הבסיסית של המערכת כדי לבצע את הקריאות/כתיבות, והוא בדרך כלל יעיל ומהיר אך עשוי להיות מוגבל לגבי הפינים שניתן להשתמש בהם. SPI תוכנתי ממומש באמצעות bit-banging וניתן להשתמש בו בכל פין אך אינו יעיל באותה מידה. למחלקות אלו יש את אותן המתודות הזמינות, והן נבדלות בעיקר באופן שבו הן נבנות.

דוגמת שימוש:

from machine import SPI, Pin

spi = SPI(0, baudrate=400000)           # Create SPI peripheral 0 at frequency of 400kHz.
                                        # Depending on the use case, extra parameters may be required
                                        # to select the bus characteristics and/or pins to use.
cs = Pin(4, mode=Pin.OUT, value=1)      # Create chip-select on pin 4.

try:
    cs(0)                               # Select peripheral.
    spi.write(b"12345678")              # Write 8 bytes, and don't care about received data.
finally:
    cs(1)                               # Deselect peripheral.

try:
    cs(0)                               # Select peripheral.
    rxdata = spi.read(8, 0x42)          # Read 8 bytes while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

rxdata = bytearray(8)
try:
    cs(0)                               # Select peripheral.
    spi.readinto(rxdata, 0x42)          # Read 8 bytes inplace while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

txdata = b"12345678"
rxdata = bytearray(len(txdata))
try:
    cs(0)                               # Select peripheral.
    spi.write_readinto(txdata, rxdata)  # Simultaneously write and read bytes.
finally:
    cs(1)                               # Deselect peripheral.

בנאים#

class machine.SPI(id: int, baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)#

בונה אובייקט SPI על האפיק הנתון, id. ערכי id תלויים בפורט מסוים ובחומרה שלו. הערכים 0, 1 וכו« נמצאים בשימוש נפוץ לבחירת בלוק SPI חומרתי מס« 0, מס« 1 וכו«.

ללא פרמטרים נוספים, אובייקט ה-SPI נוצר אך אינו מאותחל (יש לו את ההגדרות מהאתחול האחרון של האפיק, אם היה כזה). אם ניתנים ארגומנטים נוספים, האפיק מאותחל. ראה init לקבלת פרמטרי האתחול.

מתודות#

init(baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None#

מאתחל את אפיק ה-SPI עם הפרמטרים הנתונים:

  • baudrate הוא קצב שעון ה-SCK.

  • polarity יכול להיות 0 או 1, והוא הרמה שבה יושב קו השעון במצב סרק.

  • phase יכול להיות 0 או 1 כדי לדגום נתונים בקצה השעון הראשון או השני בהתאמה.

  • bits הוא הרוחב בביטים של כל העברה. רק 8 מובטח להיתמך על ידי כל החומרה.

  • firstbit יכול להיות SPI.MSB או SPI.LSB.

  • sck, mosi, miso הם פינים (אובייקטים machine.Pin) שישמשו לאותות האפיק. עבור רוב בלוקי ה-SPI החומרתיים (כפי שנבחרו על ידי הפרמטר id לבנאי), הפינים קבועים ואינם ניתנים לשינוי. במקרים מסוימים, בלוקי חומרה מאפשרים 2-3 קבוצות פינים חלופיות עבור בלוק SPI חומרתי. הקצאות פינים שרירותיות אפשריות רק עבור מנהל התקן SPI מסוג bitbanging (id = -1).

במקרה של SPI חומרתי, תדר השעון בפועל עשוי להיות נמוך מה-baudrate המבוקש. הדבר תלוי בחומרת הפלטפורמה. ניתן לקבוע את הקצב בפועל על ידי הדפסת אובייקט ה-SPI.

deinit() None#

מכבה את אפיק ה-SPI.

read(nbytes: int, write: int = 0x00) bytes#

קורא מספר בתים שצוין על ידי nbytes תוך כדי כתיבה מתמשכת של הבית הבודד הנתון על ידי write. מחזיר אובייקט bytes עם הנתונים שנקראו.

readinto(buf: bytearray, write: int = 0x00) None#

קורא לתוך החוצץ שצוין על ידי buf תוך כדי כתיבה מתמשכת של הבית הבודד הנתון על ידי write. מחזיר None.

write(buf: bytes) None#

כותב את הבתים הכלולים ב-buf. מחזיר None.

write_readinto(write_buf: bytes, read_buf: bytearray) None#

כותב את הבתים מ-write_buf תוך כדי קריאה לתוך read_buf. החוצצים יכולים להיות זהים או שונים, אך לשני החוצצים חייב להיות אותו אורך. מחזיר None.

קבועים#

MSB: int#

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

LSB: int#

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

class SoftSPI – אפיק SPI בהדמיית תוכנה#

המחלקה SoftSPI מממשת SPI באמצעות bit-banging של פיני GPIO שרירותיים. היא חושפת את אותו מערך מתודות כמו SPI, כך שקוד קיים שמכוון ל-SPI חומרתי יכול לעבור לתוכנה רק בשינוי הבנאי. השתמש בה כאשר הפינים שאתה צריך אינם מחווטים לבלוק SPI חומרתי, כאשר אתה צריך יותר מהאפיקים החומרתיים הזמינים, או כאשר התקן היקפי דורש פאזת שעון לא סטנדרטית שהחומרה אינה יכולה להפיק.

בנאים#

class machine.SoftSPI(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)#

בונה אובייקט SPI תוכנתי. יש לספק את sck, mosi ו-miso – אין בחירת פינים מובלעת. ראה SPI.init() לקבלת משמעות שאר הפרמטרים. ברירת המחדל של baudrate נמוכה יותר מאשר עבור SPI חומרתי משום שללולאת ה-bit-bang יש תקורה גבוהה יותר.

מתודות#

init(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SoftSPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None#

מאתחל מחדש את אפיק ה-SPI התוכנתי עם הפרמטרים הנתונים. רק ארגומנטים שסופקו מעודכנים; השאר שומרים על ערכיהם הקודמים. ראה SPI.init() לקבלת משמעות כל ארגומנט.

deinit() None#

משחרר את פיני ה-GPIO שתפס מנהל ההתקן של bit-bang ומפסיק לתפעל את האפיק.

read(nbytes: int, write: int = 0x00) bytes#

קורא nbytes בתים תוך כדי כתיבה מתמשכת של הבית הבודד write. מחזיר אובייקט bytes המכיל את הנתונים שהתקבלו.

readinto(buf: bytearray, write: int = 0x00) None#

קורא לתוך buf תוך כדי כתיבה מתמשכת של הבית הבודד write. מחזיר None.

write(buf: bytes) None#

כותב את buf אל האפיק. בתים שהתקבלו מושמטים.

write_readinto(write_buf: bytes, read_buf: bytearray) None#

כותב בו-זמנית את write_buf וקורא לתוך read_buf. שני החוצצים חייבים להיות באותו אורך; הם רשאים לחפוף (alias).

קבועים#

MSB: int#

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

LSB: int#

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