STC-SPI 驱动 WS2812, 【STC-USB转双串口工具作为开发板应用】之SPI驱动WS2812
STC-SPI驱动 WS2812, 【STC-USB转双串口工具作为开发板应用】之SPI驱动WS2812attach://750.mp4
一、前言
看到STC最新推出了一个USB转双串口的神器,不仅可以做最小系统板,还能做下载器,甚至原理图和程序均开源了,
在官网https://stcai.com/hxgnsyb就可以下载,具体如下
http://www.stcaimcu.com/data/attachment/forum/202212/07/224317jwhzwb7qjw8qs7gq.png
当然我也是迫不及待的入手了一个,为了图方便,我直接某宝上特价十块钱左右的价格就卖到了!!!回来实测了下可以轻轻松松实现4M以上的串口通信!当然作为一个资深的点灯工程师,新拿到个板子我们还是以点灯为主,具体的效果见最前面的视频,这里先把源代码上传,见附件,感兴趣的盆友们可以下载下来自己试试。
二、实现原理
这里简要分析一下实现过程,已知WS2812的驱动时序如下:
可以看到上图中,驱动一个灯需要24个0码或者1码,一个0码或者1码都包含一段高电平和低电平,且1个码的高电平和低电平时间相加为1.1us±300ns,当然这种时序我们完全可以用IO口模拟实现,不过这里我们可以尝试用SPI驱动。
标准的SPI协议如上图所示,有SCLK,SS,MOSI和MISO四个引脚,首先排除SS这个片选引脚,其次SCLK只能发时钟信号,离我们的一个高点平,一个低电平有点区别,暂时放弃,那MOSI刚好作为一个输出引脚,且输出的脉冲宽度可控,我们就可以选择他作为输出来实现我们的时序模拟。
配合我们的示波器,我们在44.2368的IRC时钟之下,发出的0码和1码分别如下图所示:
可以看到DATA引脚上(这里是P13引脚)输出的0码的总时间约为1.22us,正脉宽约为280ns,负脉宽约为935ns;0码的总时间约为1.19us,正脉宽约为749ns,负脉宽约为442ns。完全符合我们的驱动时序,所以SPI驱动可行。详细代码可以直接下载附件查看,有用或者好用的话希望小伙伴们可以在帖子下面留言点赞,这里就不详细展开了,要是小伙伴们实在需要的话我单独开一贴讲讲代码~
帮评估下这位新人,提出的方案有无实际价值
DMA_SPI驱动WS2812B全彩LED的简单应用 - DMA: 支持4组串口,3组SPI,I2C,TFT-i8080/M6800,ADC - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
超详细的教程!!!!!!!! 绝对本坛 点灯大师 爱的奉献 下载程序例程完美运行。但遇到个问题当我把灯数量WS_NUM 设置100或更多 在主函数调用
WS2812_ColorSetAll(255,0,0);
WS2812_ColorFresh();
delay_ms(250);
灯显示混乱,这里有办法解决吗 你是哪个小幽灵 发表于 2022-12-28 15:20
下载程序例程完美运行。但遇到个问题当我把灯数量WS_NUM 设置100或更多 在主函数调用
WS2812_ColorSetAll(2 ...
这个灯显示混乱是个什么现象呢?是所有的灯颜色都不对了还是最末尾的几个不对了呢? 电子DIY小家 发表于 2022-12-28 16:45
这个灯显示混乱是个什么现象呢?是所有的灯颜色都不对了还是最末尾的几个不对了呢? ...
是末尾不对 前面显示正常正确 后面显示另一种颜色 你是哪个小幽灵 发表于 2022-12-29 08:56
是末尾不对 前面显示正常正确 后面显示另一种颜色
//========================================================================
// 函数: void WS2812_ColorFresh(void)
// 描述: WS2812的颜色批量输出
// 参数:
// 返回: none.
// 版本: VER1.0
// 日期: 2022-15-5
// 备注: 调用完记得调用
//========================================================================
void WS2812_ColorFresh(void)
{
u8 i=0;
for(i=0;i<WS_NUM*3;i++)
WS2812_WriteByte(Color_Buff);
}
这个刷新的代码里,WS2812_WriteByte这个函数目前最大值只有255,你把i的类型从u8改成u16试试,u8的话只能控制255/3个灯,u16可以控制65535/3个灯,另外WS2812_ColorSetAll函数里的变量类型也修改下。
电子DIY小家 发表于 2022-12-29 10:34
这个刷新的代码里,WS2812_WriteByte这个函数目前最大值只有255,你把i的类型从u8改成u16试试,u8的话只 ...
改了之后正常了 确实是定义的问题 感谢楼主 你是哪个小幽灵 发表于 2022-12-29 11:26
改了之后正常了 确实是定义的问题 感谢楼主
客气了,祝你用的愉快:lol STC-SPI 最大的设计失败,就是MOSI 空闲 不能配置成低电平