Xmas tree serial LED blinking example code

Dependencies:   mbed

Fork of JBB_SerialLED_test by Junichi Katsu

Committer:
MACRUM
Date:
Mon Dec 12 08:22:19 2016 +0000
Revision:
2:20fc73d3b706
Parent:
1:832ea8c566a8
Change instance name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:57df396a2de8 1 /*
jksoft 0:57df396a2de8 2 * WS2812 tape led IC
jksoft 0:57df396a2de8 3 *
jksoft 0:57df396a2de8 4 * 0.35us 0.8us (+-150ns)
jksoft 0:57df396a2de8 5 * 0: |^^^^^|__________|
jksoft 0:57df396a2de8 6 *
jksoft 0:57df396a2de8 7 * 0.7us 0.6us (+-150ns)
jksoft 0:57df396a2de8 8 * 1: |^^^^^^^^^^|_____|
jksoft 0:57df396a2de8 9 *
jksoft 0:57df396a2de8 10 * >50us
jksoft 0:57df396a2de8 11 * RESET: |________________|
jksoft 0:57df396a2de8 12 */
jksoft 0:57df396a2de8 13 #include "mbed.h"
jksoft 0:57df396a2de8 14 #include "LEDStrip.h"
jksoft 0:57df396a2de8 15
MACRUM 1:832ea8c566a8 16 #if defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 17 SPI tape(dp2, NC, NC);
MACRUM 1:832ea8c566a8 18 #else
jksoft 0:57df396a2de8 19 SPI tape(p11, NC, NC);
MACRUM 1:832ea8c566a8 20 #endif
jksoft 0:57df396a2de8 21
jksoft 0:57df396a2de8 22 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
jksoft 0:57df396a2de8 23 LPC_SSP_TypeDef *_ssp = LPC_SSP0;
jksoft 0:57df396a2de8 24 #elif defined(TARGET_LPC11U24)
jksoft 0:57df396a2de8 25 LPC_SSPx_Type *_ssp = LPC_SSP1;
MACRUM 1:832ea8c566a8 26 #elif defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 27 LPC_SPI0_Type *_ssp = LPC_SPI0;
jksoft 0:57df396a2de8 28 #endif
jksoft 0:57df396a2de8 29
jksoft 0:57df396a2de8 30 int num = 100;
jksoft 0:57df396a2de8 31 int *data;
jksoft 0:57df396a2de8 32 volatile int busy = 0, wakeup = 0;
jksoft 0:57df396a2de8 33
jksoft 0:57df396a2de8 34
jksoft 0:57df396a2de8 35 extern "C"
jksoft 0:57df396a2de8 36 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
jksoft 0:57df396a2de8 37 void SSP0_IRQHandler() {
jksoft 0:57df396a2de8 38 #elif defined(TARGET_LPC11U24)
jksoft 0:57df396a2de8 39 void SSP1_IRQHandler() {
MACRUM 1:832ea8c566a8 40 #elif defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 41 void SPI0_IRQHandler() {
jksoft 0:57df396a2de8 42 #endif
jksoft 0:57df396a2de8 43 static int addr = 0, bit = 0x800000;
jksoft 0:57df396a2de8 44 repeat:
jksoft 0:57df396a2de8 45 if (busy) {
jksoft 0:57df396a2de8 46 // led data
MACRUM 1:832ea8c566a8 47 #if defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 48 while (_ssp->STAT & (1<<1)) { // TXRDY: Transmitter Ready flag.
MACRUM 1:832ea8c566a8 49 #else
MACRUM 1:832ea8c566a8 50 while (_ssp->SR & (1<<1)) { // TNF: Transmit FIFO Not Full
MACRUM 1:832ea8c566a8 51 #endif
jksoft 0:57df396a2de8 52 if (data[addr] & bit) {
jksoft 0:57df396a2de8 53 //_ssp->DR = 0x01f;
MACRUM 1:832ea8c566a8 54 #if defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 55 _ssp->TXDAT = 0x007;
MACRUM 1:832ea8c566a8 56 #else
jksoft 0:57df396a2de8 57 _ssp->DR = 0x007;
MACRUM 1:832ea8c566a8 58 #endif
jksoft 0:57df396a2de8 59 } else {
jksoft 0:57df396a2de8 60 // 0
MACRUM 1:832ea8c566a8 61 #if (TARGET_SSCI824)
MACRUM 1:832ea8c566a8 62 _ssp->TXDAT = 0x07f;
MACRUM 1:832ea8c566a8 63 #else
jksoft 0:57df396a2de8 64 _ssp->DR = 0x07f;
MACRUM 1:832ea8c566a8 65 #endif
jksoft 0:57df396a2de8 66 }
jksoft 0:57df396a2de8 67 bit = bit >> 1;
jksoft 0:57df396a2de8 68 if (bit == 0) {
jksoft 0:57df396a2de8 69 bit = 0x800000;
jksoft 0:57df396a2de8 70 addr ++;
jksoft 0:57df396a2de8 71 if (addr >= num) {
jksoft 0:57df396a2de8 72 addr = 0;
jksoft 0:57df396a2de8 73 busy = 0;
jksoft 0:57df396a2de8 74 goto repeat;
jksoft 0:57df396a2de8 75 }
jksoft 0:57df396a2de8 76 }
jksoft 0:57df396a2de8 77 }
jksoft 0:57df396a2de8 78 } else {
jksoft 0:57df396a2de8 79 // blank
MACRUM 1:832ea8c566a8 80 #if defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 81 while (_ssp->STAT & (1<<1)) { // TXRDY: Transmitter Ready flag.
MACRUM 1:832ea8c566a8 82 _ssp->TXDAT = 0xfff; // Data register
MACRUM 1:832ea8c566a8 83 #else
MACRUM 1:832ea8c566a8 84 while (_ssp->SR & (1<<1)) { // TNF: Transmit FIFO Not Full
MACRUM 1:832ea8c566a8 85 _ssp->DR = 0xfff; // Data register
MACRUM 1:832ea8c566a8 86 #endif
MACRUM 1:832ea8c566a8 87 if (addr < 500) {
jksoft 0:57df396a2de8 88 addr ++;
jksoft 0:57df396a2de8 89 } else {
jksoft 0:57df396a2de8 90 addr = 0;
jksoft 0:57df396a2de8 91 if (wakeup) {
jksoft 0:57df396a2de8 92 busy = 1;
jksoft 0:57df396a2de8 93 wakeup = 0;
jksoft 0:57df396a2de8 94 goto repeat;
jksoft 0:57df396a2de8 95 }
jksoft 0:57df396a2de8 96 }
jksoft 0:57df396a2de8 97 }
jksoft 0:57df396a2de8 98 }
jksoft 0:57df396a2de8 99 }
jksoft 0:57df396a2de8 100
jksoft 0:57df396a2de8 101 void tapeInit (int freq, int n) {
jksoft 0:57df396a2de8 102
jksoft 0:57df396a2de8 103 num = n;
jksoft 0:57df396a2de8 104 // data = new int(num);
jksoft 0:57df396a2de8 105 data = (int*)malloc(sizeof(int) * num);
jksoft 0:57df396a2de8 106 for (int i = 0; i < num; i ++) {
jksoft 0:57df396a2de8 107 data[i] = 0;
jksoft 0:57df396a2de8 108 }
jksoft 0:57df396a2de8 109
jksoft 0:57df396a2de8 110 tape.format(10, 1);
jksoft 0:57df396a2de8 111 if (freq) {
jksoft 0:57df396a2de8 112 tape.frequency(freq * 1000);
jksoft 0:57df396a2de8 113 } else {
jksoft 0:57df396a2de8 114 tape.frequency(8000000);
jksoft 0:57df396a2de8 115 }
jksoft 0:57df396a2de8 116 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
jksoft 0:57df396a2de8 117 NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
jksoft 0:57df396a2de8 118 NVIC_SetPriority(SSP0_IRQn, 0);
jksoft 0:57df396a2de8 119 NVIC_EnableIRQ(SSP0_IRQn);
jksoft 0:57df396a2de8 120 #elif defined(TARGET_LPC11U24)
jksoft 0:57df396a2de8 121 NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
jksoft 0:57df396a2de8 122 NVIC_SetPriority(SSP1_IRQn, 0);
jksoft 0:57df396a2de8 123 NVIC_EnableIRQ(SSP1_IRQn);
MACRUM 1:832ea8c566a8 124 #elif defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 125 NVIC_SetVector(SPI0_IRQn, (uint32_t)SPI0_IRQHandler);
MACRUM 1:832ea8c566a8 126 NVIC_SetPriority(SPI0_IRQn, 0);
MACRUM 1:832ea8c566a8 127 NVIC_EnableIRQ(SPI0_IRQn);
jksoft 0:57df396a2de8 128 #endif
MACRUM 1:832ea8c566a8 129
MACRUM 1:832ea8c566a8 130 #if defined(TARGET_SSCI824)
MACRUM 1:832ea8c566a8 131 _ssp->INTENSET |= (1<<1); // TXRDYEN: An interrupt will be generated when data may be written to TXDAT.
MACRUM 1:832ea8c566a8 132 #else
MACRUM 1:832ea8c566a8 133 _ssp->IMSC |= (1<<3); // TXIM: to enable interrupt when the Tx FIFO is at least half empty.
MACRUM 1:832ea8c566a8 134 #endif
jksoft 0:57df396a2de8 135 }
jksoft 0:57df396a2de8 136
jksoft 0:57df396a2de8 137 void tapeSet (int n, int dat) {
jksoft 0:57df396a2de8 138 if (n >= 0 && n < num) {
jksoft 0:57df396a2de8 139 // RGB -> GRB
jksoft 0:57df396a2de8 140 data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
jksoft 0:57df396a2de8 141 }
jksoft 0:57df396a2de8 142 }
jksoft 0:57df396a2de8 143 void tapeSet(int n, int red , int green , int blue) {
jksoft 0:57df396a2de8 144 if (n >= 0 && n < num) {
jksoft 0:57df396a2de8 145 // RGB -> GRB
jksoft 0:57df396a2de8 146 data[n] = ((red & 0xff) << 8) | ((green & 0xff) << 16) | (blue & 0xff);
jksoft 0:57df396a2de8 147 }
jksoft 0:57df396a2de8 148 }
jksoft 0:57df396a2de8 149
jksoft 0:57df396a2de8 150 void tapeSend () {
jksoft 0:57df396a2de8 151 if (busy) {
jksoft 0:57df396a2de8 152 while (busy);
jksoft 0:57df396a2de8 153 wait_us(50);
jksoft 0:57df396a2de8 154 }
jksoft 0:57df396a2de8 155 wakeup = 1;
jksoft 0:57df396a2de8 156 while (wakeup);
jksoft 0:57df396a2de8 157 }
jksoft 0:57df396a2de8 158
jksoft 0:57df396a2de8 159 int tapeGet (int n) {
jksoft 0:57df396a2de8 160 return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
jksoft 0:57df396a2de8 161 }