Eworm001 发表于 2020-6-9 23:55:33

实现 WS2812 Like 接口

解码WS2812 协议为24位并行输出





shh6899 发表于 2020-6-10 08:18:57

感谢,楼主有没有ws2812的驱动库呢

Eworm001 发表于 2020-6-10 14:56:10

本帖最后由 Eworm001 于 2020-6-10 14:58 编辑

shh6899 发表于 2020-6-10 08:18
感谢,楼主有没有ws2812的驱动库呢

CX32L003 GPIO 驱动 WS2812

__asm void ws_send_asm(uint32_t *p,uint8_t n,uint32_t *dose)
{
          
    PUSH      {r0-r7,lr}
    MOVS       r3,#0x08            //Pin_3

    STR      r3,       //docl = Pin_3
    MOVS       r4,#221            //tmp
DelayLoop
    NOP
    NOP
    SUBS       r4,r4,#1            //tmp--
    CMP      r4,#0               //tmp==0
    BNE      DelayLoop         //if(tmp!=0) goto DelayLoop

    NOP
    MOVS       r4,#0x00            //bitIdx
    MOVS       r5,#0x00            //byteIdx
    LSLS      R1,#2               //n = n * sizeof(n)
    LDR         r6,          //d
    //reset finished And bit start
START
    STR      r3,             //dose = Pin_3   
    LSLS       r7,r6,#8            //d_0 = d<<8
    LSRS       r7,r7,#31         //d_0>>=31
    CMP      r7,#0x00            //d_0 == 0
    BNE      H_1               //if(d_0 == 0) goto H_1
H_0
    NOP
//   NOP
    B          H_END
H_1
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
H_END
    STR         r3,       //docl = Pin_3
    CMP         r7,#0x00            //d_0 == 0
    BNE         L_1               //if(d_0 == 0) goto L_1
L_0
    NOP
    NOP
    NOP
    NOP
    B            L_END
L_1
    NOP
L_END
    LSLS         r6,r6,#1             //d <<=1
    CMP          r4,#23            //bitIdx == 23
    BNE          B_NEND            //if(bitIdx != 23) goto B_END
B_END
    MOVS         r4,#0               //bitIdx = 0
    ADDS         r5,r5,#4            //byteIdx += sizeof(*p)
    CMP          r5,r1               //byteIdx == n*sizeof(*p)
    BEQ          FRAME_END         //if(==) goto FRAME_END
    LDR             r6,          //d
    B            START               //else goto START
B_NEND
    ADDS         r4,r4,#1            //bitIdx ++
    NOP
    NOP
    B            START
FRAME_END
    //STR          r3,             //dose = Pin_3
    POP          {r0-r7,pc}
}

apple_eat 发表于 2020-6-10 15:26:10

74LS595,楼主看看.

Eworm001 发表于 2020-6-10 15:36:48

apple_eat 发表于 2020-6-10 15:26
74LS595,楼主看看.

了解;单线有单线的好处

huangqi412 发表于 2020-6-10 16:31:33

这是将串行转并行了?

shh6899 发表于 2020-6-10 21:51:15

谢谢,汇编我已经看不懂了

jaky80000 发表于 2020-11-1 15:38:09

3.3V的STM32能驱吗,看资料WS2811需要高电平3.5V以上才能驱动,后面用个光耦做电平转换,发现速度跟不上,请教有什么方案可以实现高速电平转换吗?

18161319737 发表于 2020-11-1 16:10:47

jaky80000 发表于 2020-11-1 15:38
3.3V的STM32能驱吗,看资料WS2811需要高电平3.5V以上才能驱动,后面用个光耦做电平转换,发现速度跟不上, ...

三极管啊,最简单了。
而且2811这种电路,只需要搞定第一个的,后面的芯片输出靠前一个。

jaky80000 发表于 2020-11-1 16:21:50

18161319737 发表于 2020-11-1 16:10
三极管啊,最简单了。
而且2811这种电路,只需要搞定第一个的,后面的芯片输出靠前一个。 ...

三极管速度够吗,我用了2个9014,发现前级给的波形是方波,三极管出来的压根就不是波形了

18161319737 发表于 2020-11-2 00:59:16

jaky80000 发表于 2020-11-1 16:21
三极管速度够吗,我用了2个9014,发现前级给的波形是方波,三极管出来的压根就不是波形了 ...

一个肯定不够啊,搭配起来比较麻烦

你还是74LVC1G17之类的管子吧,足够简单

clesun 发表于 2020-11-2 09:04:46

jaky80000 发表于 2020-11-1 15:38
3.3V的STM32能驱吗,看资料WS2811需要高电平3.5V以上才能驱动,后面用个光耦做电平转换,发现速度跟不上, ...

3.3V得实际也可以用,不放心可以用个74LVC1T45,一二百Mbps用到800k上不要太给力。

zya2008 发表于 2021-5-4 11:16:38

好东东呀
页: [1]
查看完整版本: 实现 WS2812 Like 接口