Skip to content

Commit dba3941

Browse files
authored
Old Version
1 parent 9074713 commit dba3941

File tree

2 files changed

+348
-0
lines changed

2 files changed

+348
-0
lines changed

ws28xx.c

Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
1+
2+
#include "ws28xx.h"
3+
4+
#include "FreeRTOS.h"
5+
#include "task.h"
6+
#include "cmsis_os.h"
7+
#include <string.h>
8+
9+
10+
11+
//0xE0,0... // low speed 0 3 bit=1 21 bit=0
12+
//0xFC,0... // low speed 1 6 bit=1 18 bit=0
13+
14+
15+
uint8_t ws28xx_temp[WS28XX_MAX_PIXEL][72]; //72 byte for send a pixel ( 576 bit) (24 bit led data * 24 bit spi data)
16+
17+
ws28xx_Data_TypeDef ws28xxLEDs[WS28XX_MAX_PIXEL];
18+
19+
///////////////////////////////////////////////////////////////////////////////////////////////////////
20+
__forceinline void ws28xx_fill_a_bit(uint16_t bit_number,uint8_t bit_value,uint16_t buffer_nember)
21+
{
22+
uint8_t idx_bit = 0;
23+
uint16_t idx_buffer = 0;
24+
idx_buffer = bit_number/8;
25+
idx_bit = 7-(bit_number % 8);
26+
if(bit_value == 0)
27+
ws28xx_temp[buffer_nember][idx_buffer] = ws28xx_temp[buffer_nember][idx_buffer] & (~(0x01<<idx_bit)) ;
28+
else
29+
ws28xx_temp[buffer_nember][idx_buffer] = ws28xx_temp[buffer_nember][idx_buffer] | (0x01<<idx_bit) ;
30+
}
31+
///////////////////////////////////////////////////////////////////////////////////////////////////////
32+
__forceinline void ws28xx_set_buffer(uint8_t RGB_bit_number_0_23,uint8_t bit_Value_0_1,uint16_t buffer_nember)
33+
{
34+
uint16_t fill_bit=RGB_bit_number_0_23*24;
35+
if(bit_Value_0_1 == 0)
36+
{
37+
for(uint8_t i=0; i<3 ; i++)
38+
ws28xx_fill_a_bit(fill_bit+i,1,buffer_nember);
39+
for(uint8_t i=3; i<24 ; i++)
40+
ws28xx_fill_a_bit(fill_bit+i,0,buffer_nember);
41+
}
42+
else
43+
{
44+
for(uint8_t i=0; i<7 ; i++)
45+
ws28xx_fill_a_bit(fill_bit+i,1,buffer_nember);
46+
for(uint8_t i=7; i<24 ; i++)
47+
ws28xx_fill_a_bit(fill_bit+i,0,buffer_nember);
48+
}
49+
}
50+
///////////////////////////////////////////////////////////////////////////////////////////////////////
51+
///////////////////////////////////////////////////////////////////////////////////////////////////////
52+
///////////////////////////////////////////////////////////////////////////////////////////////////////
53+
void ws28xx_Put_Pixel(ws28xx_Data_TypeDef LED_Pixel)
54+
{
55+
for(int8_t i=7; i>=0 ; i--)
56+
ws28xx_set_buffer( i+0 ,(LED_Pixel.R & (0x80>>i)) ,0);
57+
for(int8_t i=7; i>=0 ; i--)
58+
ws28xx_set_buffer( i+8 ,(LED_Pixel.G & (0x80>>i)) ,0);
59+
for(int8_t i=7; i>=0 ; i--)
60+
ws28xx_set_buffer( i+16 ,(LED_Pixel.B & (0x80>>i)) ,0);
61+
62+
HAL_SPI_Transmit_DMA(WS28XX_SPI,ws28xx_temp[0],72);
63+
}
64+
///////////////////////////////////////////////////////////////////////////////////////////////////////
65+
///////////////////////////////////////////////////////////////////////////////////////////////////////
66+
///////////////////////////////////////////////////////////////////////////////////////////////////////
67+
void ws28xx_Put_Pixels(ws28xx_Data_TypeDef *LED_Pixel,uint16_t len)
68+
{
69+
70+
for(uint16_t x=0 ; x<len ;x++)
71+
{
72+
for(int8_t i=0; i<8 ; i++)
73+
ws28xx_set_buffer( i+0 ,(LED_Pixel[x].R & (0x80>>i)) ,x);
74+
for(int8_t i=0; i<8 ; i++)
75+
ws28xx_set_buffer( i+8 ,(LED_Pixel[x].G & (0x80>>i)) ,x );
76+
for(int8_t i=0; i<8 ; i++)
77+
ws28xx_set_buffer( i+16 ,(LED_Pixel[x].B & (0x80>>i)) ,x);
78+
79+
}
80+
81+
HAL_SPI_Transmit_DMA(WS28XX_SPI,&ws28xx_temp[0][0],(72)*len);
82+
83+
}
84+
///////////////////////////////////////////////////////////////////////////////////////////////////////
85+
///////////////////////////////////////////////////////////////////////////////////////////////////////
86+
///////////////////////////////////////////////////////////////////////////////////////////////////////
87+
void ws28xx_Update(void)
88+
{
89+
90+
ws28xx_Put_Pixels(ws28xxLEDs,WS28XX_MAX_PIXEL);
91+
92+
}
93+
///////////////////////////////////////////////////////////////////////////////////////////////////////
94+
///////////////////////////////////////////////////////////////////////////////////////////////////////
95+
///////////////////////////////////////////////////////////////////////////////////////////////////////
96+
97+
98+
void ws28xx_init(void)
99+
{
100+
// init hardware , I init in cubeMX
101+
102+
//
103+
}
104+
///////////////////////////////////////////////////////////////////////////////////////////////////////
105+
///////////////////////////////////////////////////////////////////////////////////////////////////////
106+
///////////////////////////////////////////////////////////////////////////////////////////////////////
107+
void ws28xx_test(void)
108+
{
109+
memset(ws28xxLEDs,50,sizeof(ws28xxLEDs));
110+
ws28xx_Put_Pixels(ws28xxLEDs,WS28XX_MAX_PIXEL);
111+
osDelay(200);
112+
memset(ws28xxLEDs,0,sizeof(ws28xxLEDs));
113+
ws28xx_Put_Pixels(ws28xxLEDs,WS28XX_MAX_PIXEL);
114+
}
115+
///////////////////////////////////////////////////////////////////////////////////////////////////////
116+
///////////////////////////////////////////////////////////////////////////////////////////////////////
117+
///////////////////////////////////////////////////////////////////////////////////////////////////////
118+
void ws28xx_SetColor(uint16_t Pixel,ws28xx_Color_TypeDef Color)
119+
{
120+
if(Pixel >= WS28XX_MAX_PIXEL )
121+
return;
122+
switch(Color)
123+
{
124+
//---------------------
125+
case ws28xx_Color_Black:
126+
ws28xxLEDs[Pixel].R = 0;
127+
ws28xxLEDs[Pixel].G = 0;
128+
ws28xxLEDs[Pixel].B = 0;
129+
break;
130+
//---------------------
131+
case ws28xx_Color_White:
132+
ws28xxLEDs[Pixel].R = 255;
133+
ws28xxLEDs[Pixel].G = 255;
134+
ws28xxLEDs[Pixel].B = 255;
135+
break;
136+
//---------------------
137+
case ws28xx_Color_Red:
138+
ws28xxLEDs[Pixel].R = 255;
139+
ws28xxLEDs[Pixel].G = 0;
140+
ws28xxLEDs[Pixel].B = 0;
141+
break;
142+
//---------------------
143+
case ws28xx_Color_Green:
144+
ws28xxLEDs[Pixel].R = 0;
145+
ws28xxLEDs[Pixel].G = 255;
146+
ws28xxLEDs[Pixel].B = 0;
147+
break;
148+
//---------------------
149+
case ws28xx_Color_Blue:
150+
ws28xxLEDs[Pixel].R = 0;
151+
ws28xxLEDs[Pixel].G = 0;
152+
ws28xxLEDs[Pixel].B = 255;
153+
break;
154+
//---------------------
155+
case ws28xx_Color_Aqua:
156+
ws28xxLEDs[Pixel].R = 0;
157+
ws28xxLEDs[Pixel].G = 255;
158+
ws28xxLEDs[Pixel].B = 255;
159+
break;
160+
//---------------------
161+
case ws28xx_Color_Magenta:
162+
ws28xxLEDs[Pixel].R = 255;
163+
ws28xxLEDs[Pixel].G = 0;
164+
ws28xxLEDs[Pixel].B = 255;
165+
break;
166+
//---------------------
167+
case ws28xx_Color_Yellow:
168+
ws28xxLEDs[Pixel].R = 255;
169+
ws28xxLEDs[Pixel].G = 255;
170+
ws28xxLEDs[Pixel].B = 0;
171+
break;
172+
//---------------------
173+
case ws28xx_Color_DarkBlue:
174+
ws28xxLEDs[Pixel].R = 0;
175+
ws28xxLEDs[Pixel].G = 0;
176+
ws28xxLEDs[Pixel].B = 128;
177+
break;
178+
//---------------------
179+
case ws28xx_Color_DarkGreen:
180+
ws28xxLEDs[Pixel].R = 0;
181+
ws28xxLEDs[Pixel].G = 128;
182+
ws28xxLEDs[Pixel].B = 0;
183+
break;
184+
//---------------------
185+
case ws28xx_Color_DarkRed:
186+
ws28xxLEDs[Pixel].R = 128;
187+
ws28xxLEDs[Pixel].G = 0;
188+
ws28xxLEDs[Pixel].B = 0;
189+
break;
190+
//---------------------
191+
case ws28xx_Color_Gray:
192+
ws28xxLEDs[Pixel].R = 128;
193+
ws28xxLEDs[Pixel].G = 128;
194+
ws28xxLEDs[Pixel].B = 128;
195+
break;
196+
//---------------------
197+
case ws28xx_Color_Olive:
198+
ws28xxLEDs[Pixel].R = 128;
199+
ws28xxLEDs[Pixel].G = 128;
200+
ws28xxLEDs[Pixel].B = 0;
201+
break;
202+
//---------------------
203+
case ws28xx_Color_Pruple:
204+
ws28xxLEDs[Pixel].R = 128;
205+
ws28xxLEDs[Pixel].G = 0;
206+
ws28xxLEDs[Pixel].B = 128;
207+
break;
208+
//---------------------
209+
case ws28xx_Color_Silver:
210+
ws28xxLEDs[Pixel].R = 192;
211+
ws28xxLEDs[Pixel].G = 192;
212+
ws28xxLEDs[Pixel].B = 192;
213+
break;
214+
//---------------------
215+
case ws28xx_Color_Teal:
216+
ws28xxLEDs[Pixel].R = 0;
217+
ws28xxLEDs[Pixel].G = 128;
218+
ws28xxLEDs[Pixel].B = 128;
219+
break;
220+
//---------------------
221+
case ws28xx_Color_Brown:
222+
ws28xxLEDs[Pixel].R = 165;
223+
ws28xxLEDs[Pixel].G = 42;
224+
ws28xxLEDs[Pixel].B = 42;
225+
break;
226+
//---------------------
227+
case ws28xx_Color_Orange:
228+
ws28xxLEDs[Pixel].R = 255;
229+
ws28xxLEDs[Pixel].G = 165;
230+
ws28xxLEDs[Pixel].B = 0;
231+
break;
232+
//---------------------
233+
case ws28xx_Color_Gold:
234+
ws28xxLEDs[Pixel].R = 255;
235+
ws28xxLEDs[Pixel].G = 215;
236+
ws28xxLEDs[Pixel].B = 0;
237+
break;
238+
//---------------------
239+
case ws28xx_Color_Pink:
240+
ws28xxLEDs[Pixel].R = 255;
241+
ws28xxLEDs[Pixel].G = 20;
242+
ws28xxLEDs[Pixel].B = 147;
243+
break;
244+
245+
246+
247+
}
248+
249+
}
250+
251+
///////////////////////////////////////////////////////////////////////////////////////////////////////
252+
///////////////////////////////////////////////////////////////////////////////////////////////////////
253+
///////////////////////////////////////////////////////////////////////////////////////////////////////
254+
void ws28xx_SetColorArray(uint16_t PixelStart,uint16_t PixelEnd,ws28xx_Color_TypeDef Color)
255+
{
256+
for(uint16_t i=PixelStart ; i<=PixelEnd ; i++)
257+
ws28xx_SetColor(i,Color);
258+
}
259+
260+
///////////////////////////////////////////////////////////////////////////////////////////////////////
261+
///////////////////////////////////////////////////////////////////////////////////////////////////////
262+
///////////////////////////////////////////////////////////////////////////////////////////////////////
263+
void ws28xx_SetColorArrayAndOtherOff(uint16_t PixelStart,uint16_t PixelEnd,ws28xx_Color_TypeDef Color)
264+
{
265+
266+
for(uint16_t i=0 ; i<PixelStart ; i++)
267+
ws28xx_SetColor(i,ws28xx_Color_Black);
268+
269+
for(uint16_t i=PixelStart ; i<=PixelEnd ; i++)
270+
ws28xx_SetColor(i,Color);
271+
272+
273+
for(uint16_t i=PixelEnd+1 ; i<WS28XX_MAX_PIXEL ; i++)
274+
ws28xx_SetColor(i,ws28xx_Color_Black);
275+
276+
277+
}

