能否提供一下WS2812B的程序实例?



  • 能否提供一下WS2812B的程序实例?,还在驱动WS2812的软件实现方式,目前用IO模拟的方式无法实现1us以下的软件延时。



  • 1.经过测试,模拟IO的方式,最小时间间隔只能做到1us。所以这种方式无法实现WS2812的时序要求。
    2.通过普通PWM模拟时序的方式实现灯珠的驱动,配置PWM的工作频率为800k,能够返回时序要求,但是PWM无法设置为单次输出模式,所以也无法实现灯珠的驱动。
    3.通过PMU PWM模拟时序,PWM可以设置为单次输出模式,但最小时间间隔也无法满足驱动时序要求,所以也无法实现灯珠的驱动。
    4.通过SPI模拟时序的方式,实测能够实现WS2812B灯珠的驱动控制

    #include "ws2812B.h"
    #include "driver_pmu_pwm.h"
    #include "driver_pmu.h"
    void ws2812_init(void)
    {
    system_set_port_mux(GPIO_PORT_A, GPIO_BIT_4, PORTA4_FUNC_SSP0_CLK);
    system_set_port_mux(GPIO_PORT_A, GPIO_BIT_6, PORTA6_FUNC_SSP0_DOUT);
    /* working in master mode /
    ssp_init_(8, SSP_FRAME_MOTO, SSP_MASTER_MODE, 6400000, 2, NULL);
    }
    /
    *

    • @brief ws281x模块用到的延时函数
    • @param delay_num :延时数 (示波器测量延时时间 = delay_num * 440ns )
    • @retval None
      /
      void ws281x_delay(unsigned int delay_num)
      {
      while(delay_num--);
      }
      /
      *
    • @brief 根据WS281x芯片时序图编写的发送0码,1码RESET码的函数
    • @param
    • @retval None
      /
      void ws281x_sendLow(void) //发送0码
      {
      ssp_send_byte(0xe0);
      }
      void ws281x_sendHigh(void) //发送1码
      {
      ssp_send_byte(0xf8);
      }
      void ws2811_Reset(void) //发送RESET码
      {
      SET_LOW();
      co_delay_10us(6);
      SET_HIGH();
      SET_LOW();
      }
      /
      *
    • @brief 发送点亮一个灯的数据(即24bit)
    • @param dat:颜色的24位编码
    • @retval None
      */
      void ws281x_sendOne(uint32_t dat)
      {
      uint8_t i;
      unsigned char byte;
      for(i = 24; i > 0; i--)
      {
      byte = ((dat>>i) & 0x01); //位操作,读取dat数据的第i位
      if(byte == 1)
      {
      ws281x_sendHigh();
      }
      else
      {
      ws281x_sendLow();
      }
      }
      }


  • Hi, did you get the leds to work? Can you also include the SET_LOW() and SET_HIGH() functions?
    I think the #include file "ws2812B.h" only has the extern declaration of the functions, right?
    Can you share the complete example?
    Thank you



  • @widdel Of course, send me your email address and I will send you the information via email.


  • Global Moderator

    可以参考一下里面的驱动去实现:https://note.youdao.com/s/4jjYCih3


  • Global Moderator

    @widdel 可以参考一下里面的驱动去实现:https://note.youdao.com/s/4jjYCih3



  • @song where could I get the "board_driver.h" cause dma isn't present in the Default SDK?