คลาส 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()

ตัวสร้าง

class rp2.PIO(id: int)

คืนค่าอ็อบเจกต์ PIO แบบซิงเกิลตันสำหรับบล็อก PIO ที่ระบุโดย id RP2040 มีสองบล็อก PIO หมายเลข 0 และ 1 ยก ValueError สำหรับ id อื่นใด

เมธอด

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

รับหรือตั้งค่าฐาน GPIO สำหรับบล็อก PIO นี้

RP2040 PIO มองเห็นหน้าต่าง 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)

ID สเตทแมชชีนส่วนกลางของอ็อบเจกต์ที่คืนค่าคือ 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() เพื่อให้พินเริ่มเป็นอินพุตที่ขับค่าต่ำ (เช่น 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() เพื่อให้สเตทแมชชีนมี TX FIFO และ RX 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 ของมัน