• 【STM32】WS2812介绍、使用SPI+DMA发送数据


    这篇要使用到SPI+DMA,需要了解的话,可以参考我另两篇博客

    时钟:https://www.cnblogs.com/PureHeart/p/11330967.html

    SPI+DMA通信:https://www.cnblogs.com/PureHeart/p/11218076.html 

    文章前半会先介绍WS2812通信方式,文章后半才是SPI+DMA

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

    VDD:电源,3.5V~5.3V

    VSS:地

    DIN:数据输入

    DOUT:数据输出

    相关参数如下图

    接下来,才是最主要的,WS2812是如何通信?

    它就像一块大蛋糕

    把大蛋糕交给第1人,第1人吃了一口

    然后把吃过的大蛋糕,交给第2人,第2人吃了一口

    再然后把吃过的大蛋糕,交给第3人,第3人吃了一口....

    数据也是如此,例如上图,以24bit为1组数据,相当于蛋糕的一口

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

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

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

    那什么时候,WS2812会认为你的数据是新的呢(新一轮的蛋糕)?

    低电平时间 >= 50us,WS2812就会认为是新一轮的数据了

    至于为什么是低电平,下面的图片,我会和24bit的内容一起介绍

    24bit的数据里面,最高8位是控制绿色,中间8位控制红色,低8位控制蓝色

    亮度为0~255,所以1111 1111就是最亮,0000 0000就是不亮

    然后最最重要的地方来了

    这里的1、0,上图说的很明白了

    一定时间的高电平 + 一定时间的低电平 = WS2812承认的一位信号(高电平或低电平)

    0 code(WS2812承认的低电平)就要求【T0H】和【T0L】的时间,当然 1 code(高电平)也是

    所以!

    假设以串口为例(用串口比喻,是因为我觉得大家应该都熟悉,当然,这里还没考虑WS2812需要很高波特率这个问题)

    设置好串口初始化之类的,然后对照g7,g6,g5,...,b0,调用串口发送3个字节来点亮1个WS2812,这是不可能的

    如下图所示

    既然此路不通,那应该如何解决呢?

    我们应该进行压缩,如下图

    是不是啊,只要我把一个字节的长度(以绿色波形为例),压缩到跟G7一样的长度(图片只压缩到G7~G3,弄的太小就看不清楚啦)

    然后再改一下,不要发0x90,按照【T0H、T0L】【T1H、T1L】,就能控制了

    所以,要能控制WS2812,我必须要发24个字节,这还只是一个LED要的数据而已

    然后是压缩,有经验的人应该马上会想到,其实这就是时钟,设定好SPI的时钟,就能达到这样的效果

    那么时钟应该要设置多少呢?

    在STM32F4里面,SPI发送可以设置8位或是16位数据

    8位为例,8位的时间总和,不管是 0 code 还是 1 code ,都约等于1.25u

    1.25u / 8,每一位等于0.15625u

    公式:频率 = 周期的倒数

    频率 = 1 / 0.15625u

    频率 = 6.4M

    SPI设置6.4M就可以了

    当然,我上面用的是1.25u,也可以用1.1u,也可以用1.4u(因为有150n的允许误差)

    反正不超过规定的值,就可以了。。。也许。。。?

    主时钟设置为40M,SPI经过8分频,得到5M

    因为我有一些其他外设要配合,才这么设置主时钟的

    当然,我实测5M也是可以的。。。

    1 / 5M = 0.2u

    0.2u × 8 = 1.6u,已经超过规定的1.25u ± 150n 了!

    不过可以用就好了。。。

    代码,应该也没有什么好讲的了,还是把它贴上吧,另外我有用DMA(减少CPU负担)

    下图main函数里while(1)里面的0805LED,只是普通的LED,和WS2812没关系,啊,另外,我用的是STM32F4的芯片

    代码链接:https://pan.baidu.com/s/1S33m7tx9Tfg8e3WKphGuNQ

    提取码:s82g

  • 相关阅读:
    Web.xml配置详解
    JAVA的StringBuffer类
    工作空间造成的javaweb项目无法新建
    典型程序实现代码汇总(1)
    TCP/UDP常见端口参考
    HTTP状态码详解
    struts2的java.lang.NoSuchMethodException异常处理
    python学习之路-6 冒泡算法、递归、反射、os/sys模块详解
    python学习之路-5 基础进阶篇
    python学习之路-4 内置函数和装饰器
  • 原文地址:https://www.cnblogs.com/PureHeart/p/11349495.html
Copyright © 2020-2023  润新知