It is a program to turn on the LED serial two Jksoft Blue mbed Board. Jksoft Blue mbed Boardの2つのシリアルLEDを点灯させるプログラムです。

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, NC, NC);
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 = 0x007;
00044         } else {
00045             // 0
00046             _ssp->DR = 0x07f;
00047         }
00048         bit = bit >> 1;
00049         if (bit == 0) {
00050             bit = 0x800000;
00051             addr ++;
00052             if (addr >= num) {
00053                 addr = 0;
00054                 busy = 0;
00055                 goto repeat;
00056             }
00057         }
00058       }
00059     } else {
00060         // blank
00061         while (_ssp->SR & (1<<1)) { // TNF
00062             _ssp->DR = 0xfff;
00063             if (addr < 50) {
00064                 addr ++;
00065             } else {
00066                 addr = 0;
00067                 if (wakeup) {
00068                     busy = 1;
00069                     wakeup = 0;
00070                     goto repeat;
00071                 }
00072             }
00073         }
00074     }
00075 }
00076 
00077 void tapeInit (int freq, int n) {
00078 
00079     num = n;
00080 //    data = new int(num);
00081     data = (int*)malloc(sizeof(int) * num);
00082     for (int i = 0; i < num; i ++) {
00083         data[i] = 0;
00084     }
00085 
00086     tape.format(10, 1);
00087     if (freq) {
00088         tape.frequency(freq * 1000);
00089     } else {
00090         tape.frequency(8000000);
00091     }
00092 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00093     NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
00094     NVIC_SetPriority(SSP0_IRQn, 0);
00095     NVIC_EnableIRQ(SSP0_IRQn);
00096 #elif defined(TARGET_LPC11U24)
00097     NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
00098     NVIC_SetPriority(SSP1_IRQn, 0);
00099     NVIC_EnableIRQ(SSP1_IRQn);
00100 #endif
00101     _ssp->IMSC |= (1<<3); // TXIM
00102 }
00103 
00104 void tapeSet (int n, int dat) {
00105     if (n >= 0 && n < num) {
00106         // RGB -> GRB
00107         data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
00108     }
00109 }
00110 void tapeSet(int n, int red , int green , int blue) {
00111     if (n >= 0 && n < num) {
00112         // RGB -> GRB
00113         data[n] = ((red & 0xff) << 8) | ((green & 0xff) << 16) | (blue & 0xff);
00114     }
00115 }
00116 
00117 void tapeSend () {
00118     if (busy) {
00119         while (busy);
00120         wait_us(50);
00121     }
00122     wakeup = 1;
00123     while (wakeup);
00124 }
00125 
00126 int tapeGet (int n) {
00127     return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
00128 }