/**
* @file ws2812.c
* @brief WS2812 LED driver
* @author TuxMonkey (nqx2004@gmail.com)
* @version 1.0
* @date 2025-07-08
*
* @copyright Copyright (c) 2025 DLMU-C.ONE
*
* @par 修改日志:
*
* | Date | Version | Author | Description
* |
|---|
| 2025-07-08 | 1.0 | TuxMonkey | 内容
* |
*/
#include "ws2812.h"
#define WS2812_LowLevel 0xC0 // 0码
#define WS2812_HighLevel 0xF0 // 1码
/**
* @brief
* @param [in] r My Param doc
* @param [in] g My Param doc
* @param [in] b My Param doc
*/
void WS2812_Ctrl(uint8_t r, uint8_t g, uint8_t b)
{
uint8_t txbuf[24];
uint8_t res = 0;
for (auto i = 0; i < 8; i++)
{
txbuf[7 - i] = (((g >> i) & 0x01) ? WS2812_HighLevel : WS2812_LowLevel) >> 1;
txbuf[15 - i] = (((r >> i) & 0x01) ? WS2812_HighLevel : WS2812_LowLevel) >> 1;
txbuf[23 - i] = (((b >> i) & 0x01) ? WS2812_HighLevel : WS2812_LowLevel) >> 1;
}
HAL_SPI_Transmit(&WS2812_SPI_UNIT, &res, 0, 0xFFFF);
while (WS2812_SPI_UNIT.State != HAL_SPI_STATE_READY);
HAL_SPI_Transmit(&WS2812_SPI_UNIT, txbuf, 24, 0xFFFF);
for (auto i = 0; i < 100; i++)
{
HAL_SPI_Transmit(&WS2812_SPI_UNIT, &res, 1, 0xFFFF);
}
}