Skip to content

Fix: Update SPI PIO initialization to use 64-bit masks for RP2350B - #727

Merged
peterharperuk merged 2 commits into
raspberrypi:developfrom
viralpatel9:develop
Jun 5, 2026
Merged

peterharperuk merged 2 commits into
raspberrypi:developfrom
viralpatel9:develop

Conversation

@viralpatel9

Copy link
Copy Markdown
Contributor

This PR is a fix for Issue #725 to allow using the GPIOs>32 (typically for RP2350B variant). This pull request updates the SPI PIO initialisation functions to improve support for higher-numbered GPIO pins and 64-bit pin masks.

The main changes involve switching to 64-bit versions of pin mask functions and correcting the logic for bypassing input synchronisation on the MISO pin.

@peterharperuk peterharperuk added this to the 2.3.0 milestone Dec 17, 2025
@peterharperuk peterharperuk modified the milestones: 2.3.0, 2.2.1 Jun 5, 2026
@peterharperuk
peterharperuk merged commit 894db5f into raspberrypi:develop Jun 5, 2026
3 checks passed
Comment thread pio/spi/spi.pio
gpio_set_outover(pin_sck, cpol ? GPIO_OVERRIDE_INVERT : GPIO_OVERRIDE_NORMAL);
// SPI is synchronous, so bypass input synchroniser to reduce input delay.
hw_set_bits(&pio->input_sync_bypass, 1u << pin_miso);
hw_set_bits(&pio->input_sync_bypass, (pin_miso >= 32) ? (1u << (pin_miso - 16)) : (1u << pin_miso));

@lurch lurch Jun 6, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely sure that this is correct. You'll need to do the (pin_miso - 16) thing if the PIO has been remapped to the "upper pin range", which will indeed happen if (pin_miso >= 32); but there's a slight edge-case here where pin_miso might be less than 32, but one of the other pins (e.g. pin_sck) might be above 32? (which would also cause the PIO to use the "upper pin range")
So I think the correct fix here is actually:

    hw_set_bits(&pio->input_sync_bypass, (1u << (pin_miso - pio_get_gpio_base(pio))));

?
(but I've also suggested raspberrypi/pico-sdk#2986 to make this easier in future)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @lurch that seems to be correct rather than using magic number.

Comment thread pio/spi/spi.pio
pio_gpio_init(pio, pin_sck + 1);
gpio_set_outover(pin_sck, cpol ? GPIO_OVERRIDE_INVERT : GPIO_OVERRIDE_NORMAL);
hw_set_bits(&pio->input_sync_bypass, 1u << pin_miso);
hw_set_bits(&pio->input_sync_bypass, (pin_miso >= 32) ? (1u << (pin_miso - 16)) : (1u << pin_miso));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...and obviously the same applies here too 🙂

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants