Ned Konz / Multi_WS2811

Dependents:   Multi_WS2811_test

Files at this revision

API Documentation at this revision

Comitter:
Ned Konz
Date:
Sat Jun 13 00:18:32 2015 -0700
Parent:
4:990838718b51
Commit message:
Worked out flapping and color animation

Changed in this revision

WS2811.cpp Show annotated file Show diff for this revision Revisions of this file
WS2811.h Show annotated file Show diff for this revision Revisions of this file
--- a/WS2811.cpp	Fri Jun 12 20:13:15 2015 -0700
+++ b/WS2811.cpp	Sat Jun 13 00:18:32 2015 -0700
@@ -39,7 +39,8 @@
 #define tpm_period       NSEC_TO_TICKS(CLK_NSEC)
 #define tpm_p0_period    NSEC_TO_TICKS(250)
 #define tpm_p1_period    NSEC_TO_TICKS(650)
-#define guardtime_period USEC_TO_TICKS(55)   /* guardtime minimum 50 usec. */
+#define guardtime_us     55
+#define guardtime_period USEC_TO_TICKS(guardtime_us)   /* guardtime minimum 50 usec. */
 
 enum DMA_MUX_SRC {
     DMA_MUX_SRC_TPM0_CH_0     = 24,
@@ -58,10 +59,11 @@
 template <unsigned MAX_LEDS_PER_STRIP>
 void WS2811<MAX_LEDS_PER_STRIP>::wait_for_dma_done()
 {
-#if 0
-    while (dma_done < 3)
-        wait_us(100);
-#endif
+    if ((DMA0->DMA[DMA_CHAN_1_LOW].DSR_BCR & DMA_DSR_BCR_BSY_MASK) == 0)
+        return;
+    while ((DMA0->DMA[DMA_CHAN_1_LOW].DSR_BCR & DMA_DSR_BCR_BSY_MASK))
+        __WFI();
+    wait_us(guardtime_us);
 }
 
 // class static
@@ -200,9 +202,6 @@
     // set TPM0 channel 1 for 0.7 usec (±150nsec) (1 code)
     // 1.25 usec * 2/3 = 833 nsec
     tpm->CONTROLS[1].CnV = tpm_p1_period;
-
-    NVIC_SetVector(TPM0_IRQn, (uint32_t)&TPM0_IRQHandler);
-    NVIC_EnableIRQ(TPM0_IRQn);
 }
 
 // class static
@@ -212,7 +211,6 @@
     if (!initialized) hw_init();
 
     wait_for_dma_done();
-    dma_done = 0;
 
     DMA_Type volatile * dma   = DMA0;
     TPM_Type volatile *tpm   = TPM0;
@@ -310,27 +308,7 @@
 
     tpm->SC = TPM_SC_TOF_MASK;  // reset TOF flag; disable internal clocking
 
-    dma_done++;
-
     SET_DEBUG;
-
-#if 0
-    // set TPM0 to interrrupt after guardtime
-    tpm->MOD = guardtime_period - 1; // 48MHz * 55 usec
-    tpm->CNT = 0;
-    tpm->SC  = TPM_SC_PS(0)        // 48MHz / 1 = 48MHz clock
-               | TPM_SC_TOIE_MASK  // enable interrupts
-               | TPM_SC_CMOD(1);   // and internal clocking
-#endif
-
-}
-
-extern "C" void TPM0_IRQHandler()
-{
-    TPM0->SC = 0; // disable internal clocking
-    TPM0->SC = TPM_SC_TOF_MASK;        
-    RESET_DEBUG;
-    dma_done = 3;
 }
 
 #endif
--- a/WS2811.h	Fri Jun 12 20:13:15 2015 -0700
+++ b/WS2811.h	Sat Jun 13 00:18:32 2015 -0700
@@ -61,26 +61,27 @@
 template <unsigned MAX_LEDS_PER_STRIP>
 class WS2811 : public LedStrip
 {
-public:    
+public:
     WS2811(unsigned n, unsigned pinNumber)
         : LedStrip(n)
         , pinMask(1U << pinNumber)
     {
         enabledPins |= pinMask;
-        initialized = false;
+        initialized  = false;
     }
 
     virtual void show()
     {
         uint16_t i, n = numPixels(); // 3 bytes per LED
         uint8_t *p = pixels;
-    
-        for (i=0; i<n; i++ ) {
+
+        for (i=0; i<n; i++ )
+        {
             writePixel(i, p);
             p += 3;
         }
     }
-    
+
     virtual void begin()
     {
         blank();
@@ -90,7 +91,7 @@
     virtual void blank()
     {
         std::memset(pixels, 0x00, numPixelBytes());
-    
+
         std::memset(dmaData.dmaWords, 0x00, sizeof(dmaData.dmaWords));
     }
 
@@ -116,7 +117,8 @@
 
     static void writeByte(uint8_t byte, uint32_t mask, uint32_t *dest)
     {
-        for (uint8_t bm = 0x80; bm; bm >>= 1) {
+        for (uint8_t bm = 0x80; bm; bm >>= 1)
+        {
             // MSBit first
             if (byte & bm)
                 *dest |= mask;
@@ -132,23 +134,24 @@
     static void dma_init();
     static void tpm_init();
     static void dma_data_init();
-        
+
     friend void TPM0_IRQHandler();
-    
-    static const unsigned DMA_LEADING_ZEROS = 2;
-    static const unsigned BITS_PER_RGB      = 24;
+
+    static const unsigned DMA_LEADING_ZEROS  = 2;
+    static const unsigned BITS_PER_RGB       = 24;
     static const unsigned DMA_TRAILING_ZEROS = 1;
 
-    struct DMALayout {
+    struct DMALayout
+    {
         uint32_t start_t1_low[ DMA_LEADING_ZEROS ];
         uint32_t dmaWords[ BITS_PER_RGB * MAX_LEDS_PER_STRIP ];
         uint32_t trailing_zeros_1[ DMA_TRAILING_ZEROS ];
-    
+
         uint32_t start_t0_high[ DMA_LEADING_ZEROS - 1 ];
         uint32_t allOnes[ BITS_PER_RGB * MAX_LEDS_PER_STRIP ];
         uint32_t trailing_zeros_2[ DMA_TRAILING_ZEROS + 1 ];
     };
-    
+
     static DMALayout dmaData;
 };