hirobe aikawa
/
20160411_LEDTape_WS2812
TG-LPC11U35-501に対応
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Fri Jul 15 2022 21:59:55 by 1.7.2