导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【XR806开发板试用】简单点灯-- 基于SPI控制W2812矩阵幻彩动图和字幕显示系统

    Wireless & Analog Series
    1
    1
    1013
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • q1215200171
      budbool LV 9 最后由 q1215200171 编辑

      1.效果展示

      1.gif 动图展示
      1251591329-61d6537f381e3.gif

      2.字幕展示
      120016782-61d6545593c8b.gif

      2.软件开发流程

      2.1 全志XR806 基本开发流程
      使用指南

      自己踩过的坑
      10740446-61d65563839c8.jpg
      必须app开头
      鸿蒙hb 依赖python 环境。建议使用conda虚拟环境
      1147350721-61d655ddd4bad.jpg
      下载开启硬件校验和烧录重启

      2.2 W2812 简单介绍
      不是科普文,自行百度
      `/*WS2812B Timing sequence

      ________
        |        |       T0L         |
      

      0 code |<------>|<-------------->|

      |  T0H   |________________|
         
         
          ___________
         |           |       T1L      |
      

      1 code |<--------->|<--------- -->|

      |  T1H      |______________|
      

      RET code

      |         Treset                |
      |<------------------------->|
      |___________________________|
      

      Data transefer time:
      T0H 0 code ,high voltage time 0.4us ±150ns
      T1H 1 code ,high voltage time 0.8us ±150ns
      T0L 0 code , low voltage time 0.85us ±150ns
      T1L 1 code ,low voltage time 0.45us ±150ns
      RES low voltage time Above 50us

      */`

      硬件驱动
      供电 5V
      驱动电平 gpio口3.3v 需要加一些简单的转换电路到5v
      驱动时序 这里使用SPI 驱动 支持DMA搬运
      893036144-61d656d82f3f7.jpg
      PB04 SPIO_MOSI 引脚
      1457282413-61d6577e7fd9b.jpg

      2.3 软件框架

      2.3.1 UDP
      1.联网获取IP
      使用 wlan_demo 中 例子 wifi_device_connect_test

      2.绑定端口

      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");
      }
      }
      

      3.注册接收回调

      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->len, 42); 
      uint32_t cur_pos;
      if(UDP_RECV_LED_BUFF_LEN==buf_len){
          #if 1
          for(u32_t i = 0;i < 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);
      }
      

      4.提取UDP数据
      pbuf_copy_partial(p, udp_recv_date, p->len, 42);
      这里偏移了42。包含了一些UDP通信的信息。

      2.3.2 SPI 驱动
      1.SPI初始化 这里使用6M的速率

      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, &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, &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");
      }
      

      2.数据发送
      HAL_SPI_Transmit
      这里有坑:SPI驱动第一次数据第一个自己前2位。波形离谱。这里通过多发一个字节0x00.避免过去。

      点阵屏

      点阵屏灯排布
      3846440465-61d6598ac4494.jpg
      这里需要根据自己的走向修改程序。

      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&&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;
      }
      }
      

      把2812控制数据变化成SPI数据

      static void led_data_to_ws2812(uint8_t val, uint8_t* dst)
      {
      
      int i = 7;
      
      for (i = 7; i >= 0; i--)
      {
          if ((val >> i) & 0x01)
          {
              *(dst++) = 0xfc;
          }
          else
          {
              *(dst++) = 0xc0;
          }
      }
      }
      

      系统简介

      本系统实现了,使用python 控制 wifi蓝牙 2812点阵板子控制。可以实现大数据传输,实时仿真控制,暂时很好效果。

      开源 百度网盘大家自行下载测试

      922446544-61d65abe74730.jpg

      链接:https://pan.baidu.com/s/1b3u0MtCrWUPOOnkjKskyQw
      提取码:6666

      文章转自极术社区:https://aijishu.com/a/1060000000291763
      作者:甴尐

      1 条回复 最后回复 回复 引用 分享 0
      • Deleted by  q1215200171 q1215200171 
      • Restored by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策