梁工 发表于 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时间。
页: 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18
查看完整版本: SPI-DMA输出控制WS2812三基色彩灯程序@8H系列/32G系列,不加反相器, CPU休息