光之使者 发表于 2022-6-24 05:34:01

小熊派bearpi-HM-nano(hi3861鸿蒙LiteOS)点亮WS2812灯板(spi方式)

官网代码仓:BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码
代码仓和全网几乎没有hi3861SPI相关的例程序,故分享给大家(首发哈哈)
这个是代码的效果视频
   ws2812
驱动ws2812灯板关键点为实现ws2812时序的0/1码
https://img-blog.csdnimg.cn/af090b993f904245b5063da348eb2cc6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWlhbG8xNjM=,size_20,color_FFFFFF,t_70,g_se,x_16

在liteos上我想到有三种方法
1.GPIO翻转
实时性不够,实测的不能得到400ns宽度(0码的脉宽)的电平
2.PWM占空比
没有找到dma发送的接口(不能连续发送多个字节),每次只能设置一个占空比,现象为连续多个相同占空比的电平
3.SPI发数据
理想情况下800K*8HZ发送一个字节(8bit)模拟ws2812一个时序周期
发送0xFC(11111100)时为‘1码’
发送0xE0 (11100000)时为‘0码’
https://img-blog.csdnimg.cn/88f7cca973fa4022b3970a029b514d7d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWlhbG8xNjM=,size_20,color_FFFFFF,t_70,g_se,x_16

发送0x00时为低电平,用作break/reset(MOSI空闲时为高电平),放在每帧开始
https://img-blog.csdnimg.cn/39420a5e32a940ccb59118804c7361dc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWlhbG8xNjM=,size_20,color_FFFFFF,t_70,g_se,x_16
以下为接线图https://img-blog.csdnimg.cn/d760fa6ff45a44a7875f47825981b9da.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWlhbG8xNjM=,size_20,color_FFFFFF,t_70,g_se,x_16
 以下为源码
spi_example.c
#include #include #include "hi_gpio.h"#include "hi_spi.h"#include #include #include "ohos_init.h"#include "cmsis_os2.h"#include "wifiiot_pwm.h"#include "wifiiot_gpio.h"#include "wifiiot_spi.h"#include "wifiiot_gpio_ex.h"#define RED_INDEX   0#define GREEN_INDEX 1#define BLUE_INDEX2//功能:把 3BYTE 的RGB数据转换成 24BYTE SPI数据static void WS2812_send(unsigned char *rgb){    unsigned char data;    unsigned char i, bit;    unsigned char index = 0;      for(i = 0; i < 8; i++) // GREEN按位发送      {            bit = ((rgb
页: [1]
查看完整版本: 小熊派bearpi-HM-nano(hi3861鸿蒙LiteOS)点亮WS2812灯板(spi方式)