梁工
发表于 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时间。
karmaing
发表于 2025-3-5 22:00:02
梁工,你好,
我用的是你的stc32g 查询发送 ws2812程序,想改成用stc32g库函数中的 SPI库,用库函数初始化spi后,ws2812不能正常点亮,请教下问题出在哪里?
void z_spi_init()
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_SSIG = 1; // 片选位 ENABLE, DISABLE
SPI_InitStructure.SPI_Enable = 1; // SPI启动 ENABLE, DISABLE
SPI_InitStructure.SPI_FirstBit = 0; // 移位方向 SPI_MSB, SPI_LSB
SPI_InitStructure.SPI_Mode = 1; // 主从选择 SPI_Mode_Master, SPI_Mode_Slave
SPI_InitStructure.SPI_CPOL = 0; // 时钟相位 SPI_CPOL_High, SPI_CPOL_Low
SPI_InitStructure.SPI_CPHA = 1; // 数据边沿 SPI_CPHA_1Edge,SPI_CPHA_2Edge
SPI_InitStructure.SPI_Speed = 1; // SPI速度 SPI_Speed_4, SPI_Speed_8, SPI_Speed_16, SPI_Speed_2
SPI_Init(&SPI_InitStructure);
SPI_SW(SPI_P22_P23_P24_P25); // SPI_P54_P13_P14_P15,SPI_P22_P23_P24_P25,SPI_P54_P40_P41_P43,SPI_P35_P34_P33_P32
P24 = 0; // MISO = 0, MOSI输出完毕保持低电平
P2n_push_pull(Pin3); // 驱动WS2812将MOSI设置为推挽输出
}
梁工
发表于 2025-3-5 22:25:58
karmaing 发表于 2025-3-5 22:00
梁工,你好,
我用的是你的stc32g 查询发送 ws2812程序,想改成用stc32g库函数中的 SPI库,用库函数初始化s ...
SPI有发出信号了?
如果SPI发出信号了,则是你的速度不对,示波器观察一下。
如果没有信号,则是初始化不对,请再检查程序。
驱动WS2812建议使用DMA方式,不占CPU时间,但占用比较多的RAM。
rayrakey
发表于 2025-3-6 14:36:25
谢谢楼主
proktv
发表于 2025-3-14 16:48:43
试试看 效果怎样