关于使用WS2811点灯
今天某位网友突然提到说需要使用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点灯相关推荐
- STM32+ws2812灯条,点灯升级版
ws2812系列灯条,是一种可寻址的RGB LED彩灯,可以自定义颜色.点灯速度等.只需要一个IO就可以控制多个灯.ws2812系列有三根线,分别为VCC.GND.信号控制线.作为优化升级版的ws2 ...
- python小游戏代码大全-Python编写的点灯小游戏代码
Python语言编写的点灯小游戏代码及思路如下: 点灯游戏及其求解的方法, 点灯游戏的游戏规则: (1)有个N行N列的灯板,当你开关其中一盏灯: (2)它和上下左右的灯的状态全部反转,目标是将全部的灯 ...
- linux网卡点灯命令,LINUX下SHELL GPIO点灯
我使用的lichee Pi 芯片是全志的v3s.摸索一下linux的点灯. 我的代码 #!/bin/sh echo "led run!" echo 36 > /sys/cla ...
- 【arduino】玩CyberPi童芯派之真点灯,点亮板载RGB灯,GPIO扩展芯片AW9523B驱动
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 上周开了个头,简单介绍了一下CyberPi童芯派,今天开始搞驱动,本来是想搞彩屏的,还 ...
- 【arduino】不做不死系列,用arduino玩CyberPi童芯派之helloworld点灯
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 童芯派CyberPi发售有2个月了,我在6月底拿到了一块,简单玩了一下,感觉还是非常N ...
- 邀请参加活动的邀请函_圣诞节点灯仪式活动邀请函制作
点击箭头处"蓝色字",关注我们哦!! 圣诞节最让人期待的是什么,当然就是圣诞树和礼物了,可是大家别玩了每年的圣诞节在一些国家都会进行着点灯仪式的,这个点灯仪式不仅灯光璀璨,且很是热 ...
- stm32呼吸灯程序_学习STM32从点灯开始!
前言 学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠.细抠,为之后更复杂的知识打好基础. 与硬件无关的LED驱动 回顾hello驱动程序,我 ...
- 单片机点灯不难,但你会网页点灯吗?
大家好,我是张巧龙,单片机点灯大家都会,网页点灯呢? 今天就给大家介绍下,如何网页点灯! 整个流程大致为: 从上到下,前面两部分我们就是我们上一篇做的实验,已经打通了.而第三部分就是本篇笔记的重点,我 ...
- STM32F103实现点灯(固件库方式)
参考:stm32上实现点灯 作者:SKY丶丿平才 发布时间: 2021-03-20 16:51:06 网址:https://blog.csdn.net/weixin_48264057/article/ ...
- STM32F103实现点灯(寄存器方式)
参考:STM32F103系列最简易版点灯程序 作者:一只青木呀 发布时间:2020-10-21 11:40:38 网址:https://blog.csdn.net/weixin_45309916/ar ...
最新文章
- Java开发字符串JSON处理
- 食堂就餐刷卡系统源码_智慧食堂重新定义你的食堂管理系统
- ZooKeeper学习笔记1-----------安装启动
- java派生类如何使用_继承:使用基类或派生类来做东西[关闭]
- python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章
- 安卓apk签名提取工具_Android测试工具入门介绍(二)
- 执行ios命令_MEDUZA:一款针对iOS应用程序的通用SSL解绑工具
- 解决vue-cli使用组件报错
- 收藏 | 万字长文带你理解Pytorch官方Faster RCNN代码
- mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
- python struct pack string_struct (String) – Python 中文开发手册
- Linux截图工具import使用说明
- C++中实现类似php的UTF8和UrlEncode函数的代码
- 有没有一款手机桌面便签软件?真正好用的便签软件推荐
- 世界各国2015-2020GDP排名
- 2的32次方减1用python_3.Python入门
- L2-3 清点代码库 (25 分)(C/C++)
- JavaCV音视频开发宝典:JavaCV使用gdigrab方式实现windows录屏(windows屏幕画面抓取/采集,可实现高帧率屏幕截屏、录屏功能)
- 情人节,你约,还是不约?
- tftp协议的实现和即时通讯软件