今天某位网友突然提到说需要使用ws2811点亮一条灯带,想到之前有专门研究过此方面内容,不免拿出卖弄一下。

首先我们来研究一下,为什么只需要一个GPIO口就能点亮一串WS2812灯珠,而且每个灯珠都可以使用256*256*256色?

从datasheet来看(这里再吐槽一把,也许是原理太简单,不同网站下的ws2811的参数居然不同),就是按比特位给每个灯发送数据,每个灯都取走第一个颜色(24位),取完自己的颜色后,将剩余颜色向后传递,依次递推。因为用一段高低电平的持续实际分别0和1,表示所以群里说的SPI+DMA比NOP速率高,是不太可能的,点灯的速率只和需要点灯的数量有关(反正每个灯1.25us左右),和采用点灯的方案关系不大。如下是截取不同版本datasheet里的说明:

     

看,虽然每个文档都写TH+TL值相同(1.25us),但有些文档里面0的持续时间(0.35us+0.8us)是可以比1持续时间(0.7us+0.6us)短的。虽然可以实现在150ns的误差范围内使其满足1.25us的需求,但严格按照数据手册编程的话,还是有所差异的。

接下来,我们看看怎么实现点灯,最直接的想法肯定是直接控制IO口,并精确调整延时,这对板子性能要求太高,一般的板卡都不太可能做到;退而求其次,用NOP来做延时,这个对板子的性能要求没有那么高,大多数开发板可以做到。

最近在读RT-thread中的WS2811源码,感觉非常巧妙,具体是怎么实现的呢?答案是利用SPI接口。

传统SPI采用4根信号线,分别为CLK、CS、SDI和SDO。SPI是串行通讯协议,也就是说数据是一位一位的传输的。在CS片选之后,由主设备的SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,连续8次时钟信号的改变(上沿和下沿为一次),才能完成一个字节数据的传输。输入也使用同样原理。

如上所述,当没有时钟变化时,SDO口的电平是相对保持的(无所谓正反相位),因此可以使用SPI总线发送特定数据分别表示0和1。

在RT-Thread中选取

可以看到相关代码如下:

这是在初始化SPI,使其时钟为13.333MHz,每个时钟周期可以传送1bit数据,耗时75ns。

接下来,采用SPI传输两个字节来实现WS2812上的1个位数据。

可以看到,bit0使用1111 1000 0000 0000,bit1使用1111 1111 1110 0000,分别对应高低电平时长。

T0H=0.375us

T0L=0.825us

T1H=0.825us

T1L=0.375us

基本上在datasheet的标注范围内。

函数ws2812_write_rgb_to_node

实现单个灯珠颜色的写入。

函数ws2812_write_rgb_to_all

次第写入灯链中每个节点的数据

接下来实现通过SPI发送数据

对于调整灯链颜色的需求,因为每次变换颜色,时间间隔至少50us,对于开发板来说,这个实现起来就比较简单,在这里也不用特别提及了。

---------------------
作者:tobot
链接:https://bbs.21ic.com/icview-3200798-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

