![poYBAGG2ot-AGNHBAABs_TTBnPY753.png](https://file.elecfans.com/web2/M00/25/16/poYBAGG2ot-AGNHBAABs_TTBnPY753.png)
1.概述
本期分享的是使用RA2E1通过SPI的MOSI脚产生WS2812的控制时序,实现灯带控制的效果。
2.灯带介绍
WS2812是24位(1600万)色LED灯源芯片,集成了信号整形控制、电源反接保护等功能,5V安全供电,性价比高,在智能灯带市场中应用非常广泛。芯片以级联的方式串接起来,每颗灯源可单独寻址控制,根据需要的长度和间距,定制出各种显示效果,如直线灯带、环形、点阵屏等。很多创客喜欢用WS2812彩灯DIY一些酷炫的项目,可以说网上关于WS2812的资料是比较丰富的。有用不同的控制核心实现控制,以及通过不同的方式进行控制。我们选用RA的SPI(默认使能DTC)MOSI口实现WS2812控制时序的输出。
WS2812需要的时序是这样的:
![c01ce818-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCaAMppaAAMb67RuymU382.png)
![c02bd9ea-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCaAcdWxAAJS0v-BEdU387.png)
需要注意的是不同厂家的产品时序略有差别,实际需要根据手册调整代码,以产生对应控制波形。
3.软件配置
e2studio中如下配置RA2E1的SPI:
![c03e4aee-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCaAccM4AABmnQ4hKm0257.png)
8M的SPI波特率,一个位的时间等于1s ÷ 8 × 10^6,为0.125μs。
WS2812需要的0码对应SPI发送 0b 1100 0000
WS2812需要的1码对应SPI发送 0b 1111 1000
设置SPI发送下面数据:
![c0487aa0-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCaAEEqwAAMs6KSiWPI855.png)
4.烧录测试
烧录后实际测一下P213引脚波形
复位
![c05a82b8-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCaAGZH4AABA-56sO9o928.png)
0码
![c064f022-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCaAcbUDAABGMoesNb4703.png)
1码
![c072ab54-6b23-11ec-ad3b-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCeAAKrFAABCF03anz4679.png)
实际效果
![c08311ec-6b23-11ec-ad3b-dac502259ad0.gif](https://file1.elecfans.com//web2/M00/9C/5E/wKgaomTnyCiAbqKQAHkEC3F2N4U831.gif)
5.例程获取
欢迎follow我们的gitee仓库获取更多示例代码及相关资料:https://gitee.com/ramcu/ra-eco-ra2-e1-48-pin
模块已接口化实现,方便调用
/*
* ws2812.h
*
* Created on: 2021年12月21日
* Author: ramcu
*/
#ifndef WS2812_H_
#define WS2812_H_
#include "hal_data.h"
#define NUMPIXELS (16)
#define NUMRES (60)
#define SPIBUFL ((NUMPIXELS) * 3 * 8 + NUMRES)
void ws2812Init(void);
void show(void);
void clear(void);
void setPixelColor(uint16_t n, uint8_t g, uint8_t r, uint8_t b);
#endif /* WS2812_H_ */
/*
* ws2812.c
*
* Created on: 2021年12月21日
* Author: ramcu
*/
#include "ws2812.h"
static uint8_t spidate[SPIBUFL] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xf8, 0xf8, \
0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xf8, 0xf8
};
void ws2812Init(void)
{
R_SCI_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg);
}
void show(void)
{
R_SCI_SPI_Write(&g_spi0_ctrl, spidate, SPIBUFL, SPI_BIT_WIDTH_8_BITS);
R_BSP_SoftwareDelay(80, BSP_DELAY_UNITS_MICROSECONDS);
}
void clear(void)
{
memset(& spidate[NUMRES], 0xc0, (NUMPIXELS) * 3 * 8);
}
void setPixelColor(uint16_t n, uint8_t g, uint8_t r, uint8_t b)
{
if (n < NUMPIXELS) {
uint8_t *p;
p = &spidate[NUMRES + n * 24];
for(uint8_t i = 0; i < 8; i++)
{
*(p + i) = (0 == (g & (1 << (7 - i)))) ? 0xc0 : 0xf8;
}
for(uint8_t i = 0; i < 8; i++)
{
*(p + i + 8) = (0 == (r & (1 << (7 - i)))) ? 0xc0 : 0xf8;
}
for(uint8_t i = 0; i < 8; i++)
{
*(p + i + 16) = (0 == (b & (1 << (7 - i)))) ? 0xc0 : 0xf8;
}
}
}
void hal_entry(void)
{
/* TODO: add your own code here */
ws2812Init();
while(1)
{
clear();
for(uint8_t i = 0; i < NUMPIXELS; i++)
{
setPixelColor(i, 0, 0, i + 4);
show();
R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
}
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
mcu
+关注
关注
146文章
16210浏览量
345498 -
ARM
+关注
关注
134文章
8737浏览量
363319 -
开发板
+关注
关注
25文章
4601浏览量
95112 -
瑞萨电子
+关注
关注
37文章
2766浏览量
71862
发布评论请先 登录
相关推荐
51单片机STC8H8K64U通过RA8889/RA8876如何控制彩屏(SPI源码下载)
In(接RA8889的SDI)
sbit SPI_SCK= P2 ^ 4; // Serial Clock
sbit SPI_RST= P2
发表于 06-26 14:13
第五讲:51单片机+RA8889驱动控制彩屏 完整源码说明 【 源码v1.2 】
输出文件大,单片机的FLASH需要选择更大容量,SRAM也需要更大容量,方可运行开所有演示代码。
我们在STC89C516RD+、STC12C5A60S2等单片机上均已测试通过。
实际演示效果:
*源码下载:STC89C52_RA888
发表于 06-13 17:23
基于瑞萨RA2E1 MCU芯片的蓝牙平衡小车设计
本项目由瑞萨RA2E1 MCU芯片作为主控,搭载电源模块、MPU6050模块、超声波模块、OLED模块、蓝牙模块、电机模块等组成的蓝牙平衡小车。该小车有平衡模式、跟随模式和避障模式三种运行模式。
![基于瑞萨<b class='flag-5'>RA2E1</b> MCU芯片的蓝牙平衡小车设计](https://file1.elecfans.com/web2/M00/BB/5C/wKgZomWbd5uAOHSLAAB2BgnsUEA787.png)
如何使用M0516驱动TM1812通过SPI驱动TM1812
: Nutiny-EVB-M051_V3.0
本样本代码使用M0516将TM1812通过SPI0的MOSI驱动到光 RGB-LED条。
您可以在下列时间下载样本代码http://www.nuvoton.com/resource
发表于 08-29 06:46
如何使用M0516通过SPI接口驱动DM9051
: Nutiny-EVB-M051_V3.0
本样本代码使用 M051 驱动 DM9051 通过 SPI1 接口实现 uIP/ httpd 函数 。
您可以在下列时间下载样本代码http://www.nuvoton.com/r
发表于 08-23 06:21
使用M0516将TM1812通过SPI0的MOSI驱动到光RGB-LED条
: Nutiny-EVB-M051_V3.0
本样本代码使用M0516将TM1812通过SPI0的MOSI驱动到光 RGB-LED条。
您可以在下列时间下载样本代码http://www.nuvoton.com/resource
发表于 08-22 06:23
评论