change to enable to use new type of WS2812.

Dependencies:   mbed

Fork of LEDTape_WS2812 by Suga koubou

this program is forked from following programs. http://mbed.org/users/okini3939/code/LEDTape_WS2812/

differences

diffs from parent source.

- 1. adapted to new type of WS2812.

- 2. change output level to be reversed.

1.adapted to new type of WS2812.

CODE:0

 __________
|          |________________|

0.4[us] ±150[ns]     0.85[us] ±150[ns] 
(old module: 0.35[us] 0.8[us])

CODE:1

 _______________
|               |___________|

0.8[us] ±150[ns]     0.45[us] ±150[ns] 
(old module: 0.7[us] 0.6[us])

CODE:RET

     > 50[us] 
|______________________|

2. change output level to be reversed

mbed             LED module
----------+            +--------
Vcc       | ---------- | 5[v]
MOSI      | ---|>----- |  DIO
GND       | ---------- | GND
----------+            +--------

syntax : https://mbed.org/cookbook/Wiki-Syntax

Committer:
tkasa
Date:
Sun Dec 29 03:15:33 2013 +0000
Revision:
1:bbc584b629fa
Parent:
0:d067ddfe3df9
change to enable to use new type of WS2812.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d067ddfe3df9 1 /*
okini3939 0:d067ddfe3df9 2 * WS2812 tape led IC
okini3939 0:d067ddfe3df9 3 *
okini3939 0:d067ddfe3df9 4 * 0.35us 0.8us (+-150ns)
okini3939 0:d067ddfe3df9 5 * 0: |^^^^^|__________|
okini3939 0:d067ddfe3df9 6 *
okini3939 0:d067ddfe3df9 7 * 0.7us 0.6us (+-150ns)
okini3939 0:d067ddfe3df9 8 * 1: |^^^^^^^^^^|_____|
okini3939 0:d067ddfe3df9 9 *
okini3939 0:d067ddfe3df9 10 * >50us
okini3939 0:d067ddfe3df9 11 * RESET: |________________|
okini3939 0:d067ddfe3df9 12 */
okini3939 0:d067ddfe3df9 13 #include "mbed.h"
okini3939 0:d067ddfe3df9 14 #include "LEDStrip.h"
okini3939 0:d067ddfe3df9 15
okini3939 0:d067ddfe3df9 16 SPI tape(p11, p12, p13);
okini3939 0:d067ddfe3df9 17
okini3939 0:d067ddfe3df9 18 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d067ddfe3df9 19 LPC_SSP_TypeDef *_ssp = LPC_SSP0;
okini3939 0:d067ddfe3df9 20 #elif defined(TARGET_LPC11U24)
okini3939 0:d067ddfe3df9 21 LPC_SSPx_Type *_ssp = LPC_SSP1;
okini3939 0:d067ddfe3df9 22 #endif
okini3939 0:d067ddfe3df9 23
okini3939 0:d067ddfe3df9 24 int num = 100;
okini3939 0:d067ddfe3df9 25 int *data;
okini3939 0:d067ddfe3df9 26 volatile int busy = 0, wakeup = 0;
okini3939 0:d067ddfe3df9 27
okini3939 0:d067ddfe3df9 28
okini3939 0:d067ddfe3df9 29 extern "C"
okini3939 0:d067ddfe3df9 30 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d067ddfe3df9 31 void SSP0_IRQHandler() {
okini3939 0:d067ddfe3df9 32 #elif defined(TARGET_LPC11U24)
okini3939 0:d067ddfe3df9 33 void SSP1_IRQHandler() {
okini3939 0:d067ddfe3df9 34 #endif
okini3939 0:d067ddfe3df9 35 static int addr = 0, bit = 0x800000;
okini3939 0:d067ddfe3df9 36 repeat:
okini3939 0:d067ddfe3df9 37 if (busy) {
okini3939 0:d067ddfe3df9 38 // led data
okini3939 0:d067ddfe3df9 39 while (_ssp->SR & (1<<1)) { // TNF
okini3939 0:d067ddfe3df9 40 if (data[addr] & bit) {
okini3939 0:d067ddfe3df9 41 // 1
tkasa 1:bbc584b629fa 42 //_ssp->DR = 0x01f;
okini3939 0:d067ddfe3df9 43 _ssp->DR = 0x01f;
okini3939 0:d067ddfe3df9 44 } else {
okini3939 0:d067ddfe3df9 45 // 0
tkasa 1:bbc584b629fa 46 //_ssp->DR = 0x007;
tkasa 1:bbc584b629fa 47 _ssp->DR = 0x00F;
okini3939 0:d067ddfe3df9 48 }
okini3939 0:d067ddfe3df9 49 bit = bit >> 1;
okini3939 0:d067ddfe3df9 50 if (bit == 0) {
okini3939 0:d067ddfe3df9 51 bit = 0x800000;
okini3939 0:d067ddfe3df9 52 addr ++;
okini3939 0:d067ddfe3df9 53 if (addr >= num) {
okini3939 0:d067ddfe3df9 54 addr = 0;
okini3939 0:d067ddfe3df9 55 busy = 0;
okini3939 0:d067ddfe3df9 56 goto repeat;
okini3939 0:d067ddfe3df9 57 }
okini3939 0:d067ddfe3df9 58 }
okini3939 0:d067ddfe3df9 59 }
okini3939 0:d067ddfe3df9 60 } else {
okini3939 0:d067ddfe3df9 61 // blank
okini3939 0:d067ddfe3df9 62 while (_ssp->SR & (1<<1)) { // TNF
tkasa 1:bbc584b629fa 63 _ssp->DR = 0x000;
tkasa 1:bbc584b629fa 64 //_ssp->DR = 0xfff;
okini3939 0:d067ddfe3df9 65 if (addr < 50) {
okini3939 0:d067ddfe3df9 66 addr ++;
okini3939 0:d067ddfe3df9 67 } else {
okini3939 0:d067ddfe3df9 68 addr = 0;
okini3939 0:d067ddfe3df9 69 if (wakeup) {
okini3939 0:d067ddfe3df9 70 busy = 1;
okini3939 0:d067ddfe3df9 71 wakeup = 0;
okini3939 0:d067ddfe3df9 72 goto repeat;
okini3939 0:d067ddfe3df9 73 }
okini3939 0:d067ddfe3df9 74 }
okini3939 0:d067ddfe3df9 75 }
okini3939 0:d067ddfe3df9 76 }
okini3939 0:d067ddfe3df9 77 }
okini3939 0:d067ddfe3df9 78
okini3939 0:d067ddfe3df9 79 void tapeInit (int freq, int n) {
okini3939 0:d067ddfe3df9 80
okini3939 0:d067ddfe3df9 81 num = n;
okini3939 0:d067ddfe3df9 82 // data = new int(num);
okini3939 0:d067ddfe3df9 83 data = (int*)malloc(sizeof(int) * num);
okini3939 0:d067ddfe3df9 84 for (int i = 0; i < num; i ++) {
okini3939 0:d067ddfe3df9 85 data[i] = 0;
okini3939 0:d067ddfe3df9 86 }
okini3939 0:d067ddfe3df9 87
okini3939 0:d067ddfe3df9 88 tape.format(10, 1);
okini3939 0:d067ddfe3df9 89 if (freq) {
okini3939 0:d067ddfe3df9 90 tape.frequency(freq * 1000);
okini3939 0:d067ddfe3df9 91 } else {
okini3939 0:d067ddfe3df9 92 tape.frequency(8000000);
okini3939 0:d067ddfe3df9 93 }
okini3939 0:d067ddfe3df9 94 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d067ddfe3df9 95 NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
okini3939 0:d067ddfe3df9 96 NVIC_SetPriority(SSP0_IRQn, 0);
okini3939 0:d067ddfe3df9 97 NVIC_EnableIRQ(SSP0_IRQn);
okini3939 0:d067ddfe3df9 98 #elif defined(TARGET_LPC11U24)
okini3939 0:d067ddfe3df9 99 NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
okini3939 0:d067ddfe3df9 100 NVIC_SetPriority(SSP1_IRQn, 0);
okini3939 0:d067ddfe3df9 101 NVIC_EnableIRQ(SSP1_IRQn);
okini3939 0:d067ddfe3df9 102 #endif
okini3939 0:d067ddfe3df9 103 _ssp->IMSC |= (1<<3); // TXIM
okini3939 0:d067ddfe3df9 104 }
okini3939 0:d067ddfe3df9 105
okini3939 0:d067ddfe3df9 106 void tapeSet (int n, int dat) {
okini3939 0:d067ddfe3df9 107 if (n >= 0 && n < num) {
okini3939 0:d067ddfe3df9 108 // RGB -> GRB
okini3939 0:d067ddfe3df9 109 data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
okini3939 0:d067ddfe3df9 110 }
okini3939 0:d067ddfe3df9 111 }
okini3939 0:d067ddfe3df9 112
okini3939 0:d067ddfe3df9 113 void tapeSend () {
okini3939 0:d067ddfe3df9 114 if (busy) {
okini3939 0:d067ddfe3df9 115 while (busy);
okini3939 0:d067ddfe3df9 116 wait_us(50);
okini3939 0:d067ddfe3df9 117 }
okini3939 0:d067ddfe3df9 118 wakeup = 1;
okini3939 0:d067ddfe3df9 119 while (wakeup);
okini3939 0:d067ddfe3df9 120 }
okini3939 0:d067ddfe3df9 121
okini3939 0:d067ddfe3df9 122 int tapeGet (int n) {
okini3939 0:d067ddfe3df9 123 return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
okini3939 0:d067ddfe3df9 124 }