Xmas tree serial LED blinking example code
Fork of JBB_SerialLED_test by
WS2812B/LEDStrip_WS2812.cpp@2:20fc73d3b706, 2016-12-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |