实现 WS2812 Like 接口
解码WS2812 协议为24位并行输出感谢,楼主有没有ws2812的驱动库呢 本帖最后由 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}
} 74LS595,楼主看看. apple_eat 发表于 2020-6-10 15:26
74LS595,楼主看看.
了解;单线有单线的好处 这是将串行转并行了? 谢谢,汇编我已经看不懂了 3.3V的STM32能驱吗,看资料WS2811需要高电平3.5V以上才能驱动,后面用个光耦做电平转换,发现速度跟不上,请教有什么方案可以实现高速电平转换吗? jaky80000 发表于 2020-11-1 15:38
3.3V的STM32能驱吗,看资料WS2811需要高电平3.5V以上才能驱动,后面用个光耦做电平转换,发现速度跟不上, ...
三极管啊,最简单了。
而且2811这种电路,只需要搞定第一个的,后面的芯片输出靠前一个。 18161319737 发表于 2020-11-1 16:10
三极管啊,最简单了。
而且2811这种电路,只需要搞定第一个的,后面的芯片输出靠前一个。 ...
三极管速度够吗,我用了2个9014,发现前级给的波形是方波,三极管出来的压根就不是波形了 jaky80000 发表于 2020-11-1 16:21
三极管速度够吗,我用了2个9014,发现前级给的波形是方波,三极管出来的压根就不是波形了 ...
一个肯定不够啊,搭配起来比较麻烦
你还是74LVC1G17之类的管子吧,足够简单 jaky80000 发表于 2020-11-1 15:38
3.3V的STM32能驱吗,看资料WS2811需要高电平3.5V以上才能驱动,后面用个光耦做电平转换,发现速度跟不上, ...
3.3V得实际也可以用,不放心可以用个74LVC1T45,一二百Mbps用到800k上不要太给力。 好东东呀
页:
[1]