鸣谢博主大大:【STM32】WS2812介绍、使用SPI+DMA发送数据 - 夜桜が舞う - 博客园

一,硬件分析

WS2812,这LED内部已经整合了信号处理的芯片,以4pin的WS2812为例,它的引脚分别是:

VDD:电源,3.5V~5.3V

VSS:地

DIN:数据输入

DOUT:数据输出

二,WS2812通信流程

数据包结构分析

可以简单理解成一个大蛋糕,一个由所有RGB灯的数据所组成的大蛋糕

D1(第一颗LED)收到3组数据(大蛋糕,3×24bit),自己截取一组数据(吃一口,24bit),剩下两组数据(2×24bit),交给D2

D2也截取一组,剩下最后一组,交给D3

D3也一定要截取,然后就没有数据能交给D4了(假设如图那样,只发了3组数据)

逻辑电平分析

如上图,如果说通过发送三个字节(24bit)来控制这个灯,是不行的。(这里还没考虑WS2812需要很高波特率这个问题)

WS2812规定:正确的信号需要高低电平的组合。即一位的内容,就需要包含高低电平

可以总结,每个灯珠有三个颜色通道(GRB);每个颜色通道有以8个bit来进行控制;每个bit要以高低电平的组合。要能控制WS2812,必须要发24个字节,这还只是一个LED要的数据而已

三,疑难杂症

问题一:每个bit要以高低电平的组合才能满足WS2812对“1 0" 的规定,那该如何处理呢?

(“代表逻辑的 0/1”和“SPI发送的数据位”容易混在一起。。。)

————————————————————————————————————————

首先要清楚:

针对WS2812,区分的关键在于高电平占的时间长还是短

  • 逻辑 1:高电平持续约 0.8µs,低电平持续约 0.45µs。(高电平占比:64%)
  • 逻辑 0:高电平持续约 0.4µs,低电平持续约 0.85µs。(高电平占比:32%)

 

因此,我们可以将 SPI 速度设置为 4 倍频,即

  • 逻辑 1 → SPI 发 1100:4 个时间段里,前 2 个高,后 2 个低(占空比 50%)。
  • 逻辑 0 → SPI 发 1000:4 个时间段里,前 1 个高,后 3 个低(占空比 25%)。

问题二:为啥给到把 1000 或者 1100 塞到SPI能够自动输出 高低低低 或者 高高低低 电平?

被设计出来就是干这个活的。它的内部结构决定了给它数字,它吐出电压。就像按开关,灯就会亮一样,是物理连接决定的,不需要“理解”

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