คลาส StateMachine -- การเข้าถึงอินเทอร์เฟซ I/O แบบโปรแกรมได้ของ RP2040

คลาส StateMachine ให้การเข้าถึงอินเทอร์เฟซ PIO (programmable I/O) ของ RP2040

สำหรับการแอสเซมเบิลโปรแกรม PIO ดูที่ rp2.asm_pio()

ตัวสร้าง

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

รับสเตทแมชชีนหมายเลข id RP2040 มีสอง PIO อินสแตนซ์ที่เหมือนกัน แต่ละตัวมีสเตทแมชชีน 4 ตัว: ดังนั้นจึงมีสเตทแมชชีนทั้งหมด 8 ตัว หมายเลข 0 ถึง 7

สามารถเลือกเริ่มต้นด้วยโปรแกรม program ที่ให้ไว้ได้: ดู StateMachine.init

init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None

กำหนดค่าอินสแตนซ์สเตทแมชชีนให้รันโปรแกรม program ที่ให้ไว้

โปรแกรมจะถูกเพิ่มเข้าสู่หน่วยความจำคำสั่งของ PIO อินสแตนซ์นี้ หากหน่วยความจำคำสั่งมีโปรแกรมนี้อยู่แล้ว ออฟเซ็ตของมันจะถูกนำกลับมาใช้เพื่อประหยัดหน่วยความจำคำสั่ง

  • freq คือความถี่ในหน่วย Hz ที่จะรันสเตทแมชชีน ค่าเริ่มต้นคือความถี่นาฬิการะบบ

    ตัวหารนาฬิกาคำนวณเป็น system clock frequency / freq ดังนั้นอาจมีข้อผิดพลาดการปัดเศษเล็กน้อย

    ตัวหารนาฬิกาขั้นต่ำที่เป็นไปได้คือหนึ่งส่วน 65536 ของนาฬิการะบบ: ดังนั้นที่ความถี่นาฬิการะบบเริ่มต้น 125MHz ค่าต่ำสุดของ freq คือ 1908 เพื่อรันสเตทแมชชีนที่ความถี่ต่ำกว่า คุณต้องลดความเร็วนาฬิการะบบด้วย machine.freq()

  • in_base คือพินแรกที่จะใช้สำหรับคำสั่ง in()

  • out_base คือพินแรกที่จะใช้สำหรับคำสั่ง out()

  • set_base คือพินแรกที่จะใช้สำหรับคำสั่ง set()

  • jmp_pin คือพินแรกที่จะใช้สำหรับคำสั่ง jmp(pin, ...)

  • sideset_base คือพินแรกที่จะใช้สำหรับ side-setting

  • in_shiftdir คือทิศทางที่ ISR จะเลื่อน ไม่ว่าจะเป็น PIO.SHIFT_LEFT หรือ PIO.SHIFT_RIGHT

  • out_shiftdir คือทิศทางที่ OSR จะเลื่อน ไม่ว่าจะเป็น PIO.SHIFT_LEFT หรือ PIO.SHIFT_RIGHT

  • push_thresh คือค่าขีดแบ่งในหน่วยบิตก่อนที่ auto-push หรือการ re-pushing แบบมีเงื่อนไขจะถูกเรียกใช้

  • pull_thresh คือค่าขีดแบ่งในหน่วยบิตก่อนที่ auto-pull หรือการ re-pulling แบบมีเงื่อนไขจะถูกเรียกใช้

หมายเหตุ: พินที่ใช้สำหรับ in_base ต้องได้รับการกำหนดค่าด้วยตนเองสำหรับอินพุต (หรืออื่นๆ) เพื่อให้ PIO สามารถมองเห็นสัญญาณที่ต้องการได้ (อาจเป็นพินอินพุต พินเอาต์พุต หรือเชื่อมต่อกับอุปกรณ์ต่อพ่วงอื่น) jmp_pin ก็สามารถกำหนดค่าด้วยตนเองได้เช่นกัน แต่โดยค่าเริ่มต้นจะเป็นพินอินพุต

active(value: bool | int | None = None, /) bool

รับหรือตั้งค่าว่าสเตทแมชชีนกำลังทำงานอยู่หรือไม่

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

รีสตาร์ทสเตทแมชชีนและกลับไปยังจุดเริ่มต้นของโปรแกรม

เมธอดนี้ล้างสถานะภายในของสเตทแมชชีนโดยใช้รีจิสเตอร์ SM_RESTART ของ RP2040 ซึ่งรวมถึง:

  • ตัวนับการเลื่อนอินพุตและเอาต์พุต

  • เนื้อหาของรีจิสเตอร์เลื่อนอินพุต

  • ตัวนับดีเลย์

  • สถานะการรอ-IRQ

  • คำสั่งที่หยุดชะงักขณะรันโดยใช้ StateMachine.exec()

exec(instr: str | int) None

รันคำสั่ง PIO เดียว

หาก instr เป็นสตริง จะใช้ asm_pio_encode เพื่อเข้ารหัสคำสั่งจากสตริงที่ให้ไว้

>>> sm.exec("set(0, 1)")

หาก instr เป็นจำนวนเต็ม จะถูกถือว่าเป็นคำสั่งโค้ดเครื่อง PIO ที่เข้ารหัสแล้วเพื่อรัน

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

ดึงคำออกจาก RX FIFO ของสเตทแมชชีน

หาก FIFO ว่าง จะบล็อกจนกว่าข้อมูลจะมาถึง (เช่น สเตทแมชชีนส่งคำ)

ค่าจะถูกเลื่อนขวาด้วย shift บิตก่อนส่งคืน กล่าวคือค่าที่ส่งคืนคือ word >> shift

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

ส่งคำไปยัง TX FIFO ของสเตทแมชชีน

value สามารถเป็นจำนวนเต็ม อาร์เรย์ประเภท B, H หรือ I หรือ bytearray

เมธอดนี้จะบล็อกจนกว่าคำทั้งหมดจะถูกเขียนลงใน FIFO หาก FIFO เต็มหรือกลายเป็นเต็ม เมธอดจะบล็อกจนกว่าสเตทแมชชีนจะดึงคำมากพอเพื่อให้การเขียนสมบูรณ์

แต่ละคำจะถูกเลื่อนซ้ายด้วย shift บิตก่อน กล่าวคือสเตทแมชชีนรับ word << shift

rx_fifo() int

คืนค่าจำนวนคำใน RX FIFO ของสเตทแมชชีน ค่า 0 หมายความว่า FIFO ว่าง

มีประโยชน์สำหรับการตรวจสอบว่ามีข้อมูลรอการอ่านหรือไม่ ก่อนเรียก StateMachine.get()

tx_fifo() int

คืนค่าจำนวนคำใน TX FIFO ของสเตทแมชชีน ค่า 0 หมายความว่า FIFO ว่าง

มีประโยชน์สำหรับการตรวจสอบว่ามีพื้นที่สำหรับส่งคำอื่นโดยใช้ StateMachine.put() หรือไม่

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

คืนค่าอ็อบเจกต์ IRQ สำหรับ StateMachine ที่ให้ไว้

สามารถกำหนดค่าได้ตามต้องการ

โปรโตคอลบัฟเฟอร์

The StateMachine class supports the buffer protocol, allowing direct access to the transmit and receive FIFOs for each state machine. This is primarily in order to allow StateMachine objects to be passed directly as the read or write parameters when configuring a rp2.DMA() channel.