找回密码
 立即注册
查看: 1415|回复: 10

SPI-DMA, 驱动全彩LED,无需反相,灯带数量只受xdata大小限制@STC32F12K54

[复制链接]
  • TA的每日心情
    奋斗
    2023-12-6 15:33
  • 签到天数: 2 天

    [LV.1]初来乍到

    20

    主题

    98

    回帖

    968

    积分

    荣誉版主

    积分
    968
    发表于 2023-12-10 19:17:45 | 显示全部楼层 |阅读模式
    SPI-DMA, 驱动全彩LED猜猜驱动的谁
    SPI-DMA@STC32F12K54驱动全彩LED无需反相,灯带数量只受xdata大小限制
    ===STC32F12K54, 8K edata
    ===STC32F12K54, 4K xdata, xdata 可以做 DMA-SPI 的缓冲区


    时钟:默认的52Mhz,基于库函数的初始化
    初始化部分:spi
    1. void        SPI_config(void)
    2. {
    3.         SPI_InitTypeDef                SPI_InitStructure;
    4.         SPI_InitStructure.SPI_Enable    = ENABLE;                        //SPI启动    ENABLE, DISABLE
    5.         SPI_InitStructure.SPI_SSIG      = DISABLE;                        //片选位     ENABLE, DISABLE
    6.         SPI_InitStructure.SPI_FirstBit  = SPI_MSB;                        //移位方向   SPI_MSB, SPI_LSB
    7.         SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;        //主从选择   SPI_Mode_Master, SPI_Mode_Slave
    8.         SPI_InitStructure.SPI_CPOL      = SPI_CPOL_High;                //时钟相位   SPI_CPOL_High,   SPI_CPOL_Low
    9.         SPI_InitStructure.SPI_CPHA      = SPI_CPHA_2Edge;        //数据边沿   SPI_CPHA_1Edge,  SPI_CPHA_2Edge
    10.         SPI_InitStructure.SPI_Speed     = SPI_Speed_2;                //SPI速度    SPI_Speed_4, SPI_Speed_8, SPI_Speed_16, SPI_Speed_2
    11.         SPI_Init(&SPI_InitStructure);
    12.         NVIC_SPI_Init(DISABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    13. //        HSPllClkConfig(MCLKSEL_HIRC,PLL_96M,4);    //系统时钟选择,PLL时钟选择,时钟分频系数
    14.         HSSPI_Enable();
    15. }
    复制代码
    初始化部分:DMA
    1. void        DMA_config(void)
    2. {
    3.         DMA_SPI_InitTypeDef                DMA_SPI_InitStructure;                //结构定义
    4.         
    5.         //----------------------------------------------
    6.         DMA_SPI_InitStructure.DMA_Enable = DISABLE;                                        //DMA使能          ENABLE,DISABLE
    7.         DMA_SPI_InitStructure.DMA_Tx_Enable = ENABLE;                                //DMA发送数据使能          ENABLE,DISABLE
    8.         DMA_SPI_InitStructure.DMA_Rx_Enable = ENABLE;                                //DMA接收数据使能          ENABLE,DISABLE
    9.         DMA_SPI_InitStructure.DMA_Length = BUF_LENGTH;                        //DMA传输总字节数          (0~65535) + 1
    10.         DMA_SPI_InitStructure.DMA_Tx_Buffer = (u16)SpiTxBuffer;        //发送数据存储地址
    11.         DMA_SPI_InitStructure.DMA_Rx_Buffer = (u16)SpiRxBuffer;        //接收数据存储地址
    12.         DMA_SPI_InitStructure.DMA_SS_Sel = SPI_SS_P35;                        //自动控制SS脚选择         SPI_SS_P12,SPI_SS_P22,SPI_SS_P74,SPI_SS_P35
    13.         DMA_SPI_InitStructure.DMA_AUTO_SS = DISABLE;                                //自动控制SS脚使能          ENABLE,DISABLE
    14.         DMA_SPI_Inilize(&DMA_SPI_InitStructure);                //初始化
    15.         SET_DMA_SPI_CR(DMA_ENABLE  | CLR_FIFO);        //bit7 1:使能 SPI_DMA, bit5 1:开始 SPI_DMA 从机模式, bit0 1:清除 SPI_DMA FIFO
    16.         NVIC_DMA_SPI_Init(ENABLE,Priority_3,Priority_3);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0~Priority_3; 总线优先级(低到高) Priority_0~Priority_3
    17.         
    18. }
    复制代码



    初始化部分:灯带
    1. void init_led()
    2. {
    3.         u16 i;
    4.         P2_SPEED_HIGH(GPIO_Pin_3);
    5.         P24=0;//MISO置0
    6.         P23=1;//MOSI
    7.                 //SpiTxBuffer[i]=0xf0;//f0 0
    8.          delay_ms(1);
    9.         P23=0;
    10.         SPI_config();
    11.         DMA_config();
    12.         SpiTxFlag=1;
    13.         delay_ms(1);
    14.         for(i=0;i<LED_COUNT;i++)
    15.                 set_led(i,0x00,0x00,0x00);//这里必须先发送一次spi,要保证最后一字节的最后一bit为0,这里为了方便就直接调用了灯带函数
    16.         updata_led();
    17.         delay_ms(10);
    18.         
    19. }
    复制代码
    设置led缓存,更新led
    1. <blockquote>#define<span style="white-space:pre">                </span>LED_COUNT<span style="white-space:pre">        </span> 30    //灯珠数量
    复制代码

    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-6 15:33
  • 签到天数: 2 天

    [LV.1]初来乍到

    20

    主题

    98

    回帖

    968

    积分

    荣誉版主

    积分
    968
     楼主| 发表于 2023-12-10 19:39:04 | 显示全部楼层
    代码乱码了,我再发一下后面的
    #define                LED_COUNT         30//灯带数量
    #define BUF_LENGTH          LED_COUNT*24                        //n+1

    extern u8 xdata SpiTxBuffer[BUF_LENGTH];
    extern u8 xdata SpiRxBuffer[256];

    void set_led(u16 cnt,u8 red,u8 green,u8 blue)//cnt:第几个灯,red 红,green 绿,blue:蓝
    {
            u16 i;

            if(cnt>=LED_COUNT)        return;
            for(i=cnt*24;i<cnt*24+8;i++)
            {
                    if((green&0x80)==0x80)//1
                            SpiTxBuffer[i]=0xfe;
                    else
                            SpiTxBuffer[i]=0xe0;//0
                    green<<=1;
            }
            for(i=cnt*24+8;i<cnt*24+16;i++)
            {
                    if((red&0x80)==0x80)//1
                            SpiTxBuffer[i]=0xfe;
                    else
                            SpiTxBuffer[i]=0xe0;//0
                    red<<=1;
            }
            for(i=cnt*24+16;i<cnt*24+24;i++)
            {
                    if((blue&0x80)==0x80)//1
                            SpiTxBuffer[i]=0xfe;
                    else
                            SpiTxBuffer[i]=0xe0;//0
                    blue<<=1;
            }
    }

    void updata_led()
    {
            if(SpiTxFlag==1)
            {
                    SpiTxFlag=0;
                    SET_DMA_SPI_CR(DMA_ENABLE | SPI_TRIG_M);
                    //delay_ms(1);
            }
    }

    使用方法:先调用set_led设置缓存,然后调用updata_led刷新显示
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13944
    发表于 2023-12-10 19:42:33 | 显示全部楼层
    驱动 WS2812B  ?

    //硬件SPI模拟WS2811时序(用SPI的8位数据模拟WS281x的一位数据
    //  _____
    // |        |____|   11110000  high level
    //  __
    // |   |_______|   11000000  low level
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-6 15:33
  • 签到天数: 2 天

    [LV.1]初来乍到

    20

    主题

    98

    回帖

    968

    积分

    荣誉版主

    积分
    968
     楼主| 发表于 2023-12-10 19:50:57 | 显示全部楼层

    是的
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 153 天

    [LV.7]常住居民III

    17

    主题

    370

    回帖

    1285

    积分

    荣誉版主

    积分
    1285
    发表于 2023-12-11 07:57:08 | 显示全部楼层
    该方案可行。就是把两个字节的空闲位做为高电平处理。一个字节只传输一个bit.
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 152 天

    [LV.7]常住居民III

    13

    主题

    244

    回帖

    819

    积分

    高级会员

    积分
    819
    发表于 2023-12-15 23:17:03 | 显示全部楼层
    谢谢分享处理代码。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:06
  • 签到天数: 124 天

    [LV.7]常住居民III

    4

    主题

    235

    回帖

    856

    积分

    高级会员

    积分
    856
    发表于 2023-12-18 09:35:01 | 显示全部楼层
    还没用过库开发,看版主的程序有点像STM32的的HAL库!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 107 天

    [LV.6]常住居民II

    0

    主题

    17

    回帖

    474

    积分

    中级会员

    积分
    474
    发表于 2023-12-18 17:22:06 | 显示全部楼层
    有完完整的代码吗?

    点评

    这代码算是比较完整的了,整个工程这里不方便发出来  详情 回复 发表于 2023-12-20 20:25
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-6 15:33
  • 签到天数: 2 天

    [LV.1]初来乍到

    20

    主题

    98

    回帖

    968

    积分

    荣誉版主

    积分
    968
     楼主| 发表于 2023-12-20 20:25:29 | 显示全部楼层
    HJJDSTC 发表于 2023-12-18 17:22
    有完完整的代码吗?

    这代码算是比较完整的了,整个工程这里不方便发出来
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 107 天

    [LV.6]常住居民II

    0

    主题

    17

    回帖

    474

    积分

    中级会员

    积分
    474
    发表于 2023-12-22 09:16:12 | 显示全部楼层
    chen 发表于 2023-12-20 20:25
    这代码算是比较完整的了,整个工程这里不方便发出来

    感谢分享
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-28 18:15 , Processed in 0.073803 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表