test

Dependencies:   EthernetInterface Milkcocoa_EthernetIF mbed-rtos mbed

Fork of MilkcocoaSample_Eth by Junichi Katsu

Committer:
jksoft
Date:
Tue Oct 31 09:26:44 2017 +0000
Revision:
9:561182aac695
??

Who changed what in which revision?

UserRevisionLine numberNew 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 }