oneos组件系列02:ws2812全彩LED驱动
本组件仓库:
https://gitee.com/dreamfly233/OneOS/tree/projects_OneOS-v2.3.0/components/ws2812
参考链接:
ws2812简介:
- WS2812 内部集成了处理芯片和3颗不同颜色的led灯(红,绿,蓝),通过单总线协议分别控制三个灯的亮度强弱,达到全彩的效果,每一个灯需要 8 bits(1 byte) 的数据,所以一颗 ws2812 共需要24 bits(3 bytes) 的数据。
- 支持信号级联
级联数据格式:
每个reset期间发送n个24bit数据,发送第二组24bit数据时,由灯珠D1自动整形向D2发送第一组的24bit数据;发送第三组24bit数据时,第一组的24bit数据由D2整形发向D3,以此类推
最先发送的24bit数据控制级联最远端的灯Dn,最后发送的24bit数据控制灯珠D1
发送的24bit数据结构:
按每种颜色的亮度值组合为共计24bit数据,通过0 码和1 码发送
0 码: 约0.35us的高电平(T0H)+0.8us的低电平
1 码:0.7us的高电平+0.6us的低电平
- 关于时序,网上可以找到很多版本的时序表格,上图仅供参考,ws2818的时序要求相对宽松,但根据时序图有一个结论是0 码的高电平不能过长,1 码的高电平不能过短
设计思路:
对于spi方式操作ws2812,spi的时钟频率决定了操作的时序,这里对不同spi的时钟频率分别处理
例如在spi频率为6M时,可通过spi发送0xf8(1字节)得到高电平0.83us + 低电平0.5us的时序,符合1 码
当spi频率为9M时,可通过发送0xff00(2字节)将得到高电平0.88us + 低电平0.88us的时序,同样符合1 码
spi通过对接oneos的spi框架实现,DMA可直接在驱动中配置
实战测试:
准备项:
-
复制project/stm32f103zet6-atk-warship_v3文件夹,并重命名为stm32f103zet6-atk-warship_v3-ws2812
-
若使用其他型号开发板,在peoject目录下使用project.bat创建,参考oneos 快速体验 stm32l496-ali-developerkit 开发板
配置说明:
以战舰V3开发板为例,
进入stm32f103zet6-atk-warship_v3-ws2812 文件夹,打开board/CubeMX_Config/CubeMX_Config.ioc 即cubemx工程,配置spi,这里使用板载nrf接口的spi,即spi2,MOSI引脚PB15
打开oneos-cube,进入menuconfig,定位到Components→ ws2812,勾选ws2812
ws2812 example勾选上
Spi BUS Name这里填spi2
ws2812 node length即级联的灯珠数量,根据实际灯带长度决定
Select SPI clock source freq选择与自己spi时钟频率符合的项,这里spi2的时钟源36Mhz,4分频为9Mhz,选择Select 9M 18M 36M 72M…项
保存并退出,使用scons --ide=mdk5生成mdk工程,然后打开project.uvprojx工程,编译下载
使用 ws2812_blink 或 ws2812_breath 命令测试ws2812
ws2812_blink效果:
ws2812_breath效果:
- tips:ws2812无片选功能,因此不能与其他spi设备同时使用(其他设备正常工作时将发送给ws2812错误的数据),建议独占一条spi总线