الصنف PIO -- الاستخدام المتقدم لـ PIO

يغلّف الصنف PIO إحدى كتلتي الإدخال/الإخراج القابل للبرمجة (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 المفرد لكتلة PIO المحدّدة بـ id. يحتوي RP2040 على كتلتي PIO، مرقّمتين 0 و 1. يثير ValueError لأي معرّف آخر.

الطرائق (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 هو فهرس آلة الحالة المحلي (0 -- 3).

إذا قُدّم program، تُهيّأ آلة الحالة لتشغيله -- وتُمرّر جميع الوسائط الموضعية/المفتاحية إلى StateMachine.init().

مثال:

>>> 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 هو دالة رد النداء التي تُطلق عندما يثبّت أي من IRQ آلات الحالة المطلوبة. يستقبل المعالج نسخة PIO هذه كوسيطه الوحيد؛ داخل المعالج يمكن تحديد آلات الحالة المُطلِقة عبر self.irq().flags() مع تطبيق عملية AND مقابل الثوابت IRQ_SM*.

trigger هو قناع بتّي لواحد أو أكثر من IRQ_SM0 .. IRQ_SM3. الافتراضي يُطلق على أي آلة حالة.

hard=True يسجّل معالج مقاطعة صلبة (دون تخصيص في الكومة داخل دالة رد النداء).

يربط MicroPython الـ IRQ 0 على كل كتلة PIO؛ أما الـ IRQ 1 فمحجوز وغير قابل للوصول من Python.

الثوابت

IN_LOW: int

مرّره إلى out_init / set_init / sideset_init لـ asm_pio() بحيث يبدأ الدبوس كمدخل مدفوع إلى المستوى المنخفض (أي حالة ثلاثية مع احتفاظ مخزن الإخراج المؤقت بقيمة 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 منفصلين بسعة 4 كلمات للإرسال والاستقبال (الافتراضي).

JOIN_TX: int

مرّره إلى fifo_join لـ asm_pio() بحيث يتضاعف طابور TX FIFO إلى 8 كلمات بامتصاص طابور RX FIFO. لم يعد بإمكان آلة الحالة استقبال البيانات.

JOIN_RX: int

مرّره إلى fifo_join لـ asm_pio() بحيث يتضاعف طابور RX FIFO إلى 8 كلمات بامتصاص طابور TX FIFO. لم يعد بإمكان آلة الحالة إرسال البيانات.

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 الخاص بها.