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

SPI DMA 输出控制WS2812三基色彩灯程序,不加反相器,STC8/STC32

[复制链接]
  • TA的每日心情
    开心
    昨天 07:37
  • 签到天数: 103 天

    [LV.6]常住居民II

    31

    主题

    384

    回帖

    1928

    积分

    荣誉版主

    积分
    1928
    发表于 2024-1-6 13:00:49 | 显示全部楼层
    lihappy 发表于 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区域做预读了。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    9

    主题

    264

    回帖

    917

    积分

    高级会员

    积分
    917
    发表于 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
    自信就会温和,温和就会坚定!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    45

    主题

    2922

    回帖

    6570

    积分

    超级版主

    积分
    6570
     楼主| 发表于 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);
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    9

    主题

    264

    回帖

    917

    积分

    高级会员

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

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 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

    主题

    3

    回帖

    78

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 92 天

    [LV.6]常住居民II

    5

    主题

    72

    回帖

    268

    积分

    中级会员

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

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    回帖

    105

    积分

    注册会员

    积分
    105
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    45

    主题

    2922

    回帖

    6570

    积分

    超级版主

    积分
    6570
     楼主| 发表于 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, 2024-4-29 16:09 , Processed in 0.085510 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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