【瑞萨RA8D1评测】第四篇:SPI驱动ws2812全彩LED
<div class='showpostmsg'> 本帖最后由 eew_cT3H5d 于 2024-7-23 23:58 编辑<p>先看效果:</p>
<div></div>
<div> </div>
<p>WS2812B-5050是一个集控制电路与发光电路于一体的智能外控LED光源;其外型采用最新的molding封装工艺,将IC与发光芯片封装在一个5050的封装尺寸中,每个元件即为一个像素点;像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。</p>
<div><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113321vmncxtdezeqj8qf0.png" style="width: 300px; height: 291px;" /></div>
<p> </p>
<p>它能显示RGB三原色组合成的颜色显示灯,封装为5050,有四个引脚,分别是VCC、VSS、DIN、DOUT . 它的控制协议非常简单,通过一根信号线就可以进行串行异步信号发送 </p>
<div><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113612c7b7bsvbpcp4rqwl.png" style="width: 600px; height: 184px;" /></div>
<p> </p>
<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113639l7ga7r5faaljohsh.png" style="width: 600px; height: 279px;" /></p>
<div><br />
WS2812的级联控制协议是非常简单的。在串行通讯中使用不同高低电平脉冲表示数据0,1编码。通过发送三组24bit的编码,可以控制三个级联的WS2812灯的颜色。每组24bit对应的GRB编码如下所示。发送颜色顺序为GRB,字节的高位在前 </div>
<div><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113828mdxkhvx1aqcqk6h2.png" style="width: 300px; height: 190px;" /></div>
<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113730qz4otv4g4ngppb4p.png" style="width: 600px; height: 188px;" /></p>
<p> </p>
<div> </div>
<p> <br />
WS2812驱动芯片采用单线归零码的通讯方式,芯片在上电复位以后,DIN端接收从控制器传输过来的数据。首先送过来的24 bit数据被第一个芯片提取后,送到芯片内部的数据锁存器。剩余的数据经过内部整形处理电路整形放大后,通过DO端口开始转发输入给下一个级联的芯片,每经过一个芯片的传输,信号减少24 bit。芯片采用自动整形转发技术,使得该芯片的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。</p>
<p> </p>
<p>驱动波形逻辑分析仪测试:</p>
<div><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/115132yt8fkvxymvyn2278.png" style="width: 300px; height: 276px;" /></div>
<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/114604l9gczxc66688ggkm.png" style="width: 300px; height: 158px;" /></p>
<p> </p>
<div> </div>
<p>逻辑分析仪波形显示:</p>
<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113946oifito37nixsoxq4.png" style="width: 600px; height: 326px;" /></p>
<p> </p>
<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/114008mptb6pklpxzkmi6b.png" style="width: 600px; height: 326px;" /></p>
<p> </p>
<p> </p>
<p><span style="color:#c0392b;"><span style="font-size:18px;"><span style="background-color:#f1c40f;">瑞萨RA8D1通过SPI总线控制ws2812</span></span></span></p>
<p> </p>
<p>第一步:在上一个工程继续添加SPI驱动模块</p>
<p> </p>
<p> </p>
<p>配置SPI通道,通过配置通道3可以直接将SPI引脚P309、P311、P310这样直接通过开发板的引出排针引脚直接接入ws2812</p>
<p> </p>
<p> </p>
<p>经查询将SPI的配置速度设为7.5M,相关时钟可以为60Mhz或者120Mhz</p>
<p> </p>
<p>配置系统时钟,采用内部时钟,相关时钟配置120Mhz</p>
<p> </p>
<p> </p>
<p>第二步:添加ws2812底层驱动库</p>
<p> </p>
<p> </p>
<p>ws2812.c文件</p>
<pre>
<code>/*
* ws2812.c
*
*Created on: 2023年10月31日
* Author: Administrator
*/
#include <WS2812/ws2812.h>
#include "hal_data.h"
extern fsp_err_t err ;
extern volatile bool g_transfer_complete ;
//灯条显存SPI数据缓存
uint8_t gWs2812bDat_SPI = {0};
//灯条显存
tWs2812bCache_TypeDef gWs2812bDat = {
//R G B
0XFF, 0X00, 0X00, //0
0X00, 0XFF, 0X00, //1
0X00, 0X00, 0XFF, //2
0X00, 0XFF, 0XFF, //3
0XFF, 0X00, 0XFF, //4
0XFF, 0XFF, 0X00, //5
0XFF, 0XFF, 0XFF, //6
0X00, 0X00, 0X00, //7
};
void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b)
{
uint8_t *pR = &gWs2812bDat_SPI;
uint8_t *pG = &gWs2812bDat_SPI;
uint8_t *pB = &gWs2812bDat_SPI;
for(uint8_t i = 0; i <8; i++) {
if(g & 0x80) {
*pG = CODE_1;
}
else {
*pG = CODE_0;
}
if(r & 0x80) {
*pR = CODE_1;
}
else {
*pR = CODE_0;
}
if(b & 0x80) {
*pB = CODE_1;
}
else {
*pB = CODE_0;
}
r <<= 1;
g <<= 1;
b <<= 1;
pR++;
pG++;
pB++;
}
}
void WS2812B_Task(void)
{
uint8_t dat = 0;
for(int i=0;i<88;i++)
{
gWs2812bDat_SPI=0;
}
//将gWs2812bDat数据解析成SPI数据
for(uint8_t iLED = 0; iLED < WS2812B_AMOUNT; iLED++)
{
WS2812b_Set(iLED, gWs2812bDat.R, gWs2812bDat.G, gWs2812bDat.B);
}
//总线输出数据
/* Send the reset command */
g_transfer_complete = false;
err = R_SCI_B_SPI_Write(&g_sci_spi3_ctrl, gWs2812bDat_SPI, sizeof(gWs2812bDat_SPI), SPI_BIT_WIDTH_8_BITS);
assert(FSP_SUCCESS == err);
/* Wait for SPI_EVENT_TRANSFER_COMPLETE callback event. */
while (g_transfer_complete==false)
{
;
}
// //使总线输出低电平
// g_transfer_complete = false;
// err = R_SCI_SPI_Write(&g_spi0_ctrl, dat, 1, SPI_BIT_WIDTH_8_BITS);
// assert(FSP_SUCCESS == err);
// /* Wait for SPI_EVENT_TRANSFER_COMPLETE callback event. */
// while (g_transfer_complete==false)
// {
// ;
// }
//帧信号:一个大于50us的低电平
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
}
</code></pre>
<p>ws2812.h文件</p>
<pre>
<code>/*
* ws2812.h
*
*Created on: 2023年10月31日
* Author: Administrator
*/
#ifndef _WS2812_H_
#define _WS2812_H_
#include <stdint.h>
// 编码 0 : 11000000
#define CODE_0 0xc0
// 编码 1 : 11111000
#define CODE_1 0xF8
/*ws2812b灯珠数量*/
#define WS2812B_AMOUNT 8
typedef struct
{
uint8_t R;
uint8_t G;
uint8_t B;
} tWs2812bCache_TypeDef;
extern tWs2812bCache_TypeDef gWs2812bDat;
void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b);
void WS2812B_Task(void);
#endif /* WS2812_H_ */
</code></pre>
<p>这个是主程序运行代码,让ws2812显示不同颜色</p>
<p> </p>
<p> </p>
<p>第三步:进行编译程序</p>
<p> </p>
<p> </p>
<p>第四步:程序运行效果:成功点亮ws2812全彩LED,SPI驱动一次性成功</p>
<div style="text-align: left;"></div>
<p> </p>
<p> </p>
<p>视频演示:</p>
<p>872201510cb5894e252e27f17966a875<br />
</p>
<p>参考来源:</p>
<p>1.<a href="https://blog.csdn.net/qq_24312945/article/details/134152211" target="_blank">https://blog.csdn.net/qq_24312945/article/details/134152211</a></p>
<p>2.<a href="https://bbs.eeworld.com.cn/thread-1267092-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1267092-1-1.html</a></p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>看着真不错呀这个!!!这个灯是真好看</p>
<p>效果很炫<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan79.gif" width="52" /></p>
<p>干货满满,显示效果拉满</p>
<p>确实是一个学习的好教程。结果ADC采集,可以玩出新花样。</p>
okhxyyo 发表于 2024-7-24 10:27
看着真不错呀这个!!!这个灯是真好看
<p>加个漂亮灯罩就可以当作床头灯了</p>
lugl4313820 发表于 2024-7-24 16:43
确实是一个学习的好教程。结果ADC采集,可以玩出新花样。
<p>ADC采样声音吗?随音乐节奏变换显示不同颜色</p>
Maker_kun 发表于 2024-7-24 11:46
干货满满,显示效果拉满
<p>WS2812显示一致性还是非常不错的</p>
eric_wang 发表于 2024-7-24 10:27
效果很炫
<p>WS2812可玩性太高了,显示效果很好</p>
<p>WS2812B扽时序得间隔怎么控制? </p>
<p>谢谢分享,WS2812的原理讲解得很清晰</p>
<p>逻辑分析仪都用上了,高大上啊</p>
<p>另外,为啥用SPI协议来驱动WS2812模块呢,不是只需要一个控制信号DIN就可以了吗</p>
se7ens 发表于 2024-7-26 18:07
谢谢分享,WS2812的原理讲解得很清晰
逻辑分析仪都用上了,高大上啊
另外,为啥用SPI协议来驱动WS281 ...
<p>是的,需要一根数据线就可以控制了</p>
秦天qintian0303 发表于 2024-7-26 13:46
WS2812B扽时序得间隔怎么控制?
<p>每个灯的间隔数据时间吗?</p>
<p>太棒了。</p>
<p>这效果看来酷酷的</p>
页:
[1]