梁工 发表于 2024-9-16 15:55:22

WS2812彩灯@32G12K128,最多同时驱动682个,DMA支持USART1-SPI或USART2-SPI驱动

WS2812三基色彩灯@32G12K128,USB
===最多同时驱动682个三基色彩灯,更多的灯可以分多次传输
===USART1/串口1的USART1-SPI, 无需反相,用DMA支持,不占CPU时间
      可以驱动第1路独立的 WS2812灯带网络
===USART2/串口2的USART2-SPI, 无需反相,用DMA支持,不占CPU时间
      可以驱动第2路独立的 WS2812灯带网络
===还有标配的独立 SPI
      可以驱动第3路独立的 WS2812灯带网络

STC32G12K128的串口1或串口2工作于SPI-DMA模式,输出控制WS2812三基色彩灯 !
使用 SPI-MOSI 输出直接驱动WS2812 三基色彩灯,
DMA传输,8K SRAM 轻松驱动最多682个灯并且不占用CPU时间 !
本例使用P1.3/MOSI输出信号(用户可以切换到别的脚)直接驱动WS2812。
只用到MOSI驱动WS2812,但由于SPI的3个信号是捆绑在一起的
===MISO不能做它用。
===SCLK如要做其他用途,可设置为高阻输入,作为输入使用
本例P1.4-MISO被SPI占用,不能做他用。
这 SPI 留了这么个绝活 支持 WS2812B !!!

本例驱动24个灯,接成环状。
SPI发送288字节,DMA启动后自动发送完所有的数据(本例发送时间810us),不占CPU时间。

每个灯3个字节,分别对应绿、红、蓝则,MSB先发.
800KHz码率,
数据0(1/4占空比): H=0.3125usL=0.9375us,
数据1(3/4占空比): H=0.9375usL=0.3125us,
RESET>=50us.
高电平时间要精确控制在要求的范围内,
低电平时间不需要精确控制, 大于要求的最小值并小于RES的50us即可.

WS2812S的标准时序如下:
TH+TL = 1.25us±150ns, RES>50us
T0H = 0.25us±150ns = 0.10us - 0.40us
T0L = 1.00us±150ns = 0.85us - 1.15us
T1H = 1.00us±150ns = 0.85us - 1.15us
T1L = 0.25us±150ns = 0.10us - 0.40us
两个位数据之间的间隔要小于RES的50us.

SPI方案:

本例使用USART1-SPI模式的P1.3-MOSI输出驱动信号直接驱动WS2812。
由于使用SPI主机模式,则P1.4、P1.5被SPI占用,不能做他用。

用SPI传输, 速度3.0~3.5MHz,以3.2MHz为最佳, MSB先发, 每个字节高4位和低4位分别对应一个位数据, 1000为数据0, 1110为数据1.
SPI数据位       D7 D6 D5 D4    D3 D2 D1 D0
SPI数据          1   0   0    0      1   1    1   0
                   WS2812数据0    WS2812数据1
SPI数据高半字节对应的WS2812数据0-->0x80, 数据1-->0xe0,
SPI数据低半字节对应的WS2812数据0-->0x08, 数据1-->0x0e,
主频25.6MHz, SPI分频8 = 3.2MHz. 最佳.

电路预览(附件带PDF电路):











科学妞妞 发表于 2024-9-17 08:53:02

完整的例子,好,有空,练练

zjiot 发表于 2024-10-17 14:23:13

dma果然牛逼啦

lqw517 发表于 2024-10-17 14:32:11

dma好东西

lzts 发表于 2024-11-27 10:01:12

又学一招,以前用软件模拟驱动,占用太多MCU时间了

hhhhhht 发表于 2025-2-3 00:47:51

厉害了
页: [1]
查看完整版本: WS2812彩灯@32G12K128,最多同时驱动682个,DMA支持USART1-SPI或USART2-SPI驱动