关于使用WS2811点灯相关推荐

  1. STM32+ws2812灯条,点灯升级版

    ws2812系列灯条,是一种可寻址的RGB  LED彩灯,可以自定义颜色.点灯速度等.只需要一个IO就可以控制多个灯.ws2812系列有三根线,分别为VCC.GND.信号控制线.作为优化升级版的ws2 ...

  2. python小游戏代码大全-Python编写的点灯小游戏代码

    Python语言编写的点灯小游戏代码及思路如下: 点灯游戏及其求解的方法, 点灯游戏的游戏规则: (1)有个N行N列的灯板,当你开关其中一盏灯: (2)它和上下左右的灯的状态全部反转,目标是将全部的灯 ...

  3. linux网卡点灯命令,LINUX下SHELL GPIO点灯

    我使用的lichee Pi 芯片是全志的v3s.摸索一下linux的点灯. 我的代码 #!/bin/sh echo "led run!" echo 36 > /sys/cla ...

  4. 【arduino】玩CyberPi童芯派之真点灯,点亮板载RGB灯,GPIO扩展芯片AW9523B驱动

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 上周开了个头,简单介绍了一下CyberPi童芯派,今天开始搞驱动,本来是想搞彩屏的,还 ...

  5. 【arduino】不做不死系列,用arduino玩CyberPi童芯派之helloworld点灯

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 童芯派CyberPi发售有2个月了,我在6月底拿到了一块,简单玩了一下,感觉还是非常N ...

  6. 邀请参加活动的邀请函_圣诞节点灯仪式活动邀请函制作

    点击箭头处"蓝色字",关注我们哦!! 圣诞节最让人期待的是什么,当然就是圣诞树和礼物了,可是大家别玩了每年的圣诞节在一些国家都会进行着点灯仪式的,这个点灯仪式不仅灯光璀璨,且很是热 ...

  7. stm32呼吸灯程序_学习STM32从点灯开始!

    前言 学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠.细抠,为之后更复杂的知识打好基础. 与硬件无关的LED驱动 回顾hello驱动程序,我 ...

  8. 单片机点灯不难,但你会网页点灯吗?

    大家好,我是张巧龙,单片机点灯大家都会,网页点灯呢? 今天就给大家介绍下,如何网页点灯! 整个流程大致为: 从上到下,前面两部分我们就是我们上一篇做的实验,已经打通了.而第三部分就是本篇笔记的重点,我 ...

  9. STM32F103实现点灯(固件库方式)

    参考:stm32上实现点灯 作者:SKY丶丿平才 发布时间: 2021-03-20 16:51:06 网址:https://blog.csdn.net/weixin_48264057/article/ ...

  10. STM32F103实现点灯(寄存器方式)

    参考:STM32F103系列最简易版点灯程序 作者:一只青木呀 发布时间:2020-10-21 11:40:38 网址:https://blog.csdn.net/weixin_45309916/ar ...

最新文章

  1. Java开发字符串JSON处理
  2. 食堂就餐刷卡系统源码_智慧食堂重新定义你的食堂管理系统
  3. ZooKeeper学习笔记1-----------安装启动
  4. java派生类如何使用_继承:使用基类或派生类来做东西[关闭]
  5. python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章
  6. 安卓apk签名提取工具_Android测试工具入门介绍(二)
  7. 执行ios命令_MEDUZA:一款针对iOS应用程序的通用SSL解绑工具
  8. 解决vue-cli使用组件报错
  9. 收藏 | 万字长文带你理解Pytorch官方Faster RCNN代码
  10. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
  11. python struct pack string_struct (String) – Python 中文开发手册
  12. Linux截图工具import使用说明
  13. C++中实现类似php的UTF8和UrlEncode函数的代码
  14. 有没有一款手机桌面便签软件?真正好用的便签软件推荐
  15. 世界各国2015-2020GDP排名
  16. 2的32次方减1用python_3.Python入门
  17. L2-3 清点代码库 (25 分)(C/C++)
  18. JavaCV音视频开发宝典:JavaCV使用gdigrab方式实现windows录屏(windows屏幕画面抓取/采集,可实现高帧率屏幕截屏、录屏功能)
  19. 情人节,你约,还是不约?
  20. tftp协议的实现和即时通讯软件

热门文章

  1. 新手教程:采用AD9软件画原理图
  2. 【Java架构师入门到精通】架构师图谱
  3. C# SQL拼接字符串
  4. 资源分享:一千张高清头像图片免费分享,适用于网站app程序使用!
  5. 彻底删除dll文件,填坑!
  6. 内外网同时使用-路由配置
  7. STC单片机使用RS485下载程序方法
  8. UVa 12261 High Score (贪心“向左走,向右走”)
  9. c语言写一个五子棋小游戏
  10. mysql服务器版本手册_MySQL中文参考手册——与MySQL服务器连接