class PIO – שימוש מתקדם ב-PIO

המחלקה PIO עוטפת את אחד משני בלוקי ה-Programmable I/O (PIO) של ה-RP2040. כל בלוק PIO מכיל זיכרון הוראות (32 הוראות) המשותף לארבע מכונות מצב עצמאיות, בנוסף לממשק FIFO פרטי לכל מכונת מצב ובקר IRQ.

רוב הסקריפטים מתקשרים עם PIO דרך StateMachine – מחלקה זו מיועדת למקרי שימוש מתקדמים הזקוקים ל:

  • טעינה והסרה של תוכניות באופן מפורש באמצעות add_program() / remove_program().

  • הזזת בסיס ה-GPIO של ה-PIO ברחבי חלון 32 הפינים של השבב באמצעות gpio_base().

  • התחברות לדגלי IRQ ברמת הבלוק כולו באמצעות irq().

להרכבת תוכניות PIO ראו rp2.asm_pio().

Constructors

class rp2.PIO(id: int)

מחזיר את אובייקט ה-PIO היחיד (singleton) עבור בלוק ה-PIO המזוהה על ידי id. ל-RP2040 יש שני בלוקי PIO, ממוספרים 0 ו-1. מעלה ValueError עבור כל id אחר.

Methods

gpio_base(base: machine.Pin | int | None = None, /) int

מקבל או מגדיר את בסיס ה-GPIO עבור בלוק PIO זה.

ה-PIO של ה-RP2040 רואה חלון של 32 פינים אל מרחב ה-GPIO; החלון יכול להתחיל ב-GPIO0 או ב-GPIO16. הבסיס שולט באיזה חלון פעיל עבור כל מכונות המצב על PIO זה.

ללא ארגומנט, מחזיר את הבסיס הנוכחי (מספר פין ה-GPIO, 0 או 16).

עם ארגומנט, מגדיר את הבסיס. הערך base יכול להיות מופע של machine.Pin או מספר פין שלם, וחייב להניב GPIO0 או GPIO16. יש להגדיר את הבסיס לפני שמוסיפים תוכנית כלשהי או בונים מכונת מצב על בלוק PIO זה.

add_program(program: Callable) None

טוען את program אל זיכרון ההוראות של PIO זה. פריסת הזיכרון המתקבלת משמשת מחדש בכל מכונות המצב על בלוק PIO זה.

לכל PIO יש רק 32 הוראות של זיכרון תוכנית המשותף בין כל התוכניות; אם התוכנית החדשה אינה נכנסת, שיטה זו מעלה OSError(ENOMEM). ניתן לטעון את אותה תוכנית על שני מופעי ה-PIO, אך הם צורכים אזורי זיכרון נפרדים.

remove_program(program: Callable | None = None, /) None

מסיר את program מזיכרון ההוראות של PIO זה, ומפנה מקום עבור תוכניות חדשות. אם program מושמט, כל תוכנית הטעונה כעת על PIO זה מוסרת.

הסרת תוכנית שלא נטענה אינה מבצעת דבר (אין חריגה).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

מחזיר אחד מארבעת מופעי ה-StateMachine שבבעלות בלוק PIO זה. הערך id הוא אינדקס מכונת המצב המקומי (03).

אם program מסופק, מכונת המצב מוגדרת להריץ אותו – כל הארגומנטים המיקומיים/בעלי המילות מפתח מועברים אל StateMachine.init().

Example:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

מזהה מכונת המצב הגלובלי של האובייקט המוחזר הוא pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

מקבל או מגדיר את ה-IRQ ברמת הבלוק עבור PIO זה.

הערך handler הוא פונקציית ה-callback שתופעל כאשר אחד מ-IRQ-ים המבוקשים של מכונת המצב ננעל. ה-handler מקבל מופע PIO זה כארגומנט היחיד שלו; בתוך ה-handler ניתן לזהות את מכונות המצב המפעילות באמצעות self.irq().flags() עם AND מול קבועי IRQ_SM*.

הערך trigger הוא מסכת ביטים של אחד או יותר מ-IRQ_SM0 .. IRQ_SM3. ברירת המחדל מפעילה על כל מכונת מצב.

hard=True רושם handler של פסיקה קשיחה (ללא הקצאת heap בתוך ה-callback).

MicroPython מקצה את IRQ 0 על כל בלוק PIO; IRQ 1 שמור ואינו נגיש מ-Python.

Constants

IN_LOW: int

מועבר אל out_init / set_init / sideset_init של asm_pio() כך שהפין מתחיל כקלט המונע למצב נמוך (כלומר tristate כאשר חוצץ הפלט מחזיק 0).

IN_HIGH: int

מועבר אל out_init / set_init / sideset_init של asm_pio() כך שהפין מתחיל כקלט כאשר חוצץ הפלט מחזיק 1.

OUT_LOW: int

מועבר אל out_init / set_init / sideset_init של asm_pio() כך שהפין מתחיל כפלט מונע ברמה לוגית 0.

OUT_HIGH: int

מועבר אל out_init / set_init / sideset_init של asm_pio() כך שהפין מתחיל כפלט מונע ברמה לוגית 1.

SHIFT_LEFT: int

מועבר אל in_shiftdir / out_shiftdir של asm_pio() או StateMachine.init() כך שההזזות מזיזות ביטים לכיוון ה-MSB.

SHIFT_RIGHT: int

מועבר אל in_shiftdir / out_shiftdir של asm_pio() או StateMachine.init() כך שההזזות מזיזות ביטים לכיוון ה-LSB.

JOIN_NONE: int

מועבר אל fifo_join של asm_pio() כך שלמכונת המצב יש FIFO-ים נפרדים של TX ו-RX בני 4 מילים (ברירת המחדל).

JOIN_TX: int

מועבר אל fifo_join של asm_pio() כך ש-FIFO ה-TX מוכפל ל-8 מילים על ידי בליעת FIFO ה-RX. מכונת המצב אינה יכולה עוד לקבל נתונים.

JOIN_RX: int

מועבר אל fifo_join של asm_pio() כך ש-FIFO ה-RX מוכפל ל-8 מילים על ידי בליעת FIFO ה-TX. מכונת המצב אינה יכולה עוד לשדר נתונים.

IRQ_SM0: int

דגל trigger של irq(): מכונת מצב 0 העלתה את ה-IRQ שלה.

IRQ_SM1: int

דגל trigger של irq(): מכונת מצב 1 העלתה את ה-IRQ שלה.

IRQ_SM2: int

דגל trigger של irq(): מכונת מצב 2 העלתה את ה-IRQ שלה.

IRQ_SM3: int

דגל trigger של irq(): מכונת מצב 3 העלתה את ה-IRQ שלה.