class StateMachine – toegang tot de programmeerbare I/O-interface van de RP2040

De klasse StateMachine geeft toegang tot de PIO (programmeerbare I/O)-interface van de RP2040.

Voor het assembleren van PIO-programma’s, zie rp2.asm_pio().

Constructors

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

Haal de toestandsmachine met nummer id op. De RP2040 heeft twee identieke PIO-instanties, elk met 4 toestandsmachines: er zijn dus in totaal 8 toestandsmachines, genummerd 0 tot en met 7.

Initialiseer deze optioneel met het opgegeven programma program: zie 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

Configureer de toestandsmachine-instantie om het opgegeven program uit te voeren.

Het programma wordt toegevoegd aan het instructiegeheugen van deze PIO-instantie. Als het instructiegeheugen dit programma al bevat, wordt de offset ervan hergebruikt om instructiegeheugen te besparen.

  • freq is de frequentie in Hz waarop de toestandsmachine moet draaien. Standaard de systeemklokfrequentie.

    De klokdeler wordt berekend als system clock frequency / freq, dus er kunnen kleine afrondingsfouten optreden.

    De minimaal mogelijke klokdeler is een 65536e van de systeemklok: bij de standaard systeemklokfrequentie van 125MHz is de minimumwaarde van freq dus 1908. Om toestandsmachines op lagere frequenties te laten draaien, moet je de systeemkloksnelheid verlagen met machine.freq().

  • in_base is de eerste pin die wordt gebruikt voor in()-instructies.

  • out_base is de eerste pin die wordt gebruikt voor out()-instructies.

  • set_base is de eerste pin die wordt gebruikt voor set()-instructies.

  • jmp_pin is de eerste pin die wordt gebruikt voor jmp(pin, ...)-instructies.

  • sideset_base is de eerste pin die wordt gebruikt voor side-setting.

  • in_shiftdir is de richting waarin de ISR zal verschuiven, ofwel PIO.SHIFT_LEFT ofwel PIO.SHIFT_RIGHT.

  • out_shiftdir is de richting waarin de OSR zal verschuiven, ofwel PIO.SHIFT_LEFT ofwel PIO.SHIFT_RIGHT.

  • push_thresh is de drempelwaarde in bits voordat auto-push of voorwaardelijk opnieuw pushen wordt geactiveerd.

  • pull_thresh is de drempelwaarde in bits voordat auto-pull of voorwaardelijk opnieuw pullen wordt geactiveerd.

Opmerking: pinnen die voor in_base worden gebruikt moeten handmatig worden geconfigureerd als ingang (of anderszins) zodat de PIO het gewenste signaal kan zien (het kunnen ingangspinnen, uitgangspinnen of pinnen verbonden met een ander randapparaat zijn). De jmp_pin kan ook handmatig worden geconfigureerd, maar zal standaard een ingangspin zijn.

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

Haalt op of stelt in of de toestandsmachine momenteel draait.

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

Herstart de toestandsmachine en springt naar het begin van het programma.

Deze methode wist de interne toestand van de toestandsmachine met behulp van het SM_RESTART-register van de RP2040. Dit omvat:

  • in- en uitgangsverschuivingstellers

  • de inhoud van het ingangsverschuivingsregister

  • de vertragingsteller

  • de wachten-op-IRQ-toestand

  • een vastgelopen instructie uitgevoerd met StateMachine.exec()

exec(instr: str | int) None

Voer een enkele PIO-instructie uit.

Als instr een string is, wordt asm_pio_encode gebruikt om de instructie vanuit de opgegeven string te coderen.

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

Als instr een geheel getal is, wordt het behandeld als een reeds gecodeerde PIO-machinecode-instructie die moet worden uitgevoerd.

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

Haal een woord uit de RX-FIFO van de toestandsmachine.

Als de FIFO leeg is, blokkeert het totdat er gegevens arriveren (d.w.z. de toestandsmachine een woord pusht).

De waarde wordt vóór retournering met shift bits naar rechts verschoven, d.w.z. de retourwaarde is word >> shift.

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

Push woorden naar de TX-FIFO van de toestandsmachine.

value kan een geheel getal zijn, een array van het type B, H of I, of een bytearray.

Deze methode blokkeert totdat alle woorden naar de FIFO zijn geschreven. Als de FIFO vol is of wordt, blokkeert de methode totdat de toestandsmachine voldoende woorden pullt om de schrijfbewerking te voltooien.

Elk woord wordt eerst met shift bits naar links verschoven, d.w.z. de toestandsmachine ontvangt word << shift.

rx_fifo() int

Retourneert het aantal woorden in de RX-FIFO van de toestandsmachine. Een waarde van 0 geeft aan dat de FIFO leeg is.

Handig om te controleren of er gegevens wachten om gelezen te worden, voordat StateMachine.get() wordt aangeroepen.

tx_fifo() int

Retourneert het aantal woorden in de TX-FIFO van de toestandsmachine. Een waarde van 0 geeft aan dat de FIFO leeg is.

Handig om te controleren of er ruimte is om nog een woord te pushen met StateMachine.put().

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

Retourneert het IRQ-object voor de opgegeven StateMachine.

Configureer het optioneel.

Buffer protocol

De klasse StateMachine ondersteunt het buffer protocol, wat directe toegang mogelijk maakt tot de zend- en ontvangst-FIFO’s voor elke toestandsmachine. Dit is voornamelijk bedoeld om StateMachine-objecten rechtstreeks als de read- of write-parameters te kunnen doorgeven bij het configureren van een rp2.DMA()-kanaal.