change to enable to use new type of WS2812.
Fork of LEDTape_WS2812 by
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 }
Generated on Sun Aug 7 2022 23:59:33 by 1.7.2