/****************************** File: ws2812.c ********************************* * Author : Reinhard 23.04.2025 * Version : V1.0.0 * Settings : MounRiver Studio MCU CH32X035 * Description : Ansteuerung WS2812/WS2815 per SPI * PA.7(SPI-MOSI) - WS2812/WS2815 Data * ******************************************************************************/ //--------------------------- Includes #include "debug.h" #include "ws2812.h" #include "gpio_def_x035.h" // Initialisierung SPI fuer Ansteuerung WS281x void spi_init_ws(void) // SPI initialisieren, nur MOSI-Output { Set_Pin(SPI1_PORT, SPI1_SCK, MOUT_PP_50); // SCK alternative Funktion Set_Pin(SPI1_PORT, SPI1_MOSI, MOUT_PP_50); // MOSI alternative Funktion RCC->APB2PCENR |= RCC_SPI1EN; // Takt f¨¹r SPI aktivieren SPI1->CTLR1 = SPI_CTLR1_DFF | SPI_CTLR1_SSM | SPI_CTLR1_SSI | SPI_CTLR1_BR_1 | SPI_CTLR1_BR_0 | SPI_CTLR1_MSTR; // SPI konfigurieren // 16-Bit Ausgabe NSS Software NSS aktiv Clock / 16 = 3 MHz SPI-Master SPI1->CTLR1 |= SPI_CTLR1_SPE; // SPI enable } // Zeiten nach Website light_ws2812 t1-350ns t2-900ns t3-1250ns void send_WS2812(uint32_t *data, uint8_t nLED) // t1-330ns t2-1000ns t3-1332ns { uint32_t color; uint32_t mask; uint16_t outdata; for (uint8_t n = 0; n < nLED; n++) { color = data[n]; mask = 0x00800000; for (uint8_t i = 0; i < 6; i++) { outdata = 0; for (uint8_t j = 0; j < 4; j++) { outdata <<= 4; if (color & mask) { outdata |= 0x000E; } else { outdata |= 0x0008; } mask >>= 1; } spi_out_ws(outdata); } } }