由于Linux非实时性系统的特性,对于时序要求比较苛刻的WS2812来说,无法通过自行控制gpio的高低电平来模拟微秒级的逻辑信号。为了模拟出WS2812所需要的波形,在这里使用SPI形式来控制WS2812。WS2812的文档,很多blog已经做了描述,此处不再重复,只讲如何实现。本文所使用的为Orange Pi Zero ,系统使用的是Armbian 4.19.38-sunxi
目前在Pypi上,对于树莓派通过spi控制WS2812的类库还是有的,但是却没有香橙派,所以此处我们自行实现。
通过阅读WS2812可以得知,他的数据传输速度为800kbps,逻辑1和逻辑0的时序见下图。
为了用spi模拟出对应的波形,我们输入一个bit分成4份,根据时序波形,并利用误差,可以将一个逻辑0的高低电平时间比例为2:2,逻辑1的高低电平时间为1:3。所以我们使用的spi频率为800Khz*4=3.2Mhz。
如果我们想给灯传输一个二进制的“1”,意味着我们需要在spi中传输二进制的“1100”,即16进制的C;灯的“0”意味着spi的“1000”,即16进制的8,这样就可以满足ws2812对1码的波形要求。
根据WS2812的每位灯的数据格式,见下图。