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

news/2024/10/18 1:40:03/

官网代码仓:BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码

代码仓和全网几乎没有hi3861SPI相关的例程序,故分享给大家(首发哈哈)

这个是代码的效果视频

ws2812

驱动ws2812灯板关键点为实现ws2812时序的0/1码

在liteos上我想到有三种方法

1.GPIO翻转

实时性不够,实测的不能得到400ns宽度(0码的脉宽)的电平

2.PWM占空比

没有找到dma发送的接口(不能连续发送多个字节),每次只能设置一个占空比,现象为连续多个相同占空比的电平

3.SPI发数据

理想情况下800K*8HZ发送一个字节(8bit)模拟ws2812一个时序周期

发送0xFC(11111100)时为‘1码’

发送0xE0 (11100000)时为‘0码’

发送0x00时为低电平,用作break/reset(MOSI空闲时为高电平),放在每帧开始

以下为接线图

 以下为源码

spi_example.c

#include <stdio.h>
#include <string.h>
#include "hi_gpio.h"
#include "hi_spi.h"
#include <hi_io.h>
#include <unistd.h>#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_INDEX  2//功能:把 3BYTE 的RGB数据转换成 24BYTE SPI数据
static void WS2812_send(unsigned char *rgb)
{unsigned char data[24];unsigned char i, bit;unsigned char index = 0;for(i = 0; i < 8; i++) // GREEN  按位发送{bit = ((rgb[GREEN_INDEX] << i) & 0x80);data[index] = (bit == 0x80) ? 0xfc : 0xe0;//spi发送0xfc 为ws812 1码 spi发送0xe0 为ws812 0码index++;} for(i = 0; i < 8; i++) // RED{bit = ((rgb[RED_INDEX]<<i) & 0x80);data[index] = (bit==0x80) ? 0xfc : 0xe0;index++;}for(i=0; i<8; i++) // BLUE{bit = ((rgb[BLUE_INDEX]<<i) & 0x80);data[index] = (bit==0x80) ? 0xfc : 0xe0;index++;}hi_spi_host_write(WIFI_IOT_SPI_ID_0, data, 24);
}
//色带
unsigned char color[8][3]=
{{255,255,255},//白{255,255, 0 },{255, 0 ,255},{ 0 ,255,255},{ 0 , 0 ,255},//蓝{ 0 ,255, 0 },//绿{255, 0 , 0 },//红{ 0 , 0 , 0 }
};static void WS2812Task(void)
{//初始化GPIOGpioInit();hi_spi_deinit(HI_SPI_ID_0); /* if wake_up from deep sleep, should deinit first */hi_spi_cfg_basic_info spi_cfg_basic_info;spi_cfg_basic_info.cpha = 0;spi_cfg_basic_info.cpol = 0;spi_cfg_basic_info.data_width = HI_SPI_CFG_DATA_WIDTH_E_8BIT;spi_cfg_basic_info.endian = 0;spi_cfg_basic_info.fram_mode = 0;spi_cfg_basic_info.freq = 8*900000; hi_spi_cfg_init_param spi_init_param = {0};spi_init_param.is_slave = 0;hi_spi_init(HI_SPI_ID_0, spi_init_param, &spi_cfg_basic_info); //基本参数配置hi_spi_set_loop_back_mode(HI_SPI_ID_0, 1);hi_io_set_func(HI_IO_NAME_GPIO_12, HI_IO_FUNC_GPIO_12_SPI0_CSN);//io配置hi_io_set_func(HI_IO_NAME_GPIO_10, HI_IO_FUNC_GPIO_10_SPI0_CK);hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_SPI0_RXD);hi_io_set_func(HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_SPI0_TXD);hi_io_set_driver_strength(HI_IO_NAME_GPIO_6, HI_IO_DRIVER_STRENGTH_2);//驱动能力hi_spi_set_irq_mode(HI_SPI_ID_0, 0);hi_spi_set_dma_mode(HI_SPI_ID_0, 1);unsigned char data[50];unsigned char rgb[3];unsigned int i;while (1){for (i = 0; i < 256; i ++){memset(data, 0, sizeof(data));hi_spi_host_write(WIFI_IOT_SPI_ID_0, data, sizeof(data));//前50byte为低电平breakfor (unsigned int j = 0; j < 256; j ++)//亮度{rgb[0] = color[i%7][0]&j;//色带rgb[1] = color[i%7][1]&j;rgb[2] = color[i%7][2]&j;for (unsigned int k = 0; k < 256; k ++)//控制256个灯WS2812_send(rgb);usleep(10 * 1000);}}i = 0;}
}static void WS2812ExampleEntry(void)
{osThreadAttr_t attr;attr.name = "WS2812Task";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 1024;attr.priority = osPriorityAboveNormal6 ;if (osThreadNew((osThreadFunc_t)WS2812Task, NULL, &attr) == NULL)//创建线程{printf("Falied to create WS2812Task!\n");}
}APP_FEATURE_INIT(WS2812ExampleEntry);

