这次拿来开刀的是WS2812,具体代码可见 => https://github.com/raspberrypi/pico-examples/blob/master/pio/ws2812/ws2812.pio
.program ws2812
.side_set 1
.define public T1 2
.define public T2 5
.define public T3 3
.lang_opt python sideset_init = pico.PIO.OUT_HIGH
.lang_opt python out_init = pico.PIO.OUT_HIGH
.lang_opt python out_shiftdir = 1
.wrap_target
bitloop:
out x, 1 side 0 [T3 - 1] ; 先从移位寄存器取出1个bit到x,并且数据引脚为0,保持T3个周期.
jmp !x do_zero side 1 [T1 - 1] ; 如果取出的这个bit是0,则跳转到设置0,跳转前保持1状态T1个周期.
do_one:
jmp bitloop side 1 [T2 - 1] ; 如果上面没跳转就会到这里设置1,保持高T2个周期.
do_zero:
nop side 0 [T2 - 1] ; 如果跳转了,就保持T2个周期的低.
.wrap
其中wrap_target到wrap包裹的部分,是整个函数的实体,假设PUSH进去的是0xAA(10101010b),其实际时序就会如下,记住命令本身也占一个周期:
[T3T1T2]…. => [0001111111][0001100000]……..