这篇要使用到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

【STM32】WS2812介绍、使用SPI+DMA发送数据的更多相关文章

  1. 为何串口dma发送数据可能不完整

    串口dma数据发送不完整, 1. 通过打印log说明数据合成,送给dma buff都是正常的. 2. 数据通过硬件串口直接配置,是正常的 3. 数据通过单片机dma转发后数据异常,通过检查发现 dma ...

  2. STM32使用DMA发送串口数据

    1.概述 上一篇文章<STM32使用DMA接收串口数据>讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断.本篇文章主要讲解使用DMA发送数据,不会讲解基础的 ...

  3. STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...

  4. MM32F0140 UART1 DMA RX and TX 中断接收和发送数据

    目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...

  5. STM32 SPI DMA 的使用

    一是想总结一下SPI总线的特点与注意点,二是总结一下SPI DMA的使用 一.SPI信号线说明 通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚.该引脚在从模式下发送数据, ...

  6. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  7. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  8. STM32输入捕获模式设置并用DMA接收数据

    参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...

  9. STM32的PWM输入模式设置并用DMA接收数据

    参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The ...

随机推荐

  1. clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)

    clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused) 关闭防火墙,可以连, ...

  2. 【Python+postman接口自动化测试】(7)Postman 的使用教程

    Postman v6的使用 Postman: 简单方便的接口调试工具,便于分享和协作.具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, 接口文档,接口监控 ...

  3. Spark中的两种模式

    两种模式 client-了解 cluster模式-开发使用 操作 1.需要Yarn集群 2.历史服务器 3.提交任务的的客户端工具-spark-submit命令 4.待提交的spark任务/程序的字节 ...

  4. 为 Android 编译并集成 FFmpeg 的尝试与踩坑

    前言与环境说明 随着 FFmpeg.NDK 与 Android Studio 的不断迭代,本文可能也会像我参考过的过期文章一样失效(很遗憾),但希望本文中提到的问题排查以及步骤说明能够帮到你,如果发现 ...

  5. Linux系统查看磁盘可用空间的5个命令

    大家好,我是良许. 工作中,经常会遇到磁盘爆满的情况,尤其是一台服务器运行了 N 年之后,里面会充满各种各样垃圾文件,比如:编译产生的中间文件.打包的镜像文件.日志文件,等等. 别问我怎么知道,我上家 ...

  6. Mysql5.7和8.0版本的文件夹版安装教程(整合版,超详细)

    安装Mysql(5.7版本) 下载地址在这里可以自选版本,找到合适的版本进行下载 解压安装包 配置环境变量 win+r 输入 sysdm.cpl 点击高级 点击环境变量 新建一个系统变量 变量名为MY ...

  7. 分享一下Eclipse中节省时间的技巧吧

    [初级技巧] ★★ 鼠标放在一个类名上面,会显示Javadoc.也可以通过屏幕下方的Javadoc面板来查看(你可以把它看成是MSDN的Java版). ★ 每个函数的第一行,左边有个圆圈,单击这个圆圈 ...

  8. [loj2506]tree

    2018年论文题,以下是论文前3章主要内容,与原题解相关部分为第4章中的启发式合并,也可快速跳至原题解 1.复杂度分析 Treap 定理1:$n$个节点的Treap的期望深度为$o(\log n)$ ...

  9. [noi110]翘课

    发现加边操作不好处理,因此考虑先加完所有边后删边. 删去一对边x到y,如果两者中有一个不翘课显然没有意义,那么如果都翘课了那么就对他们进行判断,如果无法翘课就继续搜下去. 这样的时间复杂度看上去似乎是 ...

  10. [hdu6761]Minimun Index

    $lyndon\ word$(以下简写为Lw):对于一个字符串s,其为Lw当且仅当其的最小后缀为自身 性质:若$u<v$为LW,那么$uv$也为Lw(反证法即可证) $lyndon$分解:将一个 ...