Dependencies:   mbed

Fork of LEDTape_WS2812 by takara kasai

Committer:
Recmo
Date:
Wed Jan 15 18:12:03 2014 +0000
Revision:
3:b3caff436106
Parent:
2:cdeeeea6ce2e
Experiments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d067ddfe3df9 1 /*
okini3939 0:d067ddfe3df9 2 * WS2812 tape led IC
okini3939 0:d067ddfe3df9 3 *
okini3939 0:d067ddfe3df9 4 * 0.35us 0.8us (+-150ns)
okini3939 0:d067ddfe3df9 5 * 0: |^^^^^|__________|
okini3939 0:d067ddfe3df9 6 *
okini3939 0:d067ddfe3df9 7 * 0.7us 0.6us (+-150ns)
okini3939 0:d067ddfe3df9 8 * 1: |^^^^^^^^^^|_____|
okini3939 0:d067ddfe3df9 9 *
okini3939 0:d067ddfe3df9 10 * >50us
okini3939 0:d067ddfe3df9 11 * RESET: |________________|
okini3939 0:d067ddfe3df9 12 */
okini3939 0:d067ddfe3df9 13 #include "mbed.h"
okini3939 0:d067ddfe3df9 14 #include "LEDStrip.h"
okini3939 0:d067ddfe3df9 15
okini3939 0:d067ddfe3df9 16 SPI tape(p11, p12, p13);
okini3939 0:d067ddfe3df9 17
okini3939 0:d067ddfe3df9 18 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d067ddfe3df9 19 LPC_SSP_TypeDef *_ssp = LPC_SSP0;
okini3939 0:d067ddfe3df9 20 #elif defined(TARGET_LPC11U24)
okini3939 0:d067ddfe3df9 21 LPC_SSPx_Type *_ssp = LPC_SSP1;
okini3939 0:d067ddfe3df9 22 #endif
okini3939 0:d067ddfe3df9 23
okini3939 0:d067ddfe3df9 24 int num = 100;
okini3939 0:d067ddfe3df9 25 int *data;
okini3939 0:d067ddfe3df9 26 volatile int busy = 0, wakeup = 0;
okini3939 0:d067ddfe3df9 27
okini3939 0:d067ddfe3df9 28
okini3939 0:d067ddfe3df9 29 extern "C"
okini3939 0:d067ddfe3df9 30 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d067ddfe3df9 31 void SSP0_IRQHandler() {
okini3939 0:d067ddfe3df9 32 #elif defined(TARGET_LPC11U24)
okini3939 0:d067ddfe3df9 33 void SSP1_IRQHandler() {
okini3939 0:d067ddfe3df9 34 #endif
okini3939 0:d067ddfe3df9 35 static int addr = 0, bit = 0x800000;
okini3939 0:d067ddfe3df9 36 repeat:
okini3939 0:d067ddfe3df9 37 if (busy) {
okini3939 0:d067ddfe3df9 38 // led data
okini3939 0:d067ddfe3df9 39 while (_ssp->SR & (1<<1)) { // TNF
okini3939 0:d067ddfe3df9 40 if (data[addr] & bit) {
okini3939 0:d067ddfe3df9 41 // 1
tkasa 1:bbc584b629fa 42 //_ssp->DR = 0x01f;
Recmo 2:cdeeeea6ce2e 43 _ssp->DR = ~0x01f;
okini3939 0:d067ddfe3df9 44 } else {
okini3939 0:d067ddfe3df9 45 // 0
tkasa 1:bbc584b629fa 46 //_ssp->DR = 0x007;
Recmo 2:cdeeeea6ce2e 47 //_ssp->DR = 0x00F;
Recmo 2:cdeeeea6ce2e 48 _ssp->DR = ~0x00F;
okini3939 0:d067ddfe3df9 49 }
okini3939 0:d067ddfe3df9 50 bit = bit >> 1;
okini3939 0:d067ddfe3df9 51 if (bit == 0) {
okini3939 0:d067ddfe3df9 52 bit = 0x800000;
okini3939 0:d067ddfe3df9 53 addr ++;
okini3939 0:d067ddfe3df9 54 if (addr >= num) {
okini3939 0:d067ddfe3df9 55 addr = 0;
okini3939 0:d067ddfe3df9 56 busy = 0;
okini3939 0:d067ddfe3df9 57 goto repeat;
okini3939 0:d067ddfe3df9 58 }
okini3939 0:d067ddfe3df9 59 }
okini3939 0:d067ddfe3df9 60 }
okini3939 0:d067ddfe3df9 61 } else {
okini3939 0:d067ddfe3df9 62 // blank
okini3939 0:d067ddfe3df9 63 while (_ssp->SR & (1<<1)) { // TNF
tkasa 1:bbc584b629fa 64 _ssp->DR = 0x000;
tkasa 1:bbc584b629fa 65 //_ssp->DR = 0xfff;
okini3939 0:d067ddfe3df9 66 if (addr < 50) {
okini3939 0:d067ddfe3df9 67 addr ++;
okini3939 0:d067ddfe3df9 68 } else {
okini3939 0:d067ddfe3df9 69 addr = 0;
okini3939 0:d067ddfe3df9 70 if (wakeup) {
okini3939 0:d067ddfe3df9 71 busy = 1;
okini3939 0:d067ddfe3df9 72 wakeup = 0;
okini3939 0:d067ddfe3df9 73 goto repeat;
okini3939 0:d067ddfe3df9 74 }
okini3939 0:d067ddfe3df9 75 }
okini3939 0:d067ddfe3df9 76 }
okini3939 0:d067ddfe3df9 77 }
okini3939 0:d067ddfe3df9 78 }
okini3939 0:d067ddfe3df9 79
okini3939 0:d067ddfe3df9 80 void tapeInit (int freq, int n) {
okini3939 0:d067ddfe3df9 81
okini3939 0:d067ddfe3df9 82 num = n;
okini3939 0:d067ddfe3df9 83 // data = new int(num);
okini3939 0:d067ddfe3df9 84 data = (int*)malloc(sizeof(int) * num);
okini3939 0:d067ddfe3df9 85 for (int i = 0; i < num; i ++) {
okini3939 0:d067ddfe3df9 86 data[i] = 0;
okini3939 0:d067ddfe3df9 87 }
okini3939 0:d067ddfe3df9 88
okini3939 0:d067ddfe3df9 89 tape.format(10, 1);
okini3939 0:d067ddfe3df9 90 if (freq) {
okini3939 0:d067ddfe3df9 91 tape.frequency(freq * 1000);
okini3939 0:d067ddfe3df9 92 } else {
okini3939 0:d067ddfe3df9 93 tape.frequency(8000000);
okini3939 0:d067ddfe3df9 94 }
okini3939 0:d067ddfe3df9 95 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d067ddfe3df9 96 NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
okini3939 0:d067ddfe3df9 97 NVIC_SetPriority(SSP0_IRQn, 0);
okini3939 0:d067ddfe3df9 98 NVIC_EnableIRQ(SSP0_IRQn);
okini3939 0:d067ddfe3df9 99 #elif defined(TARGET_LPC11U24)
okini3939 0:d067ddfe3df9 100 NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
okini3939 0:d067ddfe3df9 101 NVIC_SetPriority(SSP1_IRQn, 0);
okini3939 0:d067ddfe3df9 102 NVIC_EnableIRQ(SSP1_IRQn);
okini3939 0:d067ddfe3df9 103 #endif
okini3939 0:d067ddfe3df9 104 _ssp->IMSC |= (1<<3); // TXIM
okini3939 0:d067ddfe3df9 105 }
okini3939 0:d067ddfe3df9 106
okini3939 0:d067ddfe3df9 107 void tapeSet (int n, int dat) {
okini3939 0:d067ddfe3df9 108 if (n >= 0 && n < num) {
okini3939 0:d067ddfe3df9 109 // RGB -> GRB
okini3939 0:d067ddfe3df9 110 data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
okini3939 0:d067ddfe3df9 111 }
okini3939 0:d067ddfe3df9 112 }
okini3939 0:d067ddfe3df9 113
okini3939 0:d067ddfe3df9 114 void tapeSend () {
okini3939 0:d067ddfe3df9 115 if (busy) {
okini3939 0:d067ddfe3df9 116 while (busy);
okini3939 0:d067ddfe3df9 117 wait_us(50);
okini3939 0:d067ddfe3df9 118 }
okini3939 0:d067ddfe3df9 119 wakeup = 1;
okini3939 0:d067ddfe3df9 120 while (wakeup);
okini3939 0:d067ddfe3df9 121 }
okini3939 0:d067ddfe3df9 122
okini3939 0:d067ddfe3df9 123 int tapeGet (int n) {
okini3939 0:d067ddfe3df9 124 return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
okini3939 0:d067ddfe3df9 125 }