请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 5873|回复: 31

STC-SPI 驱动 WS2812, 【STC-USB转双串口工具作为开发板应用】之SPI驱动WS2812

[复制链接]
  • TA的每日心情
    开心
    2024-6-24 08:03
  • 签到天数: 117 天

    [LV.6]常住居民II

    43

    主题

    1052

    回帖

    7223

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    7223
    QQ
    发表于 2022-12-10 16:54:04 | 显示全部楼层 |阅读模式
    STC-SPI  驱动 WS2812, 【STC-USB转双串口工具作为开发板应用】之SPI驱动WS2812

    一、前言
      看到STC最新推出了一个USB转双串口的神器,不仅可以做最小系统板,还能做下载器,甚至原理图和程序均开源了,
    在官网https://stcai.com/hxgnsyb就可以下载,具体如下

    QQ截图20221210163230.png

      当然我也是迫不及待的入手了一个,为了图方便,我直接某宝上特价十块钱左右的价格就卖到了!!!回来实测了下可以轻轻松松实现4M以上的串口通信!当然作为一个资深的点灯工程师,新拿到个板子我们还是以点灯为主,具体的效果见最前面的视频,这里先把源代码上传,见附件,感兴趣的盆友们可以下载下来自己试试。



    二、实现原理

      这里简要分析一下实现过程,已知WS2812的驱动时序如下:

    QQ截图20221210163949.png


      可以看到上图中,驱动一个灯需要24个0码或者1码,一个0码或者1码都包含一段高电平和低电平,且1个码的高电平和低电平时间相加为1.1us±300ns,当然这种时序我们完全可以用IO口模拟实现,不过这里我们可以尝试用SPI驱动。

    QQ截图20221210164311.png


      标准的SPI协议如上图所示,有SCLK,SS,MOSI和MISO四个引脚,首先排除SS这个片选引脚,其次SCLK只能发时钟信号,离我们的一个高点平,一个低电平有点区别,暂时放弃,那MOSI刚好作为一个输出引脚,且输出的脉冲宽度可控,我们就可以选择他作为输出来实现我们的时序模拟。

      配合我们的示波器,我们在44.2368的IRC时钟之下,发出的0码和1码分别如下图所示:

    IMG_20221206_114514.jpg

    IMG_20221206_114535.jpg

      可以看到DATA引脚上(这里是P13引脚)输出的0码的总时间约为1.22us,正脉宽约为280ns,负脉宽约为935ns;0码的总时间约为1.19us,正脉宽约为749ns,负脉宽约为442ns。完全符合我们的驱动时序,所以SPI驱动可行。详细代码可以直接下载附件查看,有用或者好用的话希望小伙伴们可以在帖子下面留言点赞,这里就不详细展开了,要是小伙伴们实在需要的话我单独开一贴讲讲代码~


    USB转双串口之SPI驱动WS2812.rar

    266.34 KB, 下载次数: 433

    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

    该用户从未签到

    587

    主题

    1万

    回帖

    1万

    积分

    管理员

    积分
    14977
    发表于 2024-1-1 17:04:09 | 显示全部楼层

    点评

    STC32G的SPI+DMA驱动ws2812的应该好早就贴出来了的,本来就不需要反相器  详情 回复 发表于 2024-1-1 23:09
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    8

    主题

    37

    回帖

    314

    积分

    中级会员

    积分
    314
    发表于 2022-12-11 09:22:53 | 显示全部楼层
    超详细的教程!!!!!!!!

    该用户从未签到

    587

    主题

    1万

    回帖

    1万

    积分

    管理员

    积分
    14977
    发表于 2022-12-11 12:45:52 | 显示全部楼层
    绝对本坛 点灯大师 爱的奉献

    该用户从未签到

    2

    主题

    9

    回帖

    141

    积分

    注册会员

    积分
    141
    发表于 2022-12-28 15:20:43 | 显示全部楼层
    下载程序例程完美运行。但遇到个问题当我把灯数量WS_NUM 设置100或更多 在主函数调用
    WS2812_ColorSetAll(255,0,0);
    WS2812_ColorFresh();
    delay_ms(250);
    灯显示混乱,这里有办法解决吗
  • TA的每日心情
    开心
    2024-6-24 08:03
  • 签到天数: 117 天

    [LV.6]常住居民II

    43

    主题

    1052

    回帖

    7223

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    7223
    QQ
     楼主| 发表于 2022-12-28 16:45:11 | 显示全部楼层
    你是哪个小幽灵 发表于 2022-12-28 15:20
    下载程序例程完美运行。但遇到个问题当我把灯数量WS_NUM 设置100或更多 在主函数调用
    WS2812_ColorSetAll(2 ...

    这个灯显示混乱是个什么现象呢?是所有的灯颜色都不对了还是最末尾的几个不对了呢?

    该用户从未签到

    2

    主题

    9

    回帖

    141

    积分

    注册会员

    积分
    141
    发表于 2022-12-29 08:56:42 | 显示全部楼层
    电子DIY小家 发表于 2022-12-28 16:45
    这个灯显示混乱是个什么现象呢?是所有的灯颜色都不对了还是最末尾的几个不对了呢? ...

    是末尾不对 前面显示正常正确 后面显示另一种颜色
  • TA的每日心情
    开心
    2024-6-24 08:03
  • 签到天数: 117 天

    [LV.6]常住居民II

    43

    主题

    1052

    回帖

    7223

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    7223
    QQ
     楼主| 发表于 2022-12-29 10:34:57 | 显示全部楼层
    你是哪个小幽灵 发表于 2022-12-29 08:56
    是末尾不对 前面显示正常正确 后面显示另一种颜色
    1. //========================================================================
    2. // 函数: void WS2812_ColorFresh(void)
    3. // 描述: WS2812的颜色批量输出
    4. // 参数:
    5. // 返回: none.
    6. // 版本: VER1.0
    7. // 日期: 2022-15-5
    8. // 备注: 调用完记得调用
    9. //========================================================================
    10. void WS2812_ColorFresh(void)
    11. {
    12.     u8 i=0;
    13.     for(i=0;i<WS_NUM*3;i++)
    14.         WS2812_WriteByte(Color_Buff[i]);
    15. }
    复制代码
    这个刷新的代码里,WS2812_WriteByte这个函数目前最大值只有255,你把i的类型从u8改成u16试试,u8的话只能控制255/3个灯,u16可以控制65535/3个灯,另外WS2812_ColorSetAll函数里的变量类型也修改下。
    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    回帖

    141

    积分

    注册会员

    积分
    141
    发表于 2022-12-29 11:26:10 | 显示全部楼层
    电子DIY小家 发表于 2022-12-29 10:34
    这个刷新的代码里,WS2812_WriteByte这个函数目前最大值只有255,你把i的类型从u8改成u16试试,u8的话只 ...

    改了之后正常了 确实是定义的问题 感谢楼主
  • TA的每日心情
    开心
    2024-6-24 08:03
  • 签到天数: 117 天

    [LV.6]常住居民II

    43

    主题

    1052

    回帖

    7223

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    7223
    QQ
     楼主| 发表于 2022-12-29 16:28:00 | 显示全部楼层
    你是哪个小幽灵 发表于 2022-12-29 11:26
    改了之后正常了 确实是定义的问题 感谢楼主

    客气了,祝你用的愉快:lol

    该用户从未签到

    2

    主题

    3

    回帖

    27

    积分

    新手上路

    积分
    27
    发表于 2023-3-27 22:00:08 | 显示全部楼层
    STC-SPI 最大的设计失败,就是MOSI 空闲 不能配置成低电平

    点评

    同感 !!! WS2812 多级串联, 当数据量超出 DMA 缓冲区长度时, 就不能直接 使用了, 必须外加一级反相器, 才能可靠的分多次传送.  详情 回复 发表于 2023-12-30 09:31
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-7-21 17:32 , Processed in 0.128829 second(s), 82 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表