WS2812的了时序是通过单总线进行通信的,可以通过SPI或都TIM进行模拟通信。
一个WS2812灯珠是由三个颜色的灯组成,一个灯的颜色由8个bit来进行描述,3个位就是由24bit来定义。
其中一个数据位是由一个1.5us的高低电平来定义,code1 高电平与code0低电平在数据手册有描述如下:
他的时间规定如下:
由此,使用SPI总线的MOSI来模拟就是要使用一个8位来生成1.25us的一帧数据,来实现code1与code0。
在GD32F527中,使用DMA来转输一个字体就摸拟一个code1或者code0
【GD32F527】SPI+DMA实现数据发送-电子产品世界论坛在这一篇帖子中,我成功的使用SPI来输出时序,下面就如何使用逻辑分析仪来调试如何生成我们需要的波形。
1、首先需要调试好8bit转输完成需要在1.25us左右完成。
由于spi1的总线频率是已经固定了,那么我们就通过spi的分频系数来确定总线的频率,通过测试 spi_init_struct.prescale = SPI_PSC_8; 时,使用逻辑分析软件可以得到一个数据位的时间为1.33us。
这样就在整位的时序满足了通信要求。
2、调节发送数据 ,我们首先先调度8个bit为0b1110000或者0b11000这样的方式来使用逻辑分析仪来测量高电平的时间,通过多次的调试,设置
#define WS2812B_BIT_0 0xC0 // 1100 in binary (前2位有效) #define WS2812B_BIT_1 0xF0 // 1111 in binary (前4位有效)
下载到开发板后,通过逻辑分析仪来测量时间:
发送0xF0时,脉宽为0.64us(符合大于0.58us小于1us)
发送0xC0时测得高电平脉宽为0.32us(符合大于等于0.25us小于0.47us)的要求。
到此,成功有调节出了spi模拟ws2812的code1与code0的时序图。通过测试,成能成功的点亮WS2812灯。
【总结】
通过GD32spi来模拟WS2812的时序,首先需要熟读其数据手册,掌握好单总线的时序是如何组成,再次需要用于逻辑分析仪,来多次偿次调试参数。
如果他的时序不对,那莫,虽然可以点亮,但是会出现没有点亮指定灯,或者是颜色值不对。