← index #18295Issue #18603
Related · high · value 2.421
QUERY · ISSUE

neopixel protocol timings depart from set values on Pi Pico 2 W causing failures

openby kevinjwaltersopened 2025-10-18updated 2025-10-27
bug

Port, board and/or hardware

Pi Pico 2 W (RP2350 based)

MicroPython version

MicroPython v1.26.1 on 2025-09-11; Raspberry Pi Pico 2 W with RP2350

Reproduction

I wrote neopixel-timing.py to test this. I've only run this so far on Pi Pico 2 W.

Expected behaviour

I'd hope all of the invocations of write() for neopixel library would work okay.

Observed behaviour

Visual results

  • Test 1 default timing at clock 125000000 MHz: fail
  • Test 2 custom timing ([350, 900, 800, 450]) at clock 125000000 MHz: good
  • Test 3 default timing at clock 150000000 MHz: fail
  • Test 4 custom timing ([350, 900, 800, 450]) at clock 150000000 MHz: good
  • Test 5 default timing at clock 160000000 MHz: good
  • Test 6 custom timing ([350, 900, 800, 450]) at clock 160000000 MHz: good

Additional Information

I'm running with an RGB LED matrix powered at 3.3V and GP2 signal will be at 3.3V too. This demonstrably works well from a micro:bit.

I have some capture data from my humble Ikalogic SQ25 (only at 25Msps). I'll add them later today.

@gurgleapps @mirkin may be interested in this.

Code of Conduct

Yes, I agree

CANDIDATE · ISSUE

Pico 2W fails to write to NeoPixels from second core

openby redhead-popened 2025-12-23updated 2026-03-09
bugport-rp2

Port, board and/or hardware

Pico 2 W and 4 LED NeoPixel string

MicroPython version

MicroPython v1.27.0 on 2025-12-09; Raspberry Pi Pico 2 W with RP2350

Writing from core0 on GPIO 22 to a 4 LED string works fine using neopixel library. Writing to same GPIO from core1 produces a random 'bright' display.

Code below is based on example in MicroPython NeoPixel documentation.

Reproduction

import neopixel
from machine import Pin
import _thread


def main1():
    n = neopixel.NeoPixel(Pin(22), 4)

    # Draw a red gradient.
    for i in range(4):
        n[i] = (i, 0, 0)

    # Update the strip.
    n.write()




_thread.start_new_thread(main1,())
  

Expected behaviour

Expected to see a red gradient as per comments in code.

Observed behaviour

Random display (all four LEDS lit). Replacing _thread.start_thread(main1,()) by main1() gives correct output.

Additional Information

No, I've provided everything above.

Code of Conduct

Yes, I agree

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