STM32C0开发(1)----SPI 驱动WS2812灯珠

发布者:星光闪耀最新更新时间:2024-09-23 来源: elecfans关键字:SPI  驱动 手机看文章 扫描二维码
随时随地手机看文章

概述

本文介绍了如何使用STM32微控制器,结合STM32CubeMX配置工具和SPI通讯接口,来驱动和控制WS2812 LED灯带。这是一个集硬件连接、软件配置和编程开发于一体的综合性项目,目标是实现对LED灯带颜色和亮度的精确控制。

在这里插入图片描述

视频教学

[https://www.bilibili.com/video/BV1X94y157W8/

样品申请

[https://www.wjx.top/vm/OhcKxJk.aspx#]
在这里插入图片描述

源码下载

[https://download.csdn.net/download/qq_24312945/88489586

芯片级联方法

在这里插入图片描述

芯片在上电复位以后,接收DIN端打来的数据,接收够24bit后,DO端口开始转发数据,供下一个芯片提供输入数据。在转发之前,DO口一直拉低。此时灯珠将不接收新的数据,内置RGB芯片根据接收到的24bit数据后产生的不同占空比信号,展现不同亮度。如果DIN端输入信号为RESET信号,芯片将接收到的数据送显示,芯片将在该信号结束后重新接收新的数据,在接收完开始的24bit数据后,通过DO口转发数据,灯珠在没有接收到RESET码前,RGB亮度保持不变,当接收到80us以上低电平RESET码后,灯珠内部RGB芯片将根据刚才接收到的24bit数据后产生的不同占空比信号,展现不同亮度。

在这里插入图片描述

数据传输

在这里插入图片描述
24bit数据结构:

在这里插入图片描述

时序

时序波形图如下所示。

在这里插入图片描述
在这里插入图片描述

SPI配置

将SPI的配置速度设为6M,数据宽度设为8位。
CPHA配置为第二边沿采样;在第一个跳变沿时,MOSI在空闲状态保持高电平,而在第二个跳变沿,它会保持上一次传输的最终电平。由于发送数据的最后一位总是低电平,这样配置可以避免WS2812误判。CPOL设置为高,确保SCK在空闲时保持高电平状态。

在这里插入图片描述

系统采用单总线协议,通过总线上高低电平的时长来区分逻辑0和1。WS2811工作在800kHz频率下,将SPI设置为6.4MHz—即其工作频率的8倍—可以确保每个字节(8位)正好对应一个逻辑位。在这种设置下,‘11111000’(0xF8)代表逻辑1,‘11000000’(0xC0)代表逻辑0。

在这里插入图片描述

逻辑0下发送的数据为11000000’(0xC0)。
逻辑0下高电平位320ns。

在这里插入图片描述

逻辑0下低电平位1.01us。

在这里插入图片描述

逻辑1下发送的数据为‘11111000’(0xF8)。
逻辑1下高电平位830ns。

在这里插入图片描述
逻辑1下低电平位500ns。
在这里插入图片描述

这种精确的时序配置和电平控制对于确保WS2812灯带的正确驱动至关重要,可以通过上述配置来优化SPI接口的性能,确保与WS2812的高效通信。

CPHA配置

CPHA配置为第二边沿采样下数据传输结束如下所示。

在这里插入图片描述
CPHA配置为第二边沿采样下数据传输结束如下所示。

在这里插入图片描述

由于RESET Code为低电平,且要大于80us,所以数据传输完毕必须为低电平。

在这里插入图片描述

代码

在main.c中添加头文件。


/* USER CODE BEGIN Includes */

#include 'ws2812.h'

#include < string.h >

/* USER CODE END Includes */

在main.c中添加函数申明和移位操作。


/* USER CODE BEGIN 0 */

extern tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT];


void move_Front()

{

uint8_t i;

uint8_t temp[3];

temp[0] = gWs2812bDat[0].R;

temp[1] = gWs2812bDat[0].G;

temp[2] = gWs2812bDat[0].B;

for (i = 0; i < WS2812B_AMOUNT-1; i++)

{

gWs2812bDat[i].R = gWs2812bDat[i+1].R;

gWs2812bDat[i].G = gWs2812bDat[i+1].G;

gWs2812bDat[i].B = gWs2812bDat[i+1].B;

}

gWs2812bDat[7].R = temp[0];

gWs2812bDat[7].G = temp[1];

gWs2812bDat[7].B = temp[2];

}



/* USER CODE END 0 */

添加初始化显示。


/* USER CODE BEGIN 2 */

WS2812B_Task();

HAL_Delay(1000);

  /* USER CODE END 2 */

添加流水灯。


/* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

WS2812B_Task();

move_Front();

HAL_Delay(100);

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

ws2812.c

#include 'ws2812.h'

#include 'spi.h'


//灯条显存SPI数据缓存

uint8_t gWs2812bDat_SPI[WS2812B_AMOUNT * 24] = {0};

//灯条显存

tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT] = {


//R    G      B

0XFF, 0X00, 0X00, //0

0X00, 0XFF, 0X00, //1

0X00, 0X00, 0XFF, //2

0X00, 0XFF, 0XFF, //3

0XFF, 0X00, 0XFF, //4

0XFF, 0XFF, 0X00, //5

0XFF, 0XFF, 0XFF, //6

0X00, 0X00, 0X00, //7

};

void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b)

{

uint8_t *pR = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24 + 8];

uint8_t *pG = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24];

uint8_t *pB = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24 + 16];

for(uint8_t i = 0; i <  8; i++) {

if(g & 0x80) {

*pG = CODE_1;

}           

else {           

*pG = CODE_0;

}           

if(r & 0x80) {           

*pR = CODE_1;

}           

else {           

*pR = CODE_0;

}           

if(b & 0x80) {           

*pB = CODE_1;

}           

else {           

*pB = CODE_0;

}

r < <= 1;

g < <= 1;

b < <= 1;

pR++;

pG++;

pB++;

}

}

void WS2812B_Task(void)

{

uint8_t dat = 0;

//将gWs2812bDat数据解析成SPI数据

for(uint8_t iLED = 0; iLED < WS2812B_AMOUNT; iLED++)

{

WS2812b_Set(iLED, gWs2812bDat[iLED].R, gWs2812bDat[iLED].G, gWs2812bDat[iLED].B);

}

//总线输出数据

HAL_SPI_Transmit(&hspi1, gWs2812bDat_SPI, sizeof(gWs2812bDat_SPI),0XFFFF);

//使总线输出低电平

HAL_SPI_Transmit(&hspi1, &dat, 1,0XFFFF);

//帧信号:一个大于50us的低电平

HAL_Delay(1);

}

ws2812.h

#ifndef __WS2812_H__

#define __WS2812_H__


#include < stdint.h >


//            编码 0 : 11000000

#define CODE_0 0xC0

//            编码 1 : 11111000

#define CODE_1 0xF8

/*ws2812b灯珠数量*/

#define WS2812B_AMOUNT 8


typedef struct

{

uint8_t R;

uint8_t G;

uint8_t B;

} tWs2812bCache_TypeDef;


extern tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT];


void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b);

