找回密码
 立即注册
楼主: 梁工

SPI-DMA输出控制WS2812三基色彩灯程序@8H系列/32G系列,不加反相器, CPU休息

  [复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6089

回帖

1万

积分

超级版主

积分
12721
发表于 2024-11-6 09:38:09 | 显示全部楼层
夜*** 发表于 2024-11-6 09:19
想问下这个网站的点灯技术我看他跟您给的四个案例不一样里,没DMA,也不是查询的,也没用那个中断函数,看 ...

就是用的SPI输出数据,将数据按WS2812的时序装载到SPI数据。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-01-11 22:06:31

0

主题

12

回帖

92

积分

注册会员

积分
92
发表于 2024-11-6 13:46:39 | 显示全部楼层
哦这样子,但我没看到要SPI中断函数,看半天,啊哈哈哈,有点尴尬

点评

使用SPI不一定要中断的。  详情 回复 发表于 2024-11-6 14:35
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6089

回帖

1万

积分

超级版主

积分
12721
发表于 2024-11-6 14:35:32 | 显示全部楼层
夜*** 发表于 2024-11-6 13:46
哦这样子,但我没看到要SPI中断函数,看半天,啊哈哈哈,有点尴尬

使用SPI不一定要中断的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-01-11 22:06:31

0

主题

12

回帖

92

积分

注册会员

积分
92
发表于 2024-11-8 14:57:55 | 显示全部楼层
本帖最后由 夜幕_x 于 2024-11-8 15:11 编辑

梁工请教下,我用STC8G1K08A的芯片SPI驱动WS2812的灯带,但是第一次上电运行总是会有一个莫名其妙的的高电平,看芯片手册说P54做普通IO口时会有6.5ms上拉,这种有的解决办法吗
截图202411081458184301.jpg

点评

硬件设计如此,不能更改。 你上电后将此IO设计者为推挽输出0,延时1ms以上,再配置SPI。  详情 回复 发表于 2024-11-8 17:30
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6089

回帖

1万

积分

超级版主

积分
12721
发表于 2024-11-8 17:30:14 | 显示全部楼层
夜*** 发表于 2024-11-8 14:57
梁工请教下,我用STC8G1K08A的芯片SPI驱动WS2812的灯带,但是第一次上电运行总是会有一个莫名其妙的的高电 ...

硬件设计如此,不能更改。
你上电后将此IO设计者为推挽输出0,延时1ms以上,再配置SPI。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-01-11 22:06:31

0

主题

12

回帖

92

积分

注册会员

积分
92
发表于 2024-11-8 19:08:16 | 显示全部楼层
梁*** 发表于 2024-11-8 17:30
硬件设计如此,不能更改。
你上电后将此IO设计者为推挽输出0,延时1ms以上,再配置SPI。 ...

又好像不是P54口的问题,我拿您那个8H的SPI中断发送方案用STC8H8K64U的芯片,MOSI脚用P13脚让灯全灭,只有上电之后才会闪一下绿灯,要命啊,这种bug头发都掉光光咯
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

36

积分

新手上路

积分
36
发表于 2024-11-13 17:55:52 | 显示全部楼层
我通过这一部分代码关不掉ws2812,我打印出来键值发生了改变
  1. void scan()
  2. {
  3.         if(key == 0)
  4.         {
  5.                 delay_ms(1);
  6.                 if(key == 0)
  7.                 {
  8.                         key_flag = (key_flag + 1)%4;
  9.                 }
  10.                 while(!key);
  11.                 delay_ms(1);
  12.         }
  13.         switch(key_flag)
  14.         {
  15.                 case 0:{red_flag = 0;green_flag = 0;blue_flag = 0;Update_Pwm(2,0);}break;
  16.                 case 1:{red_flag = 1;green_flag = 0;blue_flag = 0;Update_Pwm(2,99);}break;
  17.                 case 2:{red_flag = 0;green_flag = 0;blue_flag = 1;Update_Pwm(2,80);}break;
  18.                 case 3:{red_flag = 0;green_flag = 1;blue_flag = 0;Update_Pwm(2,60);}break;
  19.         }
  20. //        if(key_flag == 0)
  21. //        {
  22. //                red_flag = 0;green_flag = 0;blue_flag = 0;Update_Pwm(2,0);
  23. //        }
  24. //        else if(key_flag == 1)
  25. //        {
  26. //                red_flag = 1;green_flag = 0;blue_flag = 0;Update_Pwm(2,99);
  27. //        }
  28. //        else if(key_flag == 2)
  29. //        {
  30. //                red_flag = 0;green_flag = 1;blue_flag = 0;Update_Pwm(2,80);
  31. //        }
  32. //        else if(key_flag == 3)
  33. //        {
  34. //                red_flag = 0;green_flag = 0;blue_flag = 1;Update_Pwm(2,60);
  35. //        }
  36. //        else if(key_flag == 5)
  37. //        {
  38. //                red_flag = 0;green_flag = 0;blue_flag = 0;
  39. //        }
  40. }
  41. /*************** Ö÷º¯Êý *******************************/
  42. void main(void)
  43. {
  44.         P_SW2 |= 0X80;
  45.     P0M0 = 0X00;
  46.     P0M1 = 0X00;
  47.     P2M0 = 0X00;
  48.         P2M1 = 0X00;
  49.     P4M0 = 0X00;
  50.     P4M1 = 0X00;
  51.     P5M0 = 0X00;
  52.     P5M1 = 0X00;
  53.         P1M1 = 0x00;
  54.         P1M0 = 0x00;
  55.         P3M1 = 0x00;
  56.         P3M0 = 0x10;
  57.         P1M1 &= 0xFE;        P1M0 &= 0xFE;          //??P1.0?????(??2?RxD)
  58.         P1M1 &= 0xFD;        P1M0 |= 0x02;          //??P1.1?????(??2?TxD)
  59.         P3M1 &= 0xFE;        P3M0 &= 0xFE;          //??P3.0?????(??1?RxD)
  60.         P3M1 &= 0xFD;        P3M0 |= 0x02;          //??P3.1?????(??1?TxD)
  61.        
  62.         SPI_Config(0, 1);        //SPI³õʼ»¯º¯Êý, ²ÎÊý:         SPI_io: Çл»µ½µÄIO, 0: Çл»µ½P1.2(»òP5.4) P1.3 P1.4 P1.5,  1: Çл»µ½P2.2 P2.3 P2.4 P2.5, 2: Çл»µ½P5.4 P4.0 P4.1 P4.3,  3: Çл»µ½P3.5 P3.4 P3.3 P3.2,
  63.         pwm_init(2);
  64.         uart1_init();
  65.         Uart2_Init();
  66.         EA = 1;
  67.         while (1)
  68.         {
  69.                
  70.                 scan();
  71.                 if(key_flag == 1 || key_flag == 2 || key_flag == 3)
  72.                 {
  73.                         green_huxi();blue_huxi();red_huxi();
  74.                 }
  75.                 uart1_send_byte(key_flag);
  76.         }
  77. }
复制代码

点评

“关不掉ws2812”是啥意思呢? WS2812驱动其实比较简单,只要时序对就可以了,用DMA方式可以节省CPU时间。  详情 回复 发表于 2024-11-13 22:48
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

36

积分

新手上路

积分
36
发表于 2024-11-13 17:56:51 | 显示全部楼层
lwh*** 发表于 2024-11-13 17:55
我通过这一部分代码关不掉ws2812,我打印出来键值发生了改变

这个是使用本文中的查询发送代码
  1.         u16        i,j,k;
  2.         u8        xdata *px;
  3.         px = &led_RGB[0][0];        //ÁÁ¶È(ÑÕÉ«)Ê×µØÖ·
  4.         for(i=0; i<(LED_NUM*3); i++, px++)        *px = 0;        //Çå³ýËùÓеÄÑÕÉ«
  5.         if(red_cnt < 2)
  6.         {
  7.                 red_cnt++;
  8.         }
  9.         if(red_cnt == 2)
  10.         {
  11.                 red_value++;
  12.                 red_cnt = 0;
  13.                 if(red_value == 254)
  14.                 {
  15.                         red_jiang = 1;
  16.                 }
  17.         }               
  18.         led_RGB[0][1] = red_value;        //ºìÉ« Сʱ
  19.         led_RGB[1][1] = red_value;        //ºìÉ« Сʱ
  20.         led_RGB[2][1] = red_value;        //ºìÉ« Сʱ
  21.         led_RGB[3][1] = red_value;        //ºìÉ« Сʱ
  22.         led_RGB[4][1] = red_value;        //ºìÉ« Сʱ
  23.         led_RGB[5][1] = red_value;        //ºìÉ« Сʱ
  24.         led_RGB[6][1] = red_value;        //ºìÉ« Сʱ       
  25.         LoadSPI();        //½«ÑÕÉ«×°ÔØµ½SPIÊý¾Ý
  26.         k = 0;                //
  27.         delay_ms(5);
  28.        
  29.         j = k * 12;                //ÿ´ÎµÄ¿ªÊ¼µØÖ·²»Í¬£¬²úÉúÅÜÂíµÆÐ§¹û£¬ÆäʵÊý¾Ý²»±ä¡£
  30.         for(i=0; i<SPI_NUM; i++)        //SPI·¢ËÍ720×Ö½ÚºÄʱ2.48ms @25.6MHz, 3.44usÒ»¸ö×Ö½Ú¡£
  31.         {
  32.                 SPDAT = led_SPI[j];                //·¢ËÍÒ»¸ö×Ö½Ú
  33.                 if(++j >= SPI_NUM)        j = 0;
  34.                 while((SPSTAT & SPIF) == 0)        ;        //µÈ´ý·¢ËÍÍê³É
  35.                 SPSTAT = SPIF + WCOL;                        //Çå0 SPIFºÍWCOL±êÖ¾
  36.         }
复制代码
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

36

积分

新手上路

积分
36
发表于 2024-11-13 17:57:07 | 显示全部楼层
lwh*** 发表于 2024-11-13 17:56
这个是使用本文中的查询发送代码

请各位大佬,指点一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6089

回帖

1万

积分

超级版主

积分
12721
发表于 2024-11-13 22:48:26 | 显示全部楼层
lwh*** 发表于 2024-11-13 17:55
我通过这一部分代码关不掉ws2812,我打印出来键值发生了改变

“关不掉ws2812”是啥意思呢?
WS2812驱动其实比较简单,只要时序对就可以了,用DMA方式可以节省CPU时间。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 12:44 , Processed in 0.204555 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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