找回密码
 立即注册
楼主: 梁工

SPI-DMA输出控制WS2812三基色彩灯程序@8H系列/32G系列,不加反相器, CPU休息

 火.. [复制链接]
已绑定手机

3

主题

7

回帖

144

积分

注册会员

积分
144
发表于 2026-8-19 16:28:51 | 显示全部楼层
梁*** 发表于 2026-8-19 16:13
当然可以,程序与STC8H8K64U兼容,只是xdata只有1K,最多只能控制68个灯。

好的,谢谢梁工,最后还是用8k64u了,1K08Tio口不够
回复

使用道具 举报 送花

已绑定手机

35

主题

91

回帖

251

积分

中级会员

积分
251
发表于 2026-9-12 19:45:21 | 显示全部楼层
虽然我不懂,但是真牛逼!
回复

使用道具 举报 送花

10

主题

127

回帖

3625

积分

论坛元老

积分
3625
发表于 2026-9-13 00:23:48 | 显示全部楼层
我弄的2812的小灯它不听话
回复

使用道具 举报 送花

已绑定手机

3

主题

5

回帖

31

积分

新手上路

积分
31
发表于 2026-10-21 10:10:23 | 显示全部楼层
SPI-DMA输出控制WS2812三基色彩灯程序@8H系列/32G系列,不加反相器, CPU休息 [修改]
回复

使用道具 举报 送花

已绑定手机

3

主题

5

回帖

31

积分

新手上路

积分
31
发表于 2026-10-21 10:10:55 | 显示全部楼层
这几个文件的程序都是:第一次发送颜色,红色会显示成黄色,后面就都正常了,这个是为什么,怎么解决呢?

1

1

2

2

3

3

点评

我测试没有你说的问题。  详情 回复 发表于 2026-10-21 12:09
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
 楼主| 发表于 2026-10-21 12:09:40 | 显示全部楼层
ykjs*** 发表于 2026-10-21 10:10
这几个文件的程序都是:第一次发送颜色,红色会显示成黄色,后面就都正常了,这个是为什么,怎么解决呢?

...

我测试没有你说的问题。
回复

使用道具 举报 送花

0

主题

24

回帖

226

积分

中级会员

积分
226
QQ
发表于 2026-10-25 10:53:12 | 显示全部楼层
回复

使用道具 举报 送花

已绑定手机

3

主题

5

回帖

31

积分

新手上路

积分
31
发表于 5 天前 | 显示全部楼层
梁*** 发表于 2026-10-21 12:09
我测试没有你说的问题。

我解决了:是IO口上电就是高电平,准双向口,ws2812收到了这个信号,这个没办法,
解决方法是上电spi给第一个灯珠发0就行,是spi的0
不用给灯带所有灯珠发,第一个灯珠的长度就行,我为了代码方便,就全发一次。
相关代码如下:


//========================================================================
// 函数: void WS2812_Reset(void)
// 描述: 发送一帧全 0x00,MOSI 持续低电平约 1.7ms,给 WS2812 复位
// 备注: 会清空 led_SPI[],调用后需重新 LoadSPI() 装载颜色
// 使用范例: WS2812_Reset();        // 第一次运行:先复位灯带,消除首灯偏色
//========================================================================
void WS2812_Reset(void)
{
    u16 i;
    for(i = 0; i < SPI_NUM; i++)  led_SPI = 0x00;
    DMA_SPI_config();      // 启动DMA,分块发完720字节0x00
    delay_ms(3);           // 等发完(约1.8ms)+保持低电平>50us
}





//========================================================================
// 函数: void WS2812_Init(void)
// 描述: WS2812 驱动初始化。配置 SPI、开总中断、发一帧 0x00 给灯带复位。
// 调用: main() 开头调用一次即可,之后只调 LoadSPI() + DMA_SPI_config()。
//========================================================================
void WS2812_Init(void)
{
    SPI_Config(0, 1);    // SPI: P1.3-MOSI, 分频8 (fosc/8)
    EA = 1;              // 开总中断(DMA 中断需要)
    WS2812_Reset();      // 上电复位灯带,消除首灯偏色
}



/*
STC8H 的 SPI 有一个特性:发送完成后,MOSI 输出的电平会跟随 MISO 引脚的状态。你代码里 P14 = 0; 就是把 MISO 拉低,从而让 MOSI 在空闲时也保持低电平



*/
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-8 01:50 , Processed in 0.080172 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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