see: http://mbed.org/users/okini3939/notebook/led_strip/

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
okini3939
Date:
Mon Jul 08 01:34:51 2013 +0000
Commit message:
1st build;

Changed in this revision

LEDStrip.h Show annotated file Show diff for this revision Revisions of this file
LEDStrip_WS2812.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r d067ddfe3df9 LEDStrip.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LEDStrip.h	Mon Jul 08 01:34:51 2013 +0000
@@ -0,0 +1,5 @@
+
+void tape_write (int d);
+void tapeInit (int speed, int n);
+void tapeSet (int n, int dat);
+void tapeSend ();
diff -r 000000000000 -r d067ddfe3df9 LEDStrip_WS2812.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LEDStrip_WS2812.cpp	Mon Jul 08 01:34:51 2013 +0000
@@ -0,0 +1,121 @@
+/*
+ * WS2812 tape led IC
+ *
+ *          0.35us   0.8us    (+-150ns)
+ *  0:     |^^^^^|__________|
+ *
+ *             0.7us   0.6us  (+-150ns)
+ *  1:     |^^^^^^^^^^|_____|
+ *
+ *               >50us
+ *  RESET: |________________|
+ */
+#include "mbed.h"
+#include "LEDStrip.h"
+
+SPI tape(p11, p12, p13);
+
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+    LPC_SSP_TypeDef *_ssp = LPC_SSP0;
+#elif defined(TARGET_LPC11U24)
+    LPC_SSPx_Type *_ssp = LPC_SSP1;
+#endif
+
+int num = 100;
+int *data;
+volatile int busy = 0, wakeup = 0;
+
+
+extern "C"
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+void SSP0_IRQHandler() {
+#elif defined(TARGET_LPC11U24)
+void SSP1_IRQHandler() {
+#endif
+    static int addr = 0, bit = 0x800000;
+repeat:
+    if (busy) {
+        // led data
+      while (_ssp->SR & (1<<1)) { // TNF
+        if (data[addr] & bit) {
+            // 1
+            _ssp->DR = 0x01f;
+        } else {
+            // 0
+            _ssp->DR = 0x07f;
+        }
+        bit = bit >> 1;
+        if (bit == 0) {
+            bit = 0x800000;
+            addr ++;
+            if (addr >= num) {
+                addr = 0;
+                busy = 0;
+                goto repeat;
+            }
+        }
+      }
+    } else {
+        // blank
+        while (_ssp->SR & (1<<1)) { // TNF
+            _ssp->DR = 0xfff;
+            if (addr < 50) {
+                addr ++;
+            } else {
+                addr = 0;
+                if (wakeup) {
+                    busy = 1;
+                    wakeup = 0;
+                    goto repeat;
+                }
+            }
+        }
+    }
+}
+
+void tapeInit (int freq, int n) {
+
+    num = n;
+//    data = new int(num);
+    data = (int*)malloc(sizeof(int) * num);
+    for (int i = 0; i < num; i ++) {
+        data[i] = 0;
+    }
+
+    tape.format(10, 1);
+    if (freq) {
+        tape.frequency(freq * 1000);
+    } else {
+        tape.frequency(8000000);
+    }
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+    NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
+    NVIC_SetPriority(SSP0_IRQn, 0);
+    NVIC_EnableIRQ(SSP0_IRQn);
+#elif defined(TARGET_LPC11U24)
+    NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
+    NVIC_SetPriority(SSP1_IRQn, 0);
+    NVIC_EnableIRQ(SSP1_IRQn);
+#endif
+    _ssp->IMSC |= (1<<3); // TXIM
+}
+
+void tapeSet (int n, int dat) {
+    if (n >= 0 && n < num) {
+        // RGB -> GRB
+        data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
+    }
+}
+
+void tapeSend () {
+    if (busy) {
+        while (busy);
+        wait_us(50);
+    }
+    wakeup = 1;
+    while (wakeup);
+}
+
+int tapeGet (int n) {
+    return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
+}
diff -r 000000000000 -r d067ddfe3df9 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 08 01:34:51 2013 +0000
@@ -0,0 +1,44 @@
+/*
+ * WS2812 tape led IC
+ */
+#include "mbed.h"
+#include "LEDStrip.h"
+
+Serial pc(USBTX, USBRX);
+DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
+
+extern "C"
+void HardFault_Handler() {
+    printf("Hard Fault!\r\n");
+    exit(-1);
+}
+
+int main() {
+    int i, j, k = 0;
+
+    pc.baud(115200);
+    tapeInit(0, 16);
+    led1 = 1;
+
+    pc.printf("led\r\n");
+
+    for (;;) {
+        for (i = 0; i < 256; i ++) {
+            led2 = 1;
+            tapeSet(0, (i << 16));
+            tapeSet(2, (i << 8));
+            tapeSet(4, i);
+            tapeSet(6, (i << 8)|i);
+            tapeSet(7, (i << 16)|i);
+            tapeSet(8, (i << 16)|(i << 8));
+            tapeSet(9, (i << 16)|(i << 8)|i);
+            tapeSend();
+            led2 = 0;
+            wait_ms(20);
+        }
+        for (i = 0; i < 160; i ++) {
+            tapeSet(i, 0);
+        }
+        tapeSend();
+    }
+}
diff -r 000000000000 -r d067ddfe3df9 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Jul 08 01:34:51 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/b3110cd2dd17
\ No newline at end of file