概述
本文介紹了如何使用STM32微控制器,結合STM32CubeMX配置工具和SPI通訊接口,來驅動和控制WS2812 LED燈帶。這是一個集硬件連接、軟件配置和編程開發于一體的綜合性項目,目標是實現對LED燈帶顏色和亮度的精確控制。
最近在弄ST的課程,需要樣片的可以加群申請:615061293 。
視頻教學
[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
-
驅動
+關注
關注
12文章
1874瀏覽量
86092 -
SPI
+關注
關注
17文章
1737瀏覽量
93385 -
WS2812
+關注
關注
0文章
33瀏覽量
6393 -
stm32cubemx
+關注
關注
5文章
286瀏覽量
15593
發布評論請先 登錄
相關推薦
瑞薩e2studio(28)----SPI 驅動WS2812燈珠

Arduino控制WS2812燈帶的方法
STM32F103C8T6+PWM+DMA驅動WS2812燈帶的方法
【感芯科技MC3172開發板體驗】WS2812音樂燈帶
【悟空派H3開發板免費體驗】基于spi驅動WS2812燈
如何進行WS2812的面板燈制作詳細資料合集免費下載

STM32使用LL庫PWM的DMA模式驅動ws2812

STM32F103C8T6+PWM+DMA驅動 WS2812燈帶

論如何使用WS2812以及類似燈珠

評論