好学天上 发表于 2024-8-5 17:30:06

梁工 发表于 2024-8-5 16:12
时序明显不对,发数据位0时全部是高电平,这是不对的。
数据0:高电平0.9us,低电平大于等于0.35us。
数 ...

按照这个要几个nop函数呀,我看百度说12MHZ一个nop()是1微秒,可是我要延时零点几微秒叻

好学天上 发表于 2024-8-5 17:35:45

梁工 发表于 2024-8-5 16:12
时序明显不对,发数据位0时全部是高电平,这是不对的。
数据0:高电平0.9us,低电平大于等于0.35us。
数 ...

void send_L(void)
{
       WS2812=0;
       _nop_();
       _nop_();
       WS2812=1;
                        _nop_();
                        _nop_();
                        _nop_();

                        _nop_();
                        _nop_();
                        _nop_();
       WS2812=0;
}
void send_H(void)
{
       WS2812=0;
       _nop_();
       _nop_();
       _nop_();
             _nop_();
       _nop_();

       WS2812=1;
                        _nop_();
                        _nop_();
                        _nop_();               
       WS2812=0;
}
void rest(void)
{
       WS2812=0;
       _nop_();
       _nop_();
       _nop_();
             _nop_();
       _nop_();
       _nop_();       
       WS2812=0;
}
void send_one_byte(unsigned char in_data)
{
          unsigned char temp1=0;
                unsigned char temp2=0;
                unsigned char temp3=0;
                unsigned char i=0;
           temp1=in_data;
          for(i=0;i<8;i++)//八位,循环八次
                        {
                                if(temp1&0x01)
                                        send_H();
                                else
                                        send_L();
                                temp1 >>= 1;//从最低位到最高位
                        }
}

void set_one_led(unsigned char R_data,unsigned char G_data,unsigned char B_data)
{
send_one_byte(R_data);
        send_one_byte(G_data);
        send_one_byte(B_data);
}

void WS2812_Write(void)

{
      unsigned int i;
      WS2812_Reset();
      i=0;

      while(1)
      {
                if(i==LED_ON)
                {
                        set_one_led(RED,GREEN,BLUE);
                        break;

                }
                else
                {
                        set_one_led(0,0,0);
                        i++;
                }
      }
}
这样写还是不行,还是全亮{:4_184:}

梁工 发表于 2024-8-5 17:51:57

好学天上 发表于 2024-8-5 17:35
这样写还是不行,还是全亮
你H和L反了,并且时间也不对。还不知道STC是单周期的?一个NOP是一个时钟。如此简单的时序:
对于12MHz,发数据1:
DIN = 1;
10个NOP;
DIN=0;
3个NOP;

对于12MHz,发数据0:
DIN = 1;
3个NOP;
DIN=0;
10个NOP

好学天上 发表于 2024-8-5 18:22:57

本帖最后由 好学天上 于 2024-8-5 18:25 编辑

梁工 发表于 2024-8-5 17:51
你H和L反了,并且时间也不对。还不知道STC是单周期的?一个NOP是一个时钟。如此简单的时序:
对于12MHz, ...
<ol class="code_ol_R87" style="list-style-position: initial; list-style-image: initial; font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);"><li style="padding-left: 5px; list-style-position: initial; list-style-image: initial; border-left: 1px solid rgb(205, 205, 205) !important;"><div class="blockcode"><blockquote>void send_L(void)
{
       WS2812=1;
                        _nop_();
                        _nop_();
                        _nop_();
       WS2812=0;
                        _nop_();
                        _nop_();
                        _nop_();
        _nop_();
                        _nop_();
                        _nop_();
        _nop_();
        _nop_();
                        _nop_();
                        _nop_();
}
void send_H(void)
{
          WS2812=1;
                        _nop_();
                        _nop_();
                        _nop_();
                _nop_();
                        _nop_();
                        _nop_();
        _nop_();
                        _nop_();
                        _nop_();
        _nop_();
       WS2812=0;
                        _nop_();
                        _nop_();
                        _nop_();
}void send_one_byte(unsigned char in_data)
{
          unsigned char temp1=0;
                unsigned char temp2=0;
                unsigned char temp3=0;
                unsigned char i=0;
           temp1=in_data;
          for(i=0;i<8;i++)//八位,循环八次
                        {
                                if(temp1&0x01)
                                        send_H();
                                else
                                        send_L();
                                temp1 >>= 1;//从最低位到最高位
                        }
}

void set_one_led(unsigned char R_data,unsigned char G_data,unsigned char B_data)
{
send_one_byte(R_data);
        send_one_byte(G_data);
        send_one_byte(B_data);
}

void WS2812_Write(void)

{
      unsigned int i;
      WS2812_Reset();
      i=0;

      while(1)
      {
                if(i==LED_ON)
                {
                        set_one_led(RED,GREEN,BLUE);
                        break;

                }
                else
                {
                        set_one_led(0,0,0);
                        i++;
                }
      }
}

void Init(void)
{
            P5M0 = 0x10;
                                                P5M1 = 0x00;

}

void main(void)
{
      Init();
                                WS2812_Reset();
      while(1)
      {
                                       

//                RED=255;      //红 0~255
//                GREEN=0;      //绿 0~255
//                BLUE=0;      //蓝 0~255
          set_one_led(0,255,255);
                                        set_one_led(0,0,0);
                                        WS2812_Reset();
      }
}void WS2812_Reset(void)
{
      WS2812=0;
      Delay_x10us(10);
}这样还是不行

好学天上 发表于 2024-8-5 19:12:53

梁工 发表于 2024-8-5 17:51
你H和L反了,并且时间也不对。还不知道STC是单周期的?一个NOP是一个时钟。如此简单的时序:
对于12MHz, ...

真的想不通{:4_184:}在下愚钝

梁工 发表于 2024-8-5 22:42:03

好学天上 发表于 2024-8-5 19:12
真的想不通在下愚钝

仔细看下W2812的手册,MSB先发的哦。
示波器看下波形正常没有。

好学天上 发表于 2024-8-6 14:22:18

梁工 发表于 2024-8-5 22:42
仔细看下W2812的手册,MSB先发的哦。
示波器看下波形正常没有。

梁工,我这个Din接的P54然后不管怎么调波形就很奇怪,然后用测了P33脚的波形就是正常的。是P54要特别设置一下吗

梁工 发表于 2024-8-6 15:44:59

好学天上 发表于 2024-8-6 14:22
梁工,我这个Din接的P54然后不管怎么调波形就很奇怪,然后用测了P33脚的波形就是正常的。是P54要特别设置 ...

用哪个脚都要设置为推挽输出。输出波形都是你的程序生成的,不会怪怪的。

ka1265 发表于 2024-8-9 21:34:58

{:4_174:}

nibinxiaoyang 发表于 2024-8-13 12:30:55

请问,大家有遇到直接下载程序烧录,灯全部亮,然后跑马是啥问题?也在跑马,但是其余的灯全部是亮白色
页: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18
查看完整版本: SPI-DMA输出控制WS2812三基色彩灯程序@8H系列/32G系列,不加反相器, CPU休息