OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3091|回复: 7

关于驱动ws2812全彩led灯问题, 一直显示白色

[复制链接]

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2014-5-12
在线时间
35 小时
发表于 2020-6-14 23:29:44 | 显示全部楼层 |阅读模式
5金钱

自己调试WS2812B遇见点小问题,困扰了很久,前来探讨下,若发现bug恳请指正!




ws2812B的驱动时序很清晰明了,我核对了好多遍,应该没问题的了,用6M波特率的SPI +DMA的方式驱动,8位模拟一位0(0xE0)或者1(0xF8)....打印的发送buff也是对的,如下:
E0 E0 E0 E0 E0 E0 E0 E0   
E0 F8 F8 E0 E0 F8 E0 E0   //发送rgb为(0,0x64,0),8个灯,下面7个也同样颜色
E0 E0 E0 E0 E0 E0 E0 E0   


E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0


E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0

E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0


E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0


E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0

E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0

E0 E0 E0 E0 E0 E0 E0 E0
E0 F8 F8 E0 E0 F8 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0


E0 E0 E0 E0 E0 E0 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0   //最后加上50个低电平表示reset
E0 E0 E0 E0 E0 E0 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0
E0 E0 0A


以上驱动思路的实际情况是8个灯全显示的是白色,调用情况如下
  printf("red...\n");
    wsColorCover(100,0,0,2000);  
    printf("green...\n");
    wsColorCover(0,100,0,2000);
    printf("blue...\n");
    wsColorCover(0,0,100,2000);  






void ws28Show(void)
{
  //wsAppendUpdate();
  printf("buff: %s\n",gWs28Ctl_t.BuffSend);
        if (HAL_SPI_GetState(&WS28HSPI) == HAL_SPI_STATE_READY)        // SPI 空闲
        {
                if(HAL_SPI_Transmit_DMA(&WS28HSPI, gWs28Ctl_t.BuffSend, gWs28Ctl_t.BuffLen) == HAL_OK)
                {
                    memset(gWs28Ctl_t.BuffSend,BIT_ZERO,sizeof(gWs28Ctl_t.BuffSend));
      *(gWs28Ctl_t.BuffSend + CORLOR_LEN+ 50) = 0;
                }
        }
}


//发送一个颜色
void Send_8bits(uint8_t dat,uint8_t *buf)
{
  uint8_t i=0;
  
  for (i=0;i<8;i++)
  {
    if((dat & 0x80)==0x80)
    {
      *(buf+i) = BIT_ONE;
    }
    else
    {
      *(buf+i) = BIT_ZERO;
    }
    dat=dat<<1;
  }
}
//用某颜色填充1个像素点
void Send_24bits(uint8_t RData,uint8_t GData,uint8_t BData,uint8_t *bufOneCorlor)
{   
  Send_8bits(GData,bufOneCorlor);  //每个原色需要8个直接表示
  Send_8bits(RData ,bufOneCorlor + 8);
  Send_8bits(BData ,bufOneCorlor + 16);
}
//用某颜色填充所有的像素点
void wsColorCover(uint8_t r, uint8_t g, uint8_t b, uint16_t wait)
{
    uint16_t i=0;
    for( i=0; i<PIXEL_NUM; i++)
    {
      Send_24bits(r,g,b,gWs28Ctl_t.BuffSend + 24*i);//每个像素点需要24字节表示颜色
    }
//    gWs28Ctl_t.Status = READY;
    ws28Show();
    HAL_Delay(wait);
}






C8T6.zip

19.38 KB, 下载次数: 12

最佳答案