ws28xx.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#ifndef _WS28XX_H
2+
#define _WS28XX_H
3+
4+
5+
#include "spi.h"
6+
#include "gpio.h"
7+
8+
9+
// init SPI @ 10.0 MHZ SPI mode:MSB first enable DMA:Normal mode data width:Byte
10+
// output @ MOSI
11+
// test with WS2811S
12+
13+
#define WS28XX_MAX_PIXEL 147
14+
#define WS28XX_SPI &hspi1
15+
16+
17+
typedef struct
18+
{
19+
uint8_t R : 8 ;
20+
uint8_t G : 8 ;
21+
uint8_t B : 8 ;
22+
23+
}ws28xx_Data_TypeDef;
24+
25+
26+
typedef enum
27+
{
28+
ws28xx_Color_Black = 0 ,
29+
ws28xx_Color_Red ,
30+
ws28xx_Color_Green ,
31+
ws28xx_Color_Blue ,
32+
ws28xx_Color_Yellow ,
33+
ws28xx_Color_Aqua ,
34+
ws28xx_Color_Magenta ,
35+
ws28xx_Color_DarkGreen ,
36+
ws28xx_Color_DarkRed ,
37+
ws28xx_Color_DarkBlue ,
38+
ws28xx_Color_Olive ,
39+
ws28xx_Color_Pruple ,
40+
ws28xx_Color_Teal ,
41+
ws28xx_Color_Silver ,
42+
ws28xx_Color_Gray ,
43+
ws28xx_Color_Brown ,
44+
ws28xx_Color_Orange ,
45+
ws28xx_Color_Gold ,
46+
ws28xx_Color_Pink ,
47+
ws28xx_Color_White ,
48+
49+
}ws28xx_Color_TypeDef;
50+
51+
52+
53+
54+
extern ws28xx_Data_TypeDef ws28xxLEDs[WS28XX_MAX_PIXEL];
55+
56+
57+
58+
void ws28xx_init(void);
59+
void ws28xx_test(void);
60+
void ws28xx_Put_Pixel(ws28xx_Data_TypeDef LED_Pixel);
61+
void ws28xx_Put_Pixels(ws28xx_Data_TypeDef *LED_Pixel,uint16_t len);
62+
void ws28xx_Update(void);
63+
64+
65+
66+
// execute ws28xx_Update() to see
67+
void ws28xx_SetColor(uint16_t Pixel,ws28xx_Color_TypeDef Color);
68+
void ws28xx_SetColorArray(uint16_t PixelStart,uint16_t PixelEnd,ws28xx_Color_TypeDef Color);
69+
void ws28xx_SetColorArrayAndOtherOff(uint16_t PixelStart,uint16_t PixelEnd,ws28xx_Color_TypeDef Color);
70+
71+
#endif

0 commit comments

Comments
 (0)