change to enable to use new type of WS2812.

Dependencies:   mbed

Fork of LEDTape_WS2812 by Suga koubou

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LEDStrip_WS2812.cpp Source File

LEDStrip_WS2812.cpp

00001 /*
00002  * WS2812 tape led IC
00003  *
00004  *          0.35us   0.8us    (+-150ns)
00005  *  0:     |^^^^^|__________|
00006  *
00007  *             0.7us   0.6us  (+-150ns)
00008  *  1:     |^^^^^^^^^^|_____|
00009  *
00010  *               >50us
00011  *  RESET: |________________|
00012  */
00013 #include "mbed.h"
00014 #include "LEDStrip.h"
00015 
00016 SPI tape(p11, p12, p13);
00017 
00018 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00019     LPC_SSP_TypeDef *_ssp = LPC_SSP0;
00020 #elif defined(TARGET_LPC11U24)
00021     LPC_SSPx_Type *_ssp = LPC_SSP1;
00022 #endif
00023 
00024 int num = 100;
00025 int *data;
00026 volatile int busy = 0, wakeup = 0;
00027 
00028 
00029 extern "C"
00030 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00031 void SSP0_IRQHandler() {
00032 #elif defined(TARGET_LPC11U24)
00033 void SSP1_IRQHandler() {
00034 #endif
00035     static int addr = 0, bit = 0x800000;
00036 repeat:
00037     if (busy) {
00038         // led data
00039       while (_ssp->SR & (1<<1)) { // TNF
00040         if (data[addr] & bit) {
00041             // 1
00042             //_ssp->DR = 0x01f;
00043             _ssp->DR = 0x01f;
00044         } else {
00045             // 0
00046             //_ssp->DR = 0x007;
00047             _ssp->DR = 0x00F;
00048         }
00049         bit = bit >> 1;
00050         if (bit == 0) {
00051             bit = 0x800000;
00052             addr ++;
00053             if (addr >= num) {
00054                 addr = 0;
00055                 busy = 0;
00056                 goto repeat;
00057             }
00058         }
00059       }
00060     } else {
00061         // blank
00062         while (_ssp->SR & (1<<1)) { // TNF
00063             _ssp->DR = 0x000;
00064             //_ssp->DR = 0xfff;
00065             if (addr < 50) {
00066                 addr ++;
00067             } else {
00068                 addr = 0;
00069                 if (wakeup) {
00070                     busy = 1;
00071                     wakeup = 0;
00072                     goto repeat;
00073                 }
00074             }
00075         }
00076     }
00077 }
00078 
00079 void tapeInit (int freq, int n) {
00080 
00081     num = n;
00082 //    data = new int(num);
00083     data = (int*)malloc(sizeof(int) * num);
00084     for (int i = 0; i < num; i ++) {
00085         data[i] = 0;
00086     }
00087 
00088     tape.format(10, 1);
00089     if (freq) {
00090         tape.frequency(freq * 1000);
00091     } else {
00092         tape.frequency(8000000);
00093     }
00094 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00095     NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
00096     NVIC_SetPriority(SSP0_IRQn, 0);
00097     NVIC_EnableIRQ(SSP0_IRQn);
00098 #elif defined(TARGET_LPC11U24)
00099     NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
00100     NVIC_SetPriority(SSP1_IRQn, 0);
00101     NVIC_EnableIRQ(SSP1_IRQn);
00102 #endif
00103     _ssp->IMSC |= (1<<3); // TXIM
00104 }
00105 
00106 void tapeSet (int n, int dat) {
00107     if (n >= 0 && n < num) {
00108         // RGB -> GRB
00109         data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
00110     }
00111 }
00112 
00113 void tapeSend () {
00114     if (busy) {
00115         while (busy);
00116         wait_us(50);
00117     }
00118     wakeup = 1;
00119     while (wakeup);
00120 }
00121 
00122 int tapeGet (int n) {
00123     return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
00124 }