eew_cT3H5d 发表于 2024-7-19 08:37

【瑞萨RA8D1评测】第四篇:SPI驱动ws2812全彩LED

<div class='showpostmsg'> 本帖最后由 eew_cT3H5d 于 2024-7-23 23:58 编辑

<p>先看效果:</p>

<div></div>

<div>&nbsp;</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>&nbsp;</p>

<p>它能显示RGB三原色组合成的颜色显示灯,封装为5050,有四个引脚,分别是VCC、VSS、DIN、DOUT . 它的控制协议非常简单,通过一根信号线就可以进行串行异步信号发送&nbsp;</p>

<div><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/113612c7b7bsvbpcp4rqwl.png" style="width: 600px; height: 184px;" /></div>

<p>&nbsp;&nbsp;&nbsp;</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,字节的高位在前&nbsp;</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>&nbsp;</p>

<div>&nbsp;</div>

<p>&nbsp;<br />
WS2812驱动芯片采用单线归零码的通讯方式,芯片在上电复位以后,DIN端接收从控制器传输过来的数据。首先送过来的24 bit数据被第一个芯片提取后,送到芯片内部的数据锁存器。剩余的数据经过内部整形处理电路整形放大后,通过DO端口开始转发输入给下一个级联的芯片,每经过一个芯片的传输,信号减少24 bit。芯片采用自动整形转发技术,使得该芯片的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。</p>

<p>&nbsp;</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>&nbsp;</p>

<div>&nbsp;</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>&nbsp;</p>

<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202312/16/114008mptb6pklpxzkmi6b.png" style="width: 600px; height: 326px;" /></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="color:#c0392b;"><span style="font-size:18px;"><span style="background-color:#f1c40f;">瑞萨RA8D1通过SPI总线控制ws2812</span></span></span></p>

<p>&nbsp;</p>

<p>第一步:在上一个工程继续添加SPI驱动模块</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>配置SPI通道,通过配置通道3可以直接将SPI引脚P309、P311、P310这样直接通过开发板的引出排针引脚直接接入ws2812</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>经查询将SPI的配置速度设为7.5M,相关时钟可以为60Mhz或者120Mhz</p>

<p> &nbsp;</p>

<p>配置系统时钟,采用内部时钟,相关时钟配置120Mhz</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>第二步:添加ws2812底层驱动库</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>ws2812.c文件</p>

<pre>
<code>/*
* ws2812.c
*
*Created on: 2023年10月31日
*      Author: Administrator
*/

#include &lt;WS2812/ws2812.h&gt;
#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 = &amp;gWs2812bDat_SPI;
    uint8_t *pG = &amp;gWs2812bDat_SPI;
    uint8_t *pB = &amp;gWs2812bDat_SPI;

    for(uint8_t i = 0; i &lt;8; i++) {
      if(g &amp; 0x80) {
            *pG = CODE_1;
      }
      else {
            *pG = CODE_0;
      }
      if(r &amp; 0x80) {
            *pR = CODE_1;
      }
      else {
            *pR = CODE_0;
      }
      if(b &amp; 0x80) {
            *pB = CODE_1;
      }
      else {
            *pB = CODE_0;
      }
      r &lt;&lt;= 1;
      g &lt;&lt;= 1;
      b &lt;&lt;= 1;
      pR++;
      pG++;
      pB++;
    }
}
void WS2812B_Task(void)
{
    uint8_t dat = 0;
    for(int i=0;i&lt;88;i++)
    {
      gWs2812bDat_SPI=0;

    }
    //将gWs2812bDat数据解析成SPI数据
    for(uint8_t iLED = 0; iLED &lt; 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(&amp;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(&amp;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 &lt;stdint.h&gt;

//            编码 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> &nbsp;</p>

<p>&nbsp;</p>

<p>第三步:进行编译程序</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>第四步:程序运行效果:成功点亮ws2812全彩LED,SPI驱动一次性成功</p>

<div style="text-align: left;"></div>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>视频演示:</p>

<p>872201510cb5894e252e27f17966a875<br />
&nbsp;</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>&nbsp;</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>

okhxyyo 发表于 2024-7-24 10:27

<p>看着真不错呀这个!!!这个灯是真好看</p>

eric_wang 发表于 2024-7-24 10:27

<p>效果很炫<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan79.gif" width="52" /></p>

Maker_kun 发表于 2024-7-24 11:46

<p>干货满满,显示效果拉满</p>

lugl4313820 发表于 2024-7-24 16:43

<p>确实是一个学习的好教程。结果ADC采集,可以玩出新花样。</p>

eew_cT3H5d 发表于 2024-7-24 23:26

okhxyyo 发表于 2024-7-24 10:27
看着真不错呀这个!!!这个灯是真好看

<p>加个漂亮灯罩就可以当作床头灯了</p>

eew_cT3H5d 发表于 2024-7-24 23:32

lugl4313820 发表于 2024-7-24 16:43
确实是一个学习的好教程。结果ADC采集,可以玩出新花样。

<p>ADC采样声音吗?随音乐节奏变换显示不同颜色</p>

eew_cT3H5d 发表于 2024-7-24 23:33

Maker_kun 发表于 2024-7-24 11:46
干货满满,显示效果拉满

<p>WS2812显示一致性还是非常不错的</p>

eew_cT3H5d 发表于 2024-7-24 23:35

eric_wang 发表于 2024-7-24 10:27
效果很炫

<p>WS2812可玩性太高了,显示效果很好</p>

秦天qintian0303 发表于 2024-7-26 13:46

<p>WS2812B扽时序得间隔怎么控制?&nbsp;&nbsp;</p>

se7ens 发表于 2024-7-26 18:07

<p>谢谢分享,WS2812的原理讲解得很清晰</p>

<p>逻辑分析仪都用上了,高大上啊</p>

<p>另外,为啥用SPI协议来驱动WS2812模块呢,不是只需要一个控制信号DIN就可以了吗</p>

eew_cT3H5d 发表于 2024-7-29 13:56

se7ens 发表于 2024-7-26 18:07
谢谢分享,WS2812的原理讲解得很清晰

逻辑分析仪都用上了,高大上啊

另外,为啥用SPI协议来驱动WS281 ...

<p>是的,需要一根数据线就可以控制了</p>

eew_cT3H5d 发表于 2024-7-29 13:58

秦天qintian0303 发表于 2024-7-26 13:46
WS2812B扽时序得间隔怎么控制?&nbsp;&nbsp;

<p>每个灯的间隔数据时间吗?</p>

jobszheng5 发表于 2024-7-29 14:31

<p>太棒了。</p>

<p>这效果看来酷酷的</p>
页: [1]
查看完整版本: 【瑞萨RA8D1评测】第四篇:SPI驱动ws2812全彩LED