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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 15:33:02

20

主题

110

回帖

771

积分

荣誉版主

积分
771
发表于 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 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 15:33:02

20

主题

110

回帖

771

积分

荣誉版主

积分
771
发表于 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刷新显示
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 15:33:02

20

主题

110

回帖

771

积分

荣誉版主

积分
771
发表于 2023-12-10 19:50:57 | 显示全部楼层
神*** 发表于 2023-12-10 19:42
驱动 WS2812B  ?

是的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-01 04:31:49

24

主题

515

回帖

986

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:413
  • 最近打卡:2025-05-01 08:31:52

5

主题

296

回帖

2030

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:305
  • 最近打卡:2025-04-07 14:23:16

1

主题

30

回帖

1297

积分

金牌会员

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

点评

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 15:33:02

20

主题

110

回帖

771

积分

荣誉版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:305
  • 最近打卡:2025-04-07 14:23:16

1

主题

30

回帖

1297

积分

金牌会员

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

感谢分享
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-1-2 09:23:02 | 显示全部楼层
SPI-DMA, 驱动全彩LED,无需反相,灯带数量只受xdata大小限制@STC32F12K54
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5601
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)


可以去这个帖子的下面下载附件代码,有完整的STC32G用DMA+SPI驱动ws2812的驱动代码和简单例子,自己做颜色的花样即可。用的SPI接口的MOSI引脚直接驱动的2812,无需任何其他电路,供电即可直接使用

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:54 , Processed in 0.136335 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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