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

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

  [复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-1-6 13:00:49 | 显示全部楼层
liha*** 发表于 2024-1-6 08:20
学习了,程序里面已改加反相,只是目前好像还没办法用DMA传大量灯的数据,受Xdata大小限制。有点好奇市面上 ...

使用双缓冲可以实现DMA传输间隔不中断,这时候其实灯带就不受限于xdata的大小了。

因为灯带的流动多是程序实时生成或者是数组预存花样,生成的自然算是任意长度都可以。
程序空间存储流水花样的,可以利用双缓冲的时间做数据读取

简单的流程如下
开辟SPI-DMA缓冲区1,2,在xdata
time0: SPI-DMA刷新缓冲区1,从code数组读取数据到SPI-DMA缓冲区2
time1:SPI-DMA缓冲区1完成输出,进入中断。切换缓冲区2,开始输出
time2: SPI-DMA刷新缓冲区2,从code数组读取数据到SPI-DMA缓冲区1
time3:SPI-DMA缓冲区2完成输出,进入中断。切换缓冲区1,开始输出

如此循环可以完成超级长的灯带输出。
这里面可能存在一个小问题。就是不知道读内部flash的速度能不能跟上输出的速度。想来跟不上的话就只能在edata区域做预读了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15611
发表于 2024-1-6 13:19:34 | 显示全部楼层
读 DATA-FLASH, 也可以用 MOVC 来读的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-04-30 10:57:37

17

主题

533

回帖

1326

积分

金牌会员

积分
1326
发表于 2024-1-8 01:46:16 | 显示全部楼层
梁工你好,我下载试用了你的代码,正常工作。 但是看的不是太懂,我想请问下,51有没有可能纯使用IO翻转并且控制延时来模拟时序的1 和 0 。我试了其他的单片机, 单片机IO翻转的速度在50us 根本没办法用

点评

有的,最简单的就是直接IO输出,STC8系列这种1T单片机,都要加延时才行。下面是24MHz主频的程序,超简单: void Send_1us(void) { NOP(16); // 6+16T @24MHz } sbit DIN = P0^0; void Send_byte(u8 color) // 发  详情 回复 发表于 2024-1-8 10:06
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-1-8 10:06:06 | 显示全部楼层
嵌入*** 发表于 2024-1-8 01:46
梁工你好,我下载试用了你的代码,正常工作。 但是看的不是太懂,我想请问下,51有没有可能纯使用IO翻转并 ...

有的,最简单的就是直接IO输出,STC8系列这种1T单片机,都要加延时才行。下面是24MHz主频的程序,超简单:
void        Send_1us(void)
{
        NOP(16);        // 6+16T  @24MHz
}

sbit        DIN = P0^0;
void        Send_byte(u8 color)        // 发送一个字节
{
        u8        i;
        i = 8;
        do
        {
                EA = 0;        //发送时禁止中断
                if((color & 0x80) != 0)                //数据1
                {
                        DIN = 1;
                        Send_1us();
                        DIN = 0;
                        EA = 1;                //发送完一个位数据后允许中断, 但任何中断处理时间要小于RES的50us.
                        NOP(6);                        // 6T @24MHz,
                }
                else                //数据0
                {
                        DIN = 1;
                        NOP(6);                        // 7T @24MHz,
                        DIN = 0;
                        EA = 1;                //发送完一个位数据后允许中断, 但任何中断处理时间要小于RES的50us.
                        Send_1us();
                }
                color <<= 1;
        }
        while(--i != 0);
}

void        Send_GRB(u8 g, u8 r, u8 b)
{
        Send_byte(g);
        Send_byte(r);
        Send_byte(b);
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-04-30 10:57:37

17

主题

533

回帖

1326

积分

金牌会员

积分
1326
发表于 2024-1-8 11:13:59 | 显示全部楼层
梁*** 发表于 2024-1-8 10:06
有的,最简单的就是直接IO输出,STC8系列这种1T单片机,都要加延时才行。下面是24MHz主频的程序,超简单: ...

谢谢你梁工,我烧录下 用逻辑分析仪抓一下看看时序
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15611
发表于 2024-1-9 08:41:58 | 显示全部楼层
SPI方案:
只用到MOSI驱动WS2812,但由于SPI的3个信号是捆绑在一起的,MISO、SCLK不能做它用。本例使用P1.3-MOSI输出驱动信号,用户可以切换到别的脚。
===将 MISO 不做其他用途;
===将 MISO管脚 先设置为对外输出0;
===MOSI 发送完成后,对外停止时输出的是 MISO 读到的状态, 0 ,这 STC-R&D 留了这么个绝活支持 WS2812B !!!
回复 支持 反对

使用道具 举报 送花

0

主题

4

回帖

180

积分

注册会员

积分
180
发表于 2024-1-9 09:55:58 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:396
  • 最近打卡:2025-05-01 16:33:56

6

主题

101

回帖

411

积分

中级会员

积分
411
发表于 2024-1-9 15:12:31 | 显示全部楼层
有空试试
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-30 00:02:52

13

主题

43

回帖

132

积分

注册会员

积分
132
发表于 2024-1-10 04:25:48 | 显示全部楼层
WS2812B-60灯环-SPI-DMA-跑马灯.c(266): error C130: 'interrupt': value out of range  

点评

拓展Keil的C代码中断号 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13 (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)  详情 回复 发表于 2024-1-10 09:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-1-10 09:18:00 | 显示全部楼层
江*** 发表于 2024-1-10 04:25
WS2812B-60灯环-SPI-DMA-跑马灯.c(266): error C130: 'interrupt': value out of range

拓展Keil的C代码中断号
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 21:16 , Processed in 0.132353 second(s), 122 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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