查看完整内容[请看2#楼]

问题找到了,全亮的原因是我给的0其实认为是1,因为我给的0的脉冲是500ns,应该再第一点就好了,我把0从发0xe0改成0xb0就可以正常驱动,不会RGB全亮...另外,发送完一段数据后,进行延时也是算作reset的(不用专门再发低电平), 因为没有给大于450ns的脉冲都会认为低电平... 以上的问题解决源于一下的一个csdn的博主, 验证的很好也很完备...值得我们学习! plus,ws2812确实很简单给脉冲就能驱动,但是缺乏准确的datesheel,否则也不会出现 ...
fishing,or drying the net...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2014-5-12
在线时间
35 小时
 楼主| 发表于 2020-6-14 23:29:45 | 显示全部楼层
问题找到了,全亮的原因是我给的0其实认为是1,因为我给的0的脉冲是500ns,应该再第一点就好了,我把0从发0xe0改成0xb0就可以正常驱动,不会RGB全亮...另外,发送完一段数据后,进行延时也是算作reset的(不用专门再发低电平), 因为没有给大于450ns的脉冲都会认为低电平...
以上的问题解决源于一下的一个csdn的博主, 验证的很好也很完备...值得我们学习!

plus,ws2812确实很简单给脉冲就能驱动,但是缺乏准确的datesheel,否则也不会出现时序中脉冲持续时间的乌龙问题出现...

结论
复位信号为50us以上的低电平,复位信号不会熄灭已经点亮的灯珠(假设已经发送了5个红色数据,此时复位,然后又发送2个蓝色数据,那么灯珠点亮的状态为蓝蓝红红红,而不是蓝蓝灭灭灭)
小于0.45us的高电平为逻辑0,大于0.45us的高电平为逻辑1,低电平的时长不要超过复位信号的时长
每位或每字节或每3字节传输完成后建议保持低电平,如果保持高电平且持续时间大于0.45us就会被认为逻辑1,假设下一个传输的数据是0就会出错,因此只建议在完成所有传输后保持高电平
因为每位数据传输完成后是低电平,因此发送下一位数据的时间间隔不要超过50us,否则会被判定为复位信号,因此可以充分利用50us以内的低电平的这段时间做一些比较费时的操作,如读取数据、计算下一个灯珠的颜色等
只有收到完整的24位数据才会点亮一颗灯珠,之后的数据被传送到下一颗灯珠,任意时刻都可以发送复位信号,未传输完成的数据会被丢弃
————————————————
版权声明:本文为CSDN博主「bxgj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013062709/article/details/85217281
fishing,or drying the net...
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3718
金钱
3718
注册时间
2011-5-23
在线时间
2012 小时
发表于 2020-6-15 09:57:00 | 显示全部楼层
先上逻辑分析仪
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2014-5-12
在线时间
35 小时
 楼主| 发表于 2020-6-15 10:05:10 来自手机 | 显示全部楼层
aozima 发表于 2020-6-15 09:57
先上逻辑分析仪

嗯,资金有限,买了个50m的泰克示波器在路上…平时搞搞stm32f1和f4
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3718
金钱
3718
注册时间
2011-5-23
在线时间
2012 小时
发表于 2020-6-15 10:24:09 | 显示全部楼层
淘宝上面几十块钱的都可以满足,预算充足就搞个几百块的,
在这个信号上,几千块的示波器,不如几十块的逻辑分析仪好使。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2014-5-12
在线时间
35 小时
 楼主| 发表于 2020-6-15 10:33:00 来自手机 | 显示全部楼层
aozima 发表于 2020-6-15 10:24
淘宝上面几十块钱的都可以满足,预算充足就搞个几百块的,
在这个信号上,几千块的示波器,不如几十块的逻 ...

好的,我去了解下逻辑分析仪,谢谢
回复

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2014-5-12
在线时间
35 小时
 楼主| 发表于 2020-6-17 22:25:14 | 显示全部楼层
结贴...还是自己动手完成了bug解决
fishing,or drying the net...
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2018-6-5
在线时间
11 小时
发表于 2020-9-3 14:13:30 | 显示全部楼层
牛逼,我也在研究ws2812  想一个主板控制多条rgb灯带,还想做流水
目前还没有什么思路,还在学习阶段。。
大神有没有好的办法?可以指导一下,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 11:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表