/** * @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_SPI_TIMEOUT 2U #define WS2812_RESET_BYTES 100U #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 (uint8_t i = 0; i < 8U; 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; } if (HAL_SPI_Transmit(&WS2812_SPI_UNIT, txbuf, sizeof(txbuf), WS2812_SPI_TIMEOUT) != HAL_OK) { return; } for (uint8_t i = 0; i < WS2812_RESET_BYTES; i++) { if (HAL_SPI_Transmit(&WS2812_SPI_UNIT, &res, 1U, WS2812_SPI_TIMEOUT) != HAL_OK) { return; } } }