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