BUILD.gn 

static_library("spi_example") {sources = ["spi_example.c","//ohos_bundles/@bearpi/hm_nano_hi3861/platform/drivers/spi/hi_spi.c","//ohos_bundles/@bearpi/hm_nano_hi3861/platform/drivers/spi/spi.c",]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/interfaces/kits/wifiiot_lite","//ohos_bundles/@bearpi/hm_nano_hi3861/include",]
}


http://www.ppmy.cn/news/860378.html

相关文章

小熊派华为物联网操作系统 LiteOS内核教程04-信号量

1. LiteOS内核的信号量 1.1.信号量 在多任务操作系统中&#xff0c;不同的任务之间需要同步运行&#xff0c;信号量功能可以为用户提供这方面的支持。信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;实现任务之间同步或临界资源的互斥访问。…

【伙伴故事】智慧厨电接入华为云+HarmonyOS,你的未来厨房长这样

摘要&#xff1a;国内集成灶的头部企业—火星人&#xff0c;正是通过华为云IoT接入HarmonyOS生态&#xff0c;打造云端智慧厨房的整体解决方案&#xff0c;为我们描绘出一副未来厨房新趋势的蓝图。 本文分享自华为云社区《【伙伴故事】智慧厨电接入华为云HarmonyOS&#xff0c;…

华为机试:导师请吃火锅

题目来源 华为机试&#xff1a;导师请吃火锅 题目描述 题目解析 贪心 #include <iostream> #include <utility> #include <vector> #include <random> #include <iterator> #include <map> #include <algorithm> #include <set…

小熊派华为物联网操作系统LiteOS内核教程05-互斥锁

1. LiteOS的互斥锁 1.1. 互斥锁 在多任务环境下&#xff0c;往往存在多个任务竞争同一共享资源的应用场景&#xff0c;互斥锁可被用于对共享资源的保护从而实现独占式访问。互斥锁(mutex)又称互斥型信号量&#xff0c;是一种特殊的二值信号量&#xff0c;用于实现对共享资源的…

小熊派HarmonyOS 鸿蒙·季 开发教程学习笔记(01)

小熊派HarmonyOS 鸿蒙季 开发教程学习笔记&#xff08;01&#xff09; BearPi-HM Nano开发板介绍 BearPi-HM Nano开发板功能介绍 BearPi-HM Nano开发板是一块专门为鸿蒙OS设计的HarmonyOs开发板&#xff0c;板载高度集成的2.4GHz WLAN SoC芯片Hi3861&#xff0c;并板载NFC电…

小熊派HarmonyOS 鸿蒙开发板-BearPi-HM Nano 十分钟上手教程

一、准备工作 准备一台电脑&#xff1a; 无具体要求&#xff0c;家用即可&#xff0c;Windows系统 二、开始下载 下载官方提供镜像 下载地址&#xff08;百度云&#xff09;&#xff1a;https://pan.baidu.com/s/1T0Tcl3y48C1p5L6y-6HJNg 提取码&#xff1a;eusr 下载HiBurn …

华为小熊派开发记录STM32+MPU6050+WIFI8266

华为小熊派开发记录STM32MPU6050WIFI8266 前言STM32CubeMXMDKLiteOSMPU6050WIFI8266华为云使用其它 前言 忽悠下参加了物联网开发比赛&#xff0c;用了华为小熊派开发板&#xff0c;之前有过TI的开发经历&#xff0c;这次不知道为什么脑热选了华为&#xff0c;总之整个过程走下…

vue使用html2canvas实现一键截图并赋值到剪贴板,只截取当前显示器上可视的内容

使用html2canvas 和 clipboard API实现整页截图并填充至剪切板。 访问剪切板的api只支持在https或者本地localhost上使用&#xff0c;如果是http&#xff0c;则无法使用 首先需要从npm安装html2canvas npm install html2canvas然后在代码中导入这个包&#xff1a; import ht…