void WS2812B_Task(void);


#endif


关键字:SPI  驱动 引用地址:STM32C0开发(1)----SPI 驱动WS2812灯珠

上一篇:用户手册|X-CUBE-SBSFU STM32Cube扩展包入门
下一篇:分享一种STM32F407的锁相环PLL重新配置方法

推荐阅读最新更新时间:2024-11-17 03:38

89C52控制MAX7219驱动数码管
89C52控制MAX7219驱动数码管,提供源码,原理图,焊接实物图等。链接见文末。 原理图 源码 max7219.h /********************************************************** * 文 件 名 : MAX7219.H * 描 述 : MAX7219驱动包程序 **********************************************************/ #ifndef _MAX7219_H_ #define _MAX7219_H_ #include reg52.h #include intrins.h //管脚定义
[单片机]
直驱电机驱动器的国产化进阶
撰文 | 石头 最近几年国内直驱技术市场呈现一派繁荣的景象,工业自动化行业快速发展,有效拉动了上游直线电机的需求增长,国外品牌纷纷加大对中国市场的投入力度,与此同时国产品牌迅速加入到直线电机的生产制造中。 在应用端,高端装配市场对产品功能提出了更高要求,其中数控机床、半导体集成设备、激光加工设备等机械行业表现得尤为明显,其对机器的性能、速度、精度等要求也逐渐提高,原来占据主导地位的旋转伺服电机加丝杆传动的结构已不能满足设备越来越高的要求,而直线电机恰恰可以弥补丝杆传动的不足之处。 与旋转电机的传动方式相比,直线电机省去了机械传动结构,具有结构简单、无摩擦、无背隙、使用寿命长等特点,适用于高速、高加减速、高精度等场合,如半导体/电
[机器人]
直驱电机<font color='red'>驱动</font>器的国产化进阶
基于STM32的FSMC接口驱动TFT彩屏
TFT-LCD技术是微电子技术和LCD技术巧妙结合的高新技术。随着人们对图像清晰度、刷新率、保真度的要求越来越高,TFT-LCD的应用范围越来越广。本文提出了一种能直接驱动数字液晶屏的设计方案,方案先介绍了TFT数字彩屏的工作原理,利用STM32处理器的FSMC接口设计的硬件电路和软件程序均能对显示控制芯片进行有效的控制。在实际应用中显示清晰流畅,并且CPU有足够的时间来处理用户程序。该方案能成功应用在电脑横机的人机界面显示中,且其硬件电路结构简单、控制方式灵活、对于其他型号的接口芯片也能提供参考。 0 引言 随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上作为显示屏。
[单片机]
基于STM32的FSMC接口<font color='red'>驱动</font>TFT彩屏
AVR基础知识:ATMEGA的SPI总线 - 第1部分
当AVR与其他器件进行数据交互时,我们需要选择采用哪种方式。这里可以使用UART、I2C等经典的串口方式,也可以选择串行外设接口(SPI)。我比较喜欢SPI总线方式。那么让我们来聊一聊这种总线形式。 关系 在SPI中的一个重要的概念就是主从关系。一个设备作为主机,负责产生时钟信号并启动每次通信。除了时钟之外,其他设备在很多方面都像主机一样操作,而且只有在被呼叫时才会回应。 一般情况下,SPI总线至少由四条线组成 - 也就是说,它需要每个器件的四个引脚。 他们是: ● MOSI:主机输出,从机输入 - 数据从主机传输到从机。 ● MISO:主机输入,从机输出 - 用于从从机到主机的数据传输。 ● SCK:时钟线,
[单片机]
AVR基础知识:ATMEGA的<font color='red'>SPI</font>总线 - 第1部分
浅析移动多媒体的货币化进程
作者: 达丽星网络公司SP业务部兼企业市场高级副总裁Mitch A. Lewis   过去的一年,流行的视频网站、兴趣社区(Communities of interest)、社交网络的普及和个性化需求出现成倍增长。虽然以分钟计算,多媒体服务和使用率均创下历史新高,但服务提供商和内容提供者仍然在根据消费者和企业的需求,不断调整着他们的收益和推出新服务模式。    网络和市场驱动力   全球3G用户数量现已超过3亿。2007年,全球售出的新手机超过10亿部,当中有200多万部是3G手机。这一销售数字促使市场不断推出不同型号和款式的手机、多功能电话以及更为低廉的最终用户成本,以及终端游戏的流行、如苹果的iPhone这样操作简易
[焦点新闻]
线性LED驱动器创新方案及应用
在众多照明应用中,线性LED驱动器是首选的方案,因为它们相对简单,易于设计,且使LED能够以精确稳流电流来驱动,而无论LED正向压降或输入电压如何变化。由于驱动器是线性结构,它们必须匹配应用的功率耗散要求。安森美半导体提供电流范围在10 mA到1 A之间的宽广范围线性LED驱动器方案,包括新颖的线性恒流稳流器(CCR)方案及其它众多线性驱动器方案。   针对低电流LED驱动的线性CCR及应用示例   在电流低于350 mA的许多低电流LED应用中,如汽车组合尾灯、霓红灯替代、交通信号灯、大型显示屏背光、建筑物装饰光及指示器等,可以采用普通的线性稳压器或是电阻来提供LED驱动方案。电阻用于限制LED串的电流,是成本最低的方案,易
[电源管理]
线性LED<font color='red'>驱动</font>器创新方案及应用
单片机引脚直接驱动LCD
LED数码管的驱动是比较简单也容易理解的,多位数码管一般是LED阵列的形式,每个数字使用一个公共端,不同数字的对应同笔段使用一个控制端;驱动采用分时扫描没个数字位,动态显示。但是LED比较费电,我想做一个用电池供电的钟,用发光管电池就撑不了多久了。于是我考虑用液晶。 在这边的电子市场我买到一个4位笔段式液晶屏,4个数字最中间有冒号,边上还有几个箭头符号,一共有15个引脚,正合适用AVR来驱动做一个钟。 笔段式LCD屏的结构与LED数码管很相似,但是由于是液晶,工作机理上不同,驱动方式也有很大差异: (1) LED有正负之分,液晶笔划没有。 (2) LED在直流电压下工作,液晶需
[单片机]
单片机引脚直接<font color='red'>驱动</font>LCD
自建ISP编程器的温度报警显示控制系统的设计
1 系统的组成 系统主要由单片机、温度报警模块、液晶显示模块、时钟模块、ISP编程器和键盘模块等组成,如图1所示。 2 系统原理 首先通过ISP编程器将程序下载到单片机系统中,利用温度报警,液晶显示和时钟模块,通过键盘控制或人工控制实现实时的温度报警控制显示,实现人机交流。 2.1 数字温度传感器DS18B20 DS8B20可由用户设置温度报警界限,在使用过程中,可由一根I/O数据线既供电又传输数据。它的核心是一个直接数字化的温度传感器,可将-55℃~+125℃之间的温度值按9、10、11、12位的分辨率进行量化,与之对应的温度增量值分别为0.5℃、0.25℃、0.125℃、0.0625℃,器件上电后的默认值为12
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved