梁工
发表于 2024-11-6 09:38:09
夜幕_x 发表于 2024-11-6 09:19
想问下这个网站的点灯技术我看他跟您给的四个案例不一样里,没DMA,也不是查询的,也没用那个中断函数,看 ...
就是用的SPI输出数据,将数据按WS2812的时序装载到SPI数据。
夜幕_x
发表于 2024-11-6 13:46:39
哦这样子,但我没看到要SPI中断函数,看半天,啊哈哈哈,有点尴尬
梁工
发表于 2024-11-6 14:35:32
夜幕_x 发表于 2024-11-6 13:46
哦这样子,但我没看到要SPI中断函数,看半天,啊哈哈哈,有点尴尬
使用SPI不一定要中断的。
夜幕_x
发表于 2024-11-8 14:57:55
本帖最后由 夜幕_x 于 2024-11-8 15:11 编辑
梁工请教下,我用STC8G1K08A的芯片SPI驱动WS2812的灯带,但是第一次上电运行总是会有一个莫名其妙的的高电平,看芯片手册说P54做普通IO口时会有6.5ms上拉,这种有的解决办法吗
梁工
发表于 2024-11-8 17:30:14
夜幕_x 发表于 2024-11-8 14:57
梁工请教下,我用STC8G1K08A的芯片SPI驱动WS2812的灯带,但是第一次上电运行总是会有一个莫名其妙的的高电 ...
硬件设计如此,不能更改。
你上电后将此IO设计者为推挽输出0,延时1ms以上,再配置SPI。
夜幕_x
发表于 2024-11-8 19:08:16
梁工 发表于 2024-11-8 17:30
硬件设计如此,不能更改。
你上电后将此IO设计者为推挽输出0,延时1ms以上,再配置SPI。 ...
又好像不是P54口的问题,我拿您那个8H的SPI中断发送方案用STC8H8K64U的芯片,MOSI脚用P13脚让灯全灭,只有上电之后才会闪一下绿灯,{:4_171:}要命啊,这种bug头发都掉光光咯
lwh13
发表于 2024-11-13 17:55:52
我通过这一部分代码关不掉ws2812,我打印出来键值发生了改变void scan()
{
if(key == 0)
{
delay_ms(1);
if(key == 0)
{
key_flag = (key_flag + 1)%4;
}
while(!key);
delay_ms(1);
}
switch(key_flag)
{
case 0:{red_flag = 0;green_flag = 0;blue_flag = 0;Update_Pwm(2,0);}break;
case 1:{red_flag = 1;green_flag = 0;blue_flag = 0;Update_Pwm(2,99);}break;
case 2:{red_flag = 0;green_flag = 0;blue_flag = 1;Update_Pwm(2,80);}break;
case 3:{red_flag = 0;green_flag = 1;blue_flag = 0;Update_Pwm(2,60);}break;
}
// if(key_flag == 0)
// {
// red_flag = 0;green_flag = 0;blue_flag = 0;Update_Pwm(2,0);
// }
// else if(key_flag == 1)
// {
// red_flag = 1;green_flag = 0;blue_flag = 0;Update_Pwm(2,99);
// }
// else if(key_flag == 2)
// {
// red_flag = 0;green_flag = 1;blue_flag = 0;Update_Pwm(2,80);
// }
// else if(key_flag == 3)
// {
// red_flag = 0;green_flag = 0;blue_flag = 1;Update_Pwm(2,60);
// }
// else if(key_flag == 5)
// {
// red_flag = 0;green_flag = 0;blue_flag = 0;
// }
}
/*************** Ö÷º¯Êý *******************************/
void main(void)
{
P_SW2 |= 0X80;
P0M0 = 0X00;
P0M1 = 0X00;
P2M0 = 0X00;
P2M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
P5M0 = 0X00;
P5M1 = 0X00;
P1M1 = 0x00;
P1M0 = 0x00;
P3M1 = 0x00;
P3M0 = 0x10;
P1M1 &= 0xFE; P1M0 &= 0xFE; //??P1.0?????(??2?RxD)
P1M1 &= 0xFD; P1M0 |= 0x02; //??P1.1?????(??2?TxD)
P3M1 &= 0xFE; P3M0 &= 0xFE; //??P3.0?????(??1?RxD)
P3M1 &= 0xFD; P3M0 |= 0x02; //??P3.1?????(??1?TxD)
SPI_Config(0, 1); //SPI³õʼ»¯º¯Êý, ²ÎÊý: SPI_io: Çл»µ½µÄIO, 0: Çл»µ½P1.2(»òP5.4) P1.3 P1.4 P1.5,1: Çл»µ½P2.2 P2.3 P2.4 P2.5, 2: Çл»µ½P5.4 P4.0 P4.1 P4.3,3: Çл»µ½P3.5 P3.4 P3.3 P3.2,
pwm_init(2);
uart1_init();
Uart2_Init();
EA = 1;
while (1)
{
scan();
if(key_flag == 1 || key_flag == 2 || key_flag == 3)
{
green_huxi();blue_huxi();red_huxi();
}
uart1_send_byte(key_flag);
}
}
lwh13
发表于 2024-11-13 17:56:51
lwh13 发表于 2024-11-13 17:55
我通过这一部分代码关不掉ws2812,我打印出来键值发生了改变
这个是使用本文中的查询发送代码 u16 i,j,k;
u8 xdata *px;
px = &led_RGB; //ÁÁ¶È(ÑÕÉ«)Ê×µØÖ·
for(i=0; i<(LED_NUM*3); i++, px++) *px = 0; //Çå³ýËùÓеÄÑÕÉ«
if(red_cnt < 2)
{
red_cnt++;
}
if(red_cnt == 2)
{
red_value++;
red_cnt = 0;
if(red_value == 254)
{
red_jiang = 1;
}
}
led_RGB = red_value; //ºìÉ« Сʱ
led_RGB = red_value; //ºìÉ« Сʱ
led_RGB = red_value; //ºìÉ« Сʱ
led_RGB = red_value; //ºìÉ« Сʱ
led_RGB = red_value; //ºìÉ« Сʱ
led_RGB = red_value; //ºìÉ« Сʱ
led_RGB = red_value; //ºìÉ« Сʱ
LoadSPI(); //½«ÑÕÉ«×°ÔØµ½SPIÊý¾Ý
k = 0; //
delay_ms(5);
j = k * 12; //ÿ´ÎµÄ¿ªÊ¼µØÖ·²»Í¬£¬²úÉúÅÜÂíµÆÐ§¹û£¬ÆäʵÊý¾Ý²»±ä¡£
for(i=0; i<SPI_NUM; i++) //SPI·¢ËÍ720×Ö½ÚºÄʱ2.48ms @25.6MHz, 3.44usÒ»¸ö×Ö½Ú¡£
{
SPDAT = led_SPI; //·¢ËÍÒ»¸ö×Ö½Ú
if(++j >= SPI_NUM) j = 0;
while((SPSTAT & SPIF) == 0) ; //µÈ´ý·¢ËÍÍê³É
SPSTAT = SPIF + WCOL; //Çå0 SPIFºÍWCOL±êÖ¾
}
lwh13
发表于 2024-11-13 17:57:07
lwh13 发表于 2024-11-13 17:56
这个是使用本文中的查询发送代码
请各位大佬,指点一下
梁工
发表于 2024-11-13 22:48:26
lwh13 发表于 2024-11-13 17:55
我通过这一部分代码关不掉ws2812,我打印出来键值发生了改变
“关不掉ws2812”是啥意思呢?
WS2812驱动其实比较简单,只要时序对就可以了,用DMA方式可以节省CPU时间。