Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.
Dependents: WS2812_out_of_specification_demo
Revision 6:583738208b96, committed 2020-03-20
- Comitter:
- kenjiArai
- Date:
- Fri Mar 20 06:46:11 2020 +0000
- Parent:
- 5:a07522fe36d4
- Commit message:
- Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.
Changed in this revision
WS2812.cpp | Show annotated file Show diff for this revision Revisions of this file |
WS2812.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/WS2812.cpp Mon Aug 18 13:25:57 2014 +0000 +++ b/WS2812.cpp Fri Mar 20 06:46:11 2020 +0000 @@ -1,20 +1,21 @@ +/* + Modified by Kenji Arai / JH1PJL + March 20th, 2020 + */ + #include "WS2812.h" -WS2812::WS2812(PinName d, int size) : __spi(d, NC, NC) +WS2812::WS2812(PinName mosi, PinName miso, PinName sclk, int size) + : __spi(mosi, miso, sclk) { __size = size; __spi.format(SPIBPF,0); __spi.frequency(SPICLK); - __use_II = 0; // 0=off,1=use global,2=per pixel - __II = 0xFF; // set global intensity to full + __mode = OFF; // 0=off,1=use global,2=per pixel + __br = 0xFF; // set global Brightness to full } - -WS2812::~WS2812() -{ - -} - +WS2812::~WS2812() {;} void WS2812::write(int buf[]) { @@ -24,100 +25,80 @@ } } - void WS2812::write_offsets(int buf[], int r_offset, int g_offset, int b_offset) { // for each of the data points in the buffer for (int i = 0; i < __size ; i++) { - - unsigned int argb = 0x0; - // index and extract colour fields from IIRRGGBB buf[] + int color_one = 0x0; + // index and extract color fields from IIRRGGBB buf[] // 0 = blue, 1 = green, 2 = red, 3 = brightness - argb |= (buf[(i+b_offset)%__size] & 0x000000FF); - argb |= ((buf[(i+g_offset)%__size] & 0x0000FF00)); - argb |= ((buf[(i+r_offset)%__size] & 0x00FF0000)); - argb |= (buf[i] & 0xFF000000); - __write(argb); + color_one |= (buf[(i+b_offset)%__size] & 0x000000ff); + color_one |= (buf[(i+g_offset)%__size] & 0x0000ff00); + color_one |= (buf[(i+r_offset)%__size] & 0x00ff0000); + color_one |= (buf[i] & 0xff000000); + __write(color_one); } } - - - -void WS2812::setAll(int colour) +void WS2812::setAll(int color) { + int color_one = ( __br << 24) | color; // for each of the data points in the buffer for (int i = 0; i < __size ; i++) { - __write(colour); - } -} - - -void WS2812::useII(int d) -{ - if (d > 0) { - __use_II = d; - } else { - __use_II = 0; + __write(color_one); } } - -void WS2812::setII(unsigned char II) +void WS2812::set_brightness_mode(BrightnessControl mode) { - __II = II; + __mode = mode; } - +void WS2812::set_brightness(unsigned char br) +{ + __br = br; +} void WS2812::__write(int color) { - - // Outut format : GGRRBB - // Inout format : IIRRGGBB - unsigned char agrb[4] = {0x0, 0x0, 0x0, 0x0}; - - unsigned char sf; // scaling factor for II - - // extract colour fields from incoming + // Input format(color) : GGRRBB + // Output format(agrb) : IIRRGGBB + unsigned char agrb[4]; + unsigned char sf; // scaling factor for II + // extract color fields from incoming // 0 = blue, 1 = red, 2 = green, 3 = brightness - agrb[0] = color & 0x000000FF; - agrb[1] = (color & 0x00FF0000) >> 16; - agrb[2] = (color & 0x0000FF00) >> 8; - agrb[3] = (color & 0xFF000000) >> 24; - - // set and intensity scaling factor (global, per pixel, none) - if (__use_II == 1) { - sf = __II; - } else if (__use_II == 2) { + agrb[0] = (unsigned char)color; + agrb[1] = (unsigned char)((color & 0x00ff0000) >> 16); + agrb[2] = (unsigned char)((color & 0x0000ff00) >> 8); + agrb[3] = (unsigned char)((color & 0xff000000) >> 24); + // set and intensity scaling factor (global, per pixel, none = Max) + if ( __mode == GLOBAL) { + sf = __br; + } else if ( __mode == PER_PIXEL) { sf = agrb[3]; } else { - sf = 0xFF; + sf = 0xff; } - - // Apply the scaling factor to each othe colour components + // Input format(agrb[4]) : IIRRGGBB + // Output format(agrb[3]) : RR*II, GG*II, BB*II + // Apply the scaling factor to each on the color components for (int clr = 2; clr >= 0; clr--) { - agrb[clr] = ((agrb[clr] * sf) >> 8); + agrb[clr] = (agrb[clr] * sf) >> 8; } - - // For each colour component G,R,B + // For each color component G,R,B // shift out the data 7..0, writing a SPI frame per bit // green=2,red=1,blue=0, - for (int clr = 2; clr >= 0; clr--) { - for (int bit = 7 ; bit >= 0 ; bit--) { - if (agrb[clr] & (0x1 << bit)) { + char bit_ptn[8] = {1, 2, 4, 8, 16, 32, 64, 128}; + for (int32_t clr = 2; clr >= 0; clr--) { + unsigned char dt = agrb[clr]; + for (int32_t bit = 7 ; bit >= 0 ; bit--) { + if (dt & bit_ptn[bit]) { __spi.write(WS1); } else { __spi.write(WS0); } + // debug purpose + //wait_us(30); } } } - - - - - - - -
--- a/WS2812.h Mon Aug 18 13:25:57 2014 +0000 +++ b/WS2812.h Fri Mar 20 06:46:11 2020 +0000 @@ -1,19 +1,61 @@ /* Copyright (c) 2012 cstyles, MIT License * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software - * and associated documentation files (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* + Modified by Kenji Arai / JH1PJL + March 20th, 2020 + + Original & Refrence + https://os.mbed.com/users/chris/code/ChrisRGB-Ring/ + https://os.mbed.com/users/chris/code/WS2812/ + https://os.mbed.com/users/chris/code/PixelArray/ + + https://os.mbed.com/users/bridadan/code/WS2812_Example/ + https://os.mbed.com/users/bridadan/code/WS2812/ + https://os.mbed.com/users/chris/code/PixelArray/ + + */ + +/* + !!!!! This library does NOT follow specification value of the timing !!!! + https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf + http://akizukidenshi.com/download/ds/adafruit/WS2812B.pdf + + WS2812 -> Interpretation of control timing (Not Grantee but works) + Specification + T0H 200 to 500ns + T1H 550 to 850ns + T0L 650 to 950ns + T1L 450 to 750ns + Reset 50us + Interpretation + T0H same as above + T1H same as above + T0L less than 10us + T1L Less than 10us + Reset over 50uS + + Please refer following web page + https://wp.josh.com/2014/05/13/ + ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ */ #ifndef WS2812_H @@ -21,11 +63,29 @@ #include "mbed.h" -#define WS1 0x38 -#define WS0 0x30 -#define SPICLK 5000000 -#define SPIBPF 6 - +#if \ + defined(TARGET_NUCLEO_F042K6)\ + || defined(TARGET_NUCLEO_F334R8)\ + || defined(TARGET_NUCLEO_F401RE)\ + || defined(TARGET_NUCLEO_F411RE)\ + || defined(TARGET_NUCLEO_F446RE)\ + || defined(TARGET_NUCLEO_L053R8)\ + || defined(TARGET_NUCLEO_L073RZ)\ + || defined(TARGET_NUCLEO_L152RE)\ + || defined(TARGET_NUCLEO_L476RG) +# define WS1 0x0f +# define WS0 0x0c +# define SPICLK 8000000 +# define SPIBPF 4 +#elif \ + defined(TARGET_RZ_A1H)\ + || defined(TARGET_GR_LYCHEE)\ + || defined(TARGET_GR_MANGO) +# define WS1 0x0f +# define WS0 0x0c +# define SPICLK 5000000 +# define SPIBPF 8 +#endif //!Library for the WS2812 RGB LED with integrated controller /*! @@ -34,38 +94,35 @@ class WS2812 { public: + enum BrightnessControl {OFF, GLOBAL, PER_PIXEL}; + //!Creates an instance of the class. /*! - Connect WS2812 address addr using SPI MOSI pins + Connect WS2812 using SPI MOSI pin(Only use) and MISO&SCLK(NC) */ - WS2812(PinName d, int size); + WS2812(PinName mosi, PinName miso, PinName sclk, int size); /*! Destroys instance. */ ~WS2812(); - //!Reads the current temperature. - /*! - Reads the temperature register of the LM75B and converts it to a useable value. - */ - void write (int buf[]); - void write_offsets (int buf[],int r_offset=0, int g_offset=0, int b_offset=0); - void setAll(int colour); + void write(int buf[]); + void write_offsets(int buf[], int r_offset = 0, + int g_offset = 0, int b_offset = 0); + void setAll(int color); - void useII(int d); - void setII(unsigned char II); - - + void set_brightness_mode(BrightnessControl mode); + void set_brightness(unsigned char br); private: + SPI __spi; + + void __write (int color); int __size; - unsigned char __II; - int __use_II; - SPI __spi; - void __write (int color); - + unsigned char __br; + BrightnessControl __mode; };