找回密码
 立即注册
查看: 986|回复: 5

求助:DMA_SPI驱动WS2812B

[复制链接]
  • TA的每日心情
    开心
    2024-1-10 00:38
  • 签到天数: 2 天

    [LV.1]初来乍到

    10

    主题

    21

    回帖

    194

    积分

    注册会员

    积分
    194
    发表于 2022-12-29 23:02:16 | 显示全部楼层 |阅读模式
    芯片:STC8H4K64TLCD
    功能:DMA_SPI模拟WS2812B数据

    MOSI口:P3.4,外接2K下拉电阻

    程序:

    #include<STC8H.H>
    #include<absacc.h>
    #include<stdio.h>
    #include<math.h>
    #include <intrins.h>

    //多次测试得不到想要验收,全部置零,5颗WS2818B驱动的全彩LED。
    unsigned char xdata LED_DATA[120]={0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
                                                            0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
                                                            0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
                                                            0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
                                                            0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,};        
    char *LED=&LED_DATA;
    char (*R)[3]=&RGB;
    int xdata ENSPI=0;    //DMA_SPI开始标志

    /*------------------延时,WS2812B归零---------------*/
    void Delay50us()                //@32MHz
    {
            unsigned char i, j;

            i = 3;
            j = 17;
            do
            {
                    while (--j);
            } while (--i);
    }


    /*------------------------------------------------------
    DMA_SPI输出
    SPIIF SPI中断 用于判断SPI是否完成
    输出完成关闭SPI,P3.4输出低电平
    --------------------------------------------------------*/
    void SPI()
    {
      ENSPI=DMA_SPI_CR;
      ENSPI&=0xC0;
    if(ENSPI==0)
      {
            P34=0;
            Delay50us();               
            DMA_SPI_AMT=119;   //传输168字节。24*5=120字节
            DMA_SPI_TXA=LED_DATA;  //数据起始位。
            SPCTL=0xD7;  //1101 0111  6.使能SPI  5主机模式,4空闲时钟线低电平,3前沿写 2后沿读 1:0主时钟2分频 16Mhz”         
            DMA_SPI_CR=0xC0;    //11000000 开始DMA_SPI
      }
    }
    //DM_SPI中断
    void DMA_SPI_Routine(void)  interrupt 49
    {
    SPCTL=0x00;  //关闭SPI
    P34=0;
    DMA_SPI_CR=0x00; //关闭SPI_DMA
    DMA_SPI_STA=0x00;  //中断标志位清零        
    }



    void main()
    {
    CLKSEL=0;               //内部高速时钟 下载设置25.6MHZ
    EA=1;                     //打开总中断
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x7f;
    P3M0 = 0x10; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;                 
    /*---------------------SPI设置-----------------------------------------*/
    P_SW2|=128;         //1000 0000 允许访问片内SFR  0FA00H~0FFFFH  FB50-FB6F 触摸阈值寄存器        
    P_SW1=12;             //00-- **0- MOSI输出设置P3.4 **=11
    AUXR=0;            //允许访问内部扩展RAM        
    DMA_SPI_CFG2=4;    //00000100 不使用SS脚 SS脚P1.2”
    DMA_SPI_CFG=0xCF;    //1100 1111,允许DMA_SPI中断,允许发送禁止接收数据,中断优先最高 访问级最大

    while(1)
    {        
    SPI();        
    }
    }


    SCLK与MOSI脚波形
    波形.jpg

    DMA_SPI传输时,每两个数据有500ns的时间间隙,间隙期间MOSI为高电平。
    请问:在MOSI脚外部增加三极管反向电路能否行得通。是否有其他办法使得2个数据间隙MOSI为低电平
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-10 00:38
  • 签到天数: 2 天

    [LV.1]初来乍到

    10

    主题

    21

    回帖

    194

    积分

    注册会员

    积分
    194
     楼主| 发表于 2022-12-30 21:41:38 | 显示全部楼层
    外加反向电路,问题解决了,能得到需要的延时了,另外如果外加三极管的话,要注意三极管截止时间问题。另外需要注意归零延时,短了会导致前面几颗LED不亮

    该用户从未签到

    546

    主题

    9104

    回帖

    1万

    积分

    管理员

    积分
    14082
    发表于 2022-12-31 08:01:35 | 显示全部楼层
    MOSI口:P3.4,外接2K下拉电阻===为何 2K 下拉电阻,一般是加10K 上拉,加下拉的目的 ? 非要加 ? 10K ?
  • TA的每日心情
    开心
    2024-1-10 00:38
  • 签到天数: 2 天

    [LV.1]初来乍到

    10

    主题

    21

    回帖

    194

    积分

    注册会员

    积分
    194
     楼主| 发表于 2022-12-31 16:41:15 | 显示全部楼层
    神农鼎 发表于 2022-12-31 08:01
    MOSI口:P3.4,外接2K下拉电阻===为何 2K 下拉电阻,一般是加10K 上拉,加下拉的目的 ? 非要加 ? 10K ? ...

    最初未考虑外部反向电路,WS2812B需要50us以上的低电平才能按接收到的数据点亮LED。下拉的目的是考虑DMA_SPI发送完成,关闭SPI后 P3.4自动输出低电平。思路没错,能点亮LED,但是因为DMA_SPI传输2个字节之间有500ns的间隙,这个时间MOSI是高电平。导致LED不能显示设置的颜色。所以最终是取消这个下拉电阻外加反向电路解决这个问题的。
  • TA的每日心情
    郁闷
    2024-1-23 19:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    16

    回帖

    102

    积分

    注册会员

    积分
    102
    发表于 2023-8-12 17:38:26 | 显示全部楼层
    您好,硬件原理图能给一份嘛
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    546

    主题

    9104

    回帖

    1万

    积分

    管理员

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

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-19 10:54 , Processed in 0.061452 second(s), 51 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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