瑞芯微Rockchip开发者社区
直播中

jf_70044302

1年用户 24经验值
擅长:嵌入式技术 RF/无线
私信 关注
[经验]

【LuckFox Pico Plus开发板免费试用】05_使用SPI驱动WS2812B

使用SPI驱动WS2812B
前面把开发环境全部搭好,工具也都准备好了,这次就来做点小demo,正好手上有一个WS2812B的小灯条,上面有16颗灯珠,就想到用Luckfox Pico来控制它。灯条的控制只需要接5V电源以及SPI主机的MOSI引脚。5V就接到VBUSUSB供电引脚即可。
WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅受限信号传输速度要求。这个灯现在应用非常广泛,其尺寸如下和引脚。
芯片的供电电压还是有一些要求的,最低要3.7V,为了能更好地驱动它,还得需要用板子上的5V电源。
而数据通信则用3.3V的电平,根据其电器参数表的描述,3.3V的高电平也足够其识别了。
电路设计上,只需要按照如下的串联即可
WS2812B的数据传输采用单线方式,如下为其数据传输时间、时序波形和数据传输方法,可以看到,其数据10,分别采用不同的高电平时间来决定。根据时间值,可以估算,数据10的总时间可以相同,而高电平时间分别为总时间的2/31/3即可,总时间可以设定为1.25uS,相当于是一个约800KHz的方波,只是占空比分别是2/31/3来分别待变10。但我们采用的是SPI的方式驱动,该方式驱动需要控制每个字节的8位中连续置1的位的个数来实现占空比的调节,根据下面的时间,可以分别采用5bit位和2bie位来表示数值1和数值0,也就是5/82/8,相当于781nS313nS,正好能符合时序所要求的T1HT0H的时间。
在数据传输的方法中,前面已经提到,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit也就是每个灯,只保留自己收到的第一个24bit数据,剩下的都传给下一个灯。
同时,在传输完一次所有数据之后,需要产生一个RESET信号,该信号时间大于280uS,设计中采用320uS,以满足改时序。
数据在发送时,按照下面的顺序传输,即高位线发送,GRB的顺序发送.
下面就可以考虑如何驱动具体的灯带或者灯条了
首先就是MOSI引脚需要上拉电阻,以确保满足WS2812B控制时序要求的空闲状态下为高电平的要求,这点在调试的过程中遇到了问题,由于不确定是否IO口是否有上拉,并且是第一次上手学习,所以不熟悉如何确认和修改上拉电阻配置,后来从教程中一步一步学习,找到了设备树上如何更改GPIO的配置,
先找到设备树文件
/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico-plus.dts
定位到SPI外设部分,然后添加pinctrl部分代码,要特别注意IO口配置为内部上拉电阻。
保存,编译前先clean,以确保更改内容编译生效
开始编译内核
然后使用官方的烧写镜像工具SocToolKit按照前面文章方法烧写即可。
接下来开始写ws2812b代码,首先在home下创建luckfox_pico_code及其下面的ws2812b_spi文件夹,然后在此文件夹下创建ws2812b.c文件,用于编写程序。
首先添加所需头文件
然后定义前文中所属需要用到的一些常亮,包括SPI的时钟,LED的数量、RESET的时间及其所需发送字节数及其字节值,数值10的字节值等
然后定义WS2812B用到的结构体和显示内容的缓存空间,其中结构体内容即为GBR三种颜色的三个字节
接下来定义ws2812b的缓存刷新函数,该函数将所需刷新的灯珠的颜色数据转换为SPI需要发送的缓存。
然后来到main函数,该函数首先进行了SPI的初始化配置
接着就来到主循环,主循环中主要做的就是更新ws2812b_color这个决定灯珠显示的结构体,更新显示缓存,并刷新灯珠显示。
需要注意的是,下面这句代码主要用于在发送完缓存之后在RESET低电平信号之前充分拉高电平。
编译,这时就产生目标可执行文件了
这时我们就可以把执行文件通过之前的ADB方式发送给Luckfox
在板子上就可以看到ws2812b执行文件了。更改文件权限并执行,开始打印显示缓存大小,并每2秒循环打印一次显示的颜色编号。
用逻辑分析仪,可以看到这个2秒的更新周期
将其放大,可以看到显示数据,以及RESET信号
继续放大,可以看到SPI数据输出之后,对应到WS2812BDI引脚上的频率,约800K,以及数据10的占空比情况
灯条显示的效果。

下面是讲解视频

使用SPI驱动WS2812B

回帖(1)

jf_74136941

2023-12-21 17:31:14
您好,01-04的文章在哪里,很想看
1 举报
  • jf_70044302: 啊……你点开我的账号,就可以在已发帖子那边看到的啊,也可以点开下面的链接
    1:
    https://bbs.elecfans.com/jishu_2383850_1_1.html
    2:
    https://bbs.elecfans.com/jishu_2384991_1_1.html
    3:
    https://bbs.elecfans.com/jishu_2384992_1_1.html
    4:
    https://bbs.elecfans.com/jishu_2384993_1_1.html

更多回帖

发帖
×
20
完善资料,
赚取积分