发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印

关于使用WS2811点灯我有话说——致hejun96

[复制链接]
1887|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tobot|  楼主 | 2022-2-26 00:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# @hejun96 @21小跑堂
今天某位网友突然提到说需要使用ws2811点亮一条灯带,想到之前有专门研究过此方面内容,不免拿出卖弄一下。
首先我们来研究一下,为什么只需要一个GPIO口就能点亮一串WS2812灯珠,而且每个灯珠都可以使用256*256*256色?
datasheet来看(这里再吐槽一把,也许是原理太简单,不同网站下的ws2811的参数居然不同),就是按比特位给每个灯发送数据,每个灯都取走第一个颜色(24位),取完自己的颜色后,将剩余颜色向后传递,依次递推。因为用一段高低电平的持续实际分别01,表示所以群里说的SPI+DMANOP速率高,是不太可能的,点灯的速率只和需要点灯的数量有关(反正每个灯1.25us左右),和采用点灯的方案关系不大。如下是截取不同版本datasheet里的说明:
看,虽然每个文档都写TH+TL值相同(1.25us),但有些文档里面0的持续时间(0.35us+0.8us)是可以比1持续时间(0.7us+0.6us)短的。虽然可以实现在150ns的误差范围内使其满足1.25us的需求,但严格按照数据手册编程的话,还是有所差异的。
接下来,我们看看怎么实现点灯,最直接的想法肯定是直接控制IO口,并精确调整延时,这对板子性能要求太高,一般的板卡都不太可能做到;退而求其次,用NOP来做延时,这个对板子的性能要求没有那么高,大多数开发板可以做到。
最近在读RT-thread中的WS2811源码,感觉非常巧妙,具体是怎么实现的呢?答案是利用SPI接口。
传统SPI采用4根信号线,分别为CLKCSSDISDOSPI是串行通讯协议,也就是说数据是一位一位的传输的。在CS片选之后,由主设备的SCLK提供时钟脉冲,SDISDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,连续8次时钟信号的改变(上沿和下沿为一次),才能完成一个字节数据的传输。输入也使用同样原理。
如上所述,当没有时钟变化时,SDO口的电平是相对保持的(无所谓正反相位),因此可以使用SPI总线发送特定数据分别表示01
RT-Thread中选取
可以看到相关代码如下:
这是在初始化SPI,使其时钟为13.333MHz,每个时钟周期可以传送1bit数据,耗时75ns
接下来,采用SPI传输两个字节来实现WS2812上的1个位数据。
可以看到,bit0使用1111 1000 0000 0000bit1使用1111 1111 1110 0000,分别对应高低电平时长。
T0H=0.375us
T0L=0.825us
T1H=0.825us
T1L=0.375us
基本上在datasheet的标注范围内。
函数ws2812_write_rgb_to_node
实现单个灯珠颜色的写入。
函数ws2812_write_rgb_to_all
次第写入灯链中每个节点的数据

接下来实现通过SPI发送数据

对于调整灯链颜色的需求,因为每次变换颜色,时间间隔至少50us,对于开发板来说,这个实现起来就比较简单,在这里也不用特别提及了。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2022-03-09
理由:恭喜通过原创文章审核!请多多加油哦!

相关帖子

沙发
yueguang3048| | 2022-2-28 09:56 | 只看该作者
感谢分享  这玩意儿    数量多的话,用51不好玩

使用特权

评论回复
板凳
hejun96| | 2022-2-28 10:37 | 只看该作者
本帖最后由 hejun96 于 2022-2-28 10:39 编辑

看到了,ws281x灯带用spi发送的原理

使用特权

评论回复
地板
linguanghua| | 2022-3-11 15:04 | 只看该作者
使用SPI驱动WS2812,,8位模式即可,无需16位。前提是单片机使用外部晶振。
像STM32之类的MCU,使用SPI-DMA是最方便的,如果使用TIM-PWM-DMA,不好使,用逻辑分析仪观测,TIM的通道电平在开启和关闭时,不稳定,容易误码。

使用特权

评论回复
评论
dirtwillfly 2022-3-15 18:09 回复TA
感谢分享 
5
tobot|  楼主 | 2022-3-11 16:27 | 只看该作者
linguanghua 发表于 2022-3-11 15:04
使用SPI驱动WS2812,,8位模式即可,无需16位。前提是单片机使用外部晶振。
像STM32之类的MCU,使用SPI-DMA是 ...

是的,这是例程分析

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

2671

帖子

7

粉丝