← index #16579Issue #9325
Off-topic · high · value 2.316
QUERY · ISSUE

rp2: asm_pio_encode() sideset/delay faulty logic

openby melberiopened 2025-01-13updated 2026-03-19
bugport-rp2

Port, board and/or hardware

RP2040

MicroPython version

MicroPython v1.24.1 on 2024-11-29; Raspberry Pi Pico with RP2040

Reproduction

In a PIO instruction, 5 bits are reserved for sideset/delay. Using one or more sideset pins reduces the amount of bits left for delay. However, the asm_pio_encode() complains about delay too large with the following invocation:

rp2.asm_pio_encode('mov(x,y).side(1) [7]', 2, sideset_opt=True)

The second argument to the function is sideset count and is inclusive of the sideset enable bit which is required when sideset is optional. In this example two bits are reserved for sideset purposes and three are left for delay allowing a maximum of 7.

Expected behaviour

The function is expected to return 48930 equivalent to 0b1011111100100010.

Note the sideset/delay in bits 8-12 (counting up from 0), 11111, with the two most significant bits being the sideset enable and the actual sideset bit and the rest of the bits signifying a delay value of 7.

Observed behaviour

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "rp2.py", line 298, in asm_pio_encode
File "<string>", line 1, in <module>
File "rp2.py", line 79, in getitem
File "rp2.py", line 84, in delay
PIOASMError: delay too large

Additional Information

I came across this bug when figuring out why the asm_pio_encode() function would not seem to work correctly with sideset count equal to 1 while sideset_opt=True.

The documentation did not mention about sideset count being inclusive of sideset enable bit. That information was found in the codebase as a comment. It follows from the SIDESET_COUNT count in SM#_PINCTRL register of RP2040 where the sideset enable bit is included in the count.

Code of Conduct

Yes, I agree

CANDIDATE · ISSUE

rp2: rp2.asm_pio_encode incorrectly accepts 'pins' as src for 'wait'

openby ccanepaopened 2022-09-15updated 2026-03-19
bugport-rp2
  • https://docs.micropython.org/en/latest/library/rp2.html#module-rp2 specifies the pio asm syntax for 'wait' as
    wait(polarity, src, index) where 'src' one of (gpio, pin, irq)
  • The rp2040-datasheet.pdf similary uses (GPIO, PIN, IRQ)

The bug is that rp2.asm_pio_encode silently accepts the invalid src value 'pins'. It should raise an exception.

Incidentaly it encodes "wait(1, pins, 0)" the same as "wait(1, gpio, 0)"

demo code

import rp2
try:
    rp2.asm_pio_encode("wait(1, pins, 0)")
    exception_raised = False
except Exception:
    exception_raised = True

assert exception_raised

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied