使用SPI驱动WS2812B 前面把开发环境全部搭好,工具也都准备好了,这次就来做点小demo,正好手上有一个WS2812B的小灯条,上面有16颗灯珠,就想到用Luckfox Pico来控制它。灯条的控制只需要接5V的电源以及SPI主机的MOSI引脚。5V就接到VBUS的USB供电引脚即可。 WS2812B 是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅受限信号传输速度要求。这个灯现在应用非常广泛,其尺寸如下和引脚。 芯片的供电电压还是有一些要求的,最低要3.7V,为了能更好地驱动它,还得需要用板子上的5V电源。 而数据通信则用3.3V的电平,根据其电器参数表的描述,3.3V的高电平也足够其识别了。 电路设计上,只需要按照如下的串联即可 WS2812B的数据传输采用单线方式,如下为其数据传输时间、时序波形和数据传输方法,可以看到,其数据1和0,分别采用不同的高电平时间来决定。根据时间值,可以估算,数据1和0的总时间可以相同,而高电平时间分别为总时间的2/3和1/3即可,总时间可以设定为1.25uS,相当于是一个约800KHz的方波,只是占空比分别是2/3和1/3来分别待变1和0。但我们采用的是SPI的方式驱动,该方式驱动需要控制每个字节的8位中连续置1的位的个数来实现占空比的调节,根据下面的时间,可以分别采用5bit位和2bie位来表示数值1和数值0,也就是5/8和2/8,相当于781nS和313nS,正好能符合时序所要求的T1H和T0H的时间。 在数据传输的方法中,前面已经提到,首先送过来的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的时间及其所需发送字节数及其字节值,数值1和0的字节值等 然后定义WS2812B用到的结构体和显示内容的缓存空间,其中结构体内容即为GBR三种颜色的三个字节 接下来定义ws2812b的缓存刷新函数,该函数将所需刷新的灯珠的颜色数据转换为SPI需要发送的缓存。 然后来到main函数,该函数首先进行了SPI的初始化配置 接着就来到主循环,主循环中主要做的就是更新ws2812b_color这个决定灯珠显示的结构体,更新显示缓存,并刷新灯珠显示。 需要注意的是,下面这句代码主要用于在发送完缓存之后在RESET低电平信号之前充分拉高电平。 编译,这时就产生目标可执行文件了 这时我们就可以把执行文件通过之前的ADB方式发送给Luckfox 在板子上就可以看到ws2812b执行文件了。更改文件权限并执行,开始打印显示缓存大小,并每2秒循环打印一次显示的颜色编号。 用逻辑分析仪,可以看到这个2秒的更新周期 将其放大,可以看到显示数据,以及RESET信号 继续放大,可以看到SPI数据输出之后,对应到WS2812B的DI引脚上的频率,约800K,以及数据1和0的占空比情况 灯条显示的效果。
下面是讲解视频
使用SPI驱动WS2812B
|