TG-LPC11U35-501に対応

Dependencies:   mbed

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) || defined(TARGET_LPC11U35_501)
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) || defined(TARGET_LPC11U35_501)
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;   // パルスデータ変更 20160413
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             if (addr < 51) {    //  ループ回数1回増量 20160413
00067                 addr ++;
00068             } else {
00069                 addr = 0;
00070                 if (wakeup) {
00071                     busy = 1;
00072                     wakeup = 0;
00073                     goto repeat;
00074                 }
00075             }
00076         }
00077     }
00078 }
00079 
00080 void tapeInit (int freq, int n) {
00081 
00082     num = n;
00083 //    data = new int(num);
00084     data = (int*)malloc(sizeof(int) * num);
00085     for (int i = 0; i < num; i ++) {
00086         data[i] = 0;
00087     }
00088 
00089     tape.format(10, 1);
00090     if (freq) {
00091         tape.frequency(freq * 1000);
00092     } else {
00093         tape.frequency(8000000);
00094     }
00095 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00096     NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
00097     NVIC_SetPriority(SSP0_IRQn, 0);
00098     NVIC_EnableIRQ(SSP0_IRQn);
00099 #elif defined(TARGET_LPC11U24) || defined(TARGET_LPC11U35_501)
00100     NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
00101     NVIC_SetPriority(SSP1_IRQn, 0);
00102     NVIC_EnableIRQ(SSP1_IRQn);
00103 #endif
00104     _ssp->IMSC |= (1<<3); // TXIM
00105 }
00106 
00107 void tapeSet (int n, int dat) {
00108     if (n >= 0 && n < num) {
00109         // RGB -> GRB
00110         data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
00111     }
00112 }
00113 
00114 void tapeSend () {
00115     if (busy) {
00116         while (busy);
00117         wait_us(50);
00118     }
00119     wakeup = 1;
00120     while (wakeup);
00121 }
00122 
00123 int tapeGet (int n) {
00124     return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
00125 }