diff --git a/ws2812.c b/ws2812.c index 56a4054..d26b901 100644 --- a/ws2812.c +++ b/ws2812.c @@ -35,13 +35,19 @@ int ws2812_write(ws2812_t *dev, char *b, unsigned len) { return 0; } -#define ZERO_BIT_PULSE 0x8 // 1000 (0000) ~250ns -#define ONE_BIT_PULSE 0xE // 1110 (0000) ~750ns +#define ZERO_BIT_PULSE 0x08 // 1000 (0000) ~250ns +#define ONE_BIT_PULSE 0x0E // 1110 (0000) ~750ns -#define W00 0x88 -#define W01 0x8E -#define W10 0xE8 -#define W11 0xEE +#define CONCAT(bit0, bit1) (bit0 | (bit1 << 4)) +#define W00 CONCAT(ZERO_BIT_PULSE, ZERO_BIT_PULSE) +#define W01 CONCAT(ZERO_BIT_PULSE, ONE_BIT_PULSE) +#define W10 CONCAT(ONE_BIT_PULSE, ZERO_BIT_PULSE) +#define W11 CONCAT(ONE_BIT_PULSE, ONE_BIT_PULSE) + +/* #define W00 0x88 // 1000 1000 */ +/* #define W01 0x8E // 1000 1110 */ +/* #define W10 0xE8 */ +/* #define W11 0xEE */ void ws2812_fill_rgb(ws2812_rgb_t *leds, unsigned len, char* buffer){ int out_count = 0; @@ -58,16 +64,16 @@ void ws2812_fill_rgb(ws2812_rgb_t *leds, unsigned len, char* buffer){ buffer[out_count] = W00; break; case 0x1: - buffer[out_count] = W01; + buffer[out_count] = W10; break; case 0x2: - buffer[out_count] = W10; + buffer[out_count] = W01; break; case 0x3: buffer[out_count] = W11; break; } - cur_byte<<2; + cur_byte<<=2; /* buffer[out_count] = cur_byte & 0x80 ? ONE_BIT_PULSE : ZERO_BIT_PULSE; */ /* cur_byte <<=1; */ diff --git a/ws2812.h b/ws2812.h index b4c3b81..eb3d2c3 100644 --- a/ws2812.h +++ b/ws2812.h @@ -7,7 +7,9 @@ typedef struct { } ws2812_t; typedef struct __attribute__((packed)) { - char g,r,b; + char b; + char r; + char g; } ws2812_rgb_t; #define BLUE {0x00, 0x00, 0xFF}