<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[【XR806开发板试用】简单点灯-- 基于SPI控制W2812矩阵幻彩动图和字幕显示系统]]></title><description><![CDATA[<h1>1.效果展示</h1>
<p dir="auto"><strong>1.gif 动图展示</strong><br />
<img src="/assets/uploads/files/1641535992254-1251591329-61d6537f381e3.gif" alt="1251591329-61d6537f381e3.gif" class=" img-responsive img-markdown" width="1280" height="720" /></p>
<p dir="auto"><strong>2.字幕展示</strong><br />
<img src="/assets/uploads/files/1641535998379-120016782-61d6545593c8b.gif" alt="120016782-61d6545593c8b.gif" class=" img-responsive img-markdown" width="720" height="1280" /></p>
<h1>2.软件开发流程</h1>
<p dir="auto"><strong>2.1 全志XR806 基本开发流程</strong><br />
<a href="https://aijishu.com/a/1060000000256653" target="_blank" rel="noopener noreferrer nofollow ugc">使用指南</a></p>
<p dir="auto">自己踩过的坑<br />
<img src="/assets/uploads/files/1641536091138-10740446-61d65563839c8.jpg" alt="10740446-61d65563839c8.jpg" class=" img-responsive img-markdown" width="1175" height="603" /><br />
必须app开头<br />
鸿蒙hb 依赖python 环境。建议使用conda虚拟环境<br />
<img src="/assets/uploads/files/1641536107226-1147350721-61d655ddd4bad.jpg" alt="1147350721-61d655ddd4bad.jpg" class=" img-responsive img-markdown" width="822" height="732" /><br />
下载开启硬件校验和烧录重启</p>
<p dir="auto"><strong>2.2 W2812 简单介绍</strong><br />
不是科普文，自行百度<br />
`/*WS2812B Timing sequence</p>
<pre><code>________
  |        |       T0L         |
</code></pre>
<p dir="auto">0 code |&lt;------&gt;|&lt;--------------&gt;|</p>
<pre><code>|  T0H   |________________|
   
   
    ___________
   |           |       T1L      |
</code></pre>
<p dir="auto">1 code |&lt;---------&gt;|&lt;--------- --&gt;|</p>
<pre><code>|  T1H      |______________|
</code></pre>
<p dir="auto">RET code</p>
<pre><code>|         Treset                |
|&lt;-------------------------&gt;|
|___________________________|
</code></pre>
<p dir="auto">Data transefer time:<br />
T0H 0 code ,high voltage time 0.4us ±150ns<br />
T1H 1 code ,high voltage time 0.8us ±150ns<br />
T0L 0 code , low voltage time 0.85us ±150ns<br />
T1L 1 code ,low voltage time 0.45us ±150ns<br />
RES low voltage time Above 50us</p>
<p dir="auto">*/`</p>
<p dir="auto"><strong>硬件驱动</strong><br />
供电 5V<br />
驱动电平 gpio口3.3v 需要加一些简单的转换电路到5v<br />
驱动时序 这里使用SPI 驱动 支持DMA搬运<br />
<img src="/assets/uploads/files/1641536199968-893036144-61d656d82f3f7.jpg" alt="893036144-61d656d82f3f7.jpg" class=" img-responsive img-markdown" width="630" height="661" /><br />
PB04 SPIO_MOSI 引脚<br />
<img src="/assets/uploads/files/1641536207436-1457282413-61d6577e7fd9b.jpg" alt="1457282413-61d6577e7fd9b.jpg" class=" img-responsive img-markdown" width="1116" height="995" /></p>
<p dir="auto"><strong>2.3 软件框架</strong></p>
<p dir="auto"><strong>2.3.1 UDP</strong><br />
1.联网获取IP<br />
使用 wlan_demo 中 例子 wifi_device_connect_test</p>
<p dir="auto">2.绑定端口</p>
<pre><code>void udp_echoserver_init(void)
{

struct udp_pcb *upcb;
err_t err;
/* Create a new UDP control block  */
upcb = udp_new();
if (upcb)
{
    /* Bind the upcb to the UDP_PORT port */
    /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
    err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
    if (err == ERR_OK)
    {
        /* Set a receive callback for the upcb */
        udp_recv(upcb, udp_server_receive_callback, NULL);
        printf("led udp bind OK \r\n");
    }else    
        printf("led udp bind error \r\n");
}
}
</code></pre>
<p dir="auto">3.注册接收回调</p>
<pre><code>void udp_server_receive_callback(void arg, struct udp_pcb upcb,struct pbuf p, const ip_addr_t addr, u16_t port)
{

printf(" 11 udp receive_callback \r\n");
/* Connect to the remote client */
udp_connect(upcb, addr, port);
/* Tell the client that we have accepted it */
udp_send(upcb, p);
memset(udp_recv_date,0x00,UDP_RECV_DATE_MAX);
uint32_t buf_len = pbuf_copy_partial(p, udp_recv_date, p-&gt;len, 42); 
uint32_t cur_pos;
if(UDP_RECV_LED_BUFF_LEN==buf_len){
    #if 1
    for(u32_t i = 0;i &lt; buf_len;){
        if(i%48==0)printf("\r\n");
        printf("%x-%x-%x ",udp_recv_date[i],udp_recv_date[i+1],udp_recv_date[i+2]);
        if(udp_recv_date[i]!=0)cur_pos = i;
        i+=3;
    }
    printf("\r\n recv data %d,pos=%d  %d,%d\r\n",buf_len,cur_pos,cur_pos/48,(cur_pos%48)/3);
    #endif
    led_spi_update(udp_recv_date);
    //led_spi_update_test();
}
/* free the UDP connection, so we can accept new clients */
udp_disconnect(upcb);
/* Free the p buffer */
pbuf_free(p);
}
</code></pre>
<p dir="auto">4.提取UDP数据<br />
pbuf_copy_partial(p, udp_recv_date, p-&gt;len, 42);<br />
这里偏移了42。包含了一些UDP通信的信息。</p>
<p dir="auto"><strong>2.3.2 SPI 驱动</strong><br />
1.SPI初始化 这里使用6M的速率</p>
<pre><code>void led_spi_init(void)
{

  printf("led_spi_init\r\n");
  IoTGpioInit(GPIO_ID_PA21);                                                    //(3)
  IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT);                                //(4)

uint16_t i = 0;
uint16_t loop_color = 0;
SPI_Global_Config spi_param;

spi_param.cs_level = DEMO_SPI_CS_LEVEL;
spi_param.mclk = DEMO_SPI_MCLK;

HAL_SPI_Init(DEMO_SPI_PORT, &amp;spi_param);


SPI_Config spi_Config;
HAL_Status ret = HAL_OK;

spi_Config.firstBit = SPI_TCTRL_FBS_MSB;
spi_Config.mode = SPI_CTRL_MODE_MASTER;
spi_Config.opMode = SPI_OPERATION_MODE_DMA;
spi_Config.sclk = DEMO_SPI_MCLK;
spi_Config.sclkMode = SPI_SCLK_Mode1;

printf("spi open...\n");
ret = HAL_SPI_Open(DEMO_SPI_PORT, DEMO_SPI_CS, &amp;spi_Config, 5000);
if (ret != HAL_OK) {
    printf("spi open failed");
    return ret;
}
HAL_SPI_Config(DEMO_SPI_PORT, SPI_ATTRIBUTION_IO_MODE, SPI_IO_MODE_NORMAL);
printf("led_spi_init ok.\n");
}
</code></pre>
<p dir="auto">2.数据发送<br />
HAL_SPI_Transmit<br />
这里有坑：SPI驱动第一次数据第一个自己前2位。波形离谱。这里通过多发一个字节0x00.避免过去。</p>
<h1>点阵屏</h1>
<p dir="auto"><strong>点阵屏灯排布</strong><br />
<img src="/assets/uploads/files/1641536375270-3846440465-61d6598ac4494.jpg" alt="3846440465-61d6598ac4494.jpg" class=" img-responsive img-markdown" width="1174" height="928" /><br />
这里需要根据自己的走向修改程序。</p>
<pre><code>void broad_ws2812_set_position(uint8_t w,uint8_t h,uint8_t r,uint8_t g,uint8_t b)
{

uint16_t pos = 0;
pos = w*BROAD_WS2812_STRIP_LED_H;
if(w%2==0){
    pos +=h;
}
else{
    pos +=(BROAD_WS2812_STRIP_LED_H-h-1);
}
if(r==g&amp;&amp;r==b)
{
    led_spi_buff[pos*3+0] = 0;          //
    led_spi_buff[pos*3+1] = 0;
    led_spi_buff[pos*3+2] = 0;
}
else{
    led_spi_buff[pos*3+0] = b/2;          //
    led_spi_buff[pos*3+1] = r/2;
    led_spi_buff[pos*3+2] = g/2;
}
}
</code></pre>
<p dir="auto">把2812控制数据变化成SPI数据</p>
<pre><code>static void led_data_to_ws2812(uint8_t val, uint8_t* dst)
{

int i = 7;

for (i = 7; i &gt;= 0; i--)
{
    if ((val &gt;&gt; i) &amp; 0x01)
    {
        *(dst++) = 0xfc;
    }
    else
    {
        *(dst++) = 0xc0;
    }
}
}
</code></pre>
<h1>系统简介</h1>
<p dir="auto">本系统实现了，使用python 控制 wifi蓝牙 2812点阵板子控制。可以实现大数据传输，实时仿真控制，暂时很好效果。</p>
<h1>开源 百度网盘大家自行下载测试</h1>
<p dir="auto"><img src="/assets/uploads/files/1641536432771-922446544-61d65abe74730.jpg" alt="922446544-61d65abe74730.jpg" class=" img-responsive img-markdown" width="1320" height="359" /></p>
<p dir="auto">链接：<a href="https://pan.baidu.com/s/1b3u0MtCrWUPOOnkjKskyQw" target="_blank" rel="noopener noreferrer nofollow ugc">https://pan.baidu.com/s/1b3u0MtCrWUPOOnkjKskyQw</a><br />
提取码：6666</p>
<p dir="auto"><strong>文章转自极术社区：<a href="https://aijishu.com/a/1060000000291763" target="_blank" rel="noopener noreferrer nofollow ugc">https://aijishu.com/a/1060000000291763</a><br />
作者：甴尐</strong></p>
]]></description><link>https://bbs.aw-ol.com/topic/924/xr806开发板试用-简单点灯-基于spi控制w2812矩阵幻彩动图和字幕显示系统</link><generator>RSS for Node</generator><lastBuildDate>Mon, 11 May 2026 18:34:47 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/924.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Jan 2022 06:20:49 GMT</pubDate><ttl>60</ttl></channel></rss>