Programming an array of NeoPixels using the GPDMA for maximum performance.

Dependencies:   MODDMA mbed

Files at this revision

API Documentation at this revision

Comitter:
tohu
Date:
Sat Dec 06 12:19:28 2014 +0000
Parent:
1:b6ae9e61d764
Child:
3:96f4cc4c5984
Commit message:
F?rsta versionen som ? h t p?verkar LEDarna. Funkar d?ligt dock.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Sat Dec 06 10:45:10 2014 +0000
+++ b/main.cpp	Sat Dec 06 12:19:28 2014 +0000
@@ -18,18 +18,20 @@
 // IMAGE AND RENDER BUFFER
 //
 
+// NOTE: BRG!!!!
+
 uint8_t  smiley [IMAGE_SIZE] = {
-    0x0,0x0,0x1F,0x0,0x0,0x1F,0x0,0x0,0x1F,0x0,0x0,0x1F,0x0,0x0,0x1F,
-    0x0,0x0,0x3E,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0x0,0x0,0x3E,
-    0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x0,
-    0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,
-    0xFF,0xFF,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFF,0xFF,0x0,
-    0x0,0x0,0xBA,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0x0,0x0,0xBA,
-    0x0,0x0,0xD9,0x0,0x0,0xD9,0x0,0x0,0xD9,0x0,0x0,0xD9,0x0,0x0,0xD9,
-    0x0,0x0,0xFF,0x0,0x0,0xFF,0x0,0x0,0xFF,0x0,0x0,0xFF,0x0,0x0,0xFF
-};
+    0xFF,0x0,0x0,0xD9,0x0,0x0,0xBA,0x0,0x0,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x3E,0x0,0x0,0x1F,0x0,0x0,
+    0xFF,0x0,0x0,0xD9,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x1F,0x0,0x0,
+    0xFF,0x0,0x0,0xD9,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x1F,0x0,0x0,
+    0xFF,0x0,0x0,0xD9,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0x0,0x0,0xFF,0xFF,0x1F,0x0,0x0,
+    0xFF,0x0,0x0,0xD9,0x0,0x0,0xBA,0x0,0x0,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x0,0xFF,0xFF,0x3E,0x0,0x0,0x1F,0x0,0x0};
 
-uint8_t renderBuffer[IMAGE_SIZE*3];
+
+uint8_t *renderBuffer;
+#if 0
+[IMAGE_SIZE*4];
+#endif
 
 void copyImageToRender(uint8_t *image, uint8_t *buffer, size_t len);
 
@@ -46,8 +48,11 @@
 bool flgCompleted = false;
 bool flgFailed = false;
 
+SPI spi(p11, NC, p13);
+
 int main()
 {
+    
     // Setup the serial port to print out results.
     pc.baud(115200);
 
@@ -56,32 +61,41 @@
     led3 = false;
     led4 = false;
 
+    renderBuffer = (uint8_t *) malloc(IMAGE_SIZE*4);
+
     // Set up the image to render
     copyImageToRender(smiley, renderBuffer, IMAGE_SIZE);
 
+    spi.format(16);
+    spi.frequency(2800000);
+
+#if 0
     // SET SPI OUTPUT PINS
-    LPC_PINCON->PINSEL1 |= 3; // SSEL0
-    LPC_PINCON->PINSEL1 |= (3<<2); // MISO0
+    LPC_PINCON->PINSEL0 |= (3u<<30); // SCK0
+    // LPC_PINCON->PINSEL1 |= (3<<2); // MISO0
     LPC_PINCON->PINSEL1 |= (3<<4); // MOSI0
+#endif
 
+    // TODO: THIS COULD POSSIBLY FUCK UP THE AMOUNT OF DATA MOVED TO THE SSP IN EACH BURST
     // Configure the DMA
     dmaConfig = new MODDMA_Config;
     dmaConfig
     ->channelNum    ( MODDMA::Channel_0 )
     ->srcMemAddr    ( (uint32_t) renderBuffer )
     ->dstMemAddr    ( MODDMA::SSP0_Tx )
-    ->transferSize  ( IMAGE_SIZE*3 )
+    ->transferSize  ( IMAGE_SIZE*4 )
     ->transferType  ( MODDMA::m2p )
     ->dstConn       ( MODDMA::SSP0_Tx )
     ->attach_tc     ( &TC_callback )
     ->attach_err    ( &ERR_callback )
     ;
+    LPC_SSP0->DMACR = (1<<1)|(1<<0); // TX,RXDMAE
     
+    #if 0
     // Set up SSP0 (SPI)
-    LPC_GPDMA->DMACSoftSReq = 0xC;
-    
-    NVIC_EnableIRQ(DMA_IRQn);
-        
+    //LPC_GPDMA->DMACSoftSReq = 0xC;
+    //NVIC_EnableIRQ(DMA_IRQn);
+      
     // SET THE CLOCK AND POWER THE SSP0 UP
     LPC_SC->PCLKSEL0 &= ~(2<<10); // PCLK_SSP0 = CCLK/2 (96MHz)
     LPC_SSP0->CPSR = 10; // CPSDVSR = 10 (9600kHz)
@@ -94,10 +108,17 @@
         error("Failed to prepare dma configuration!");
     }
     
+    LPC_SSP0->CR1 = 2; // Enable the SSP0
+    
+    #else
+    
+    if(!dma.Prepare(dmaConfig)) {
+        error("Failed to prepare dma configuration!");
+    }
+    
     dma.Enable(dmaConfig);
     
-    
-    LPC_SSP0->CR1 = 2; // Enable the SSP0
+    #endif
     
     while(1) {
 
@@ -163,19 +184,19 @@
 
     for(int i = 0; i < len; i++) {
 
-        outIndex = i*3;
+        outIndex = i*4;
 
-        // 10010010
-        buffer[outIndex] = 0x92 | image[i]&128>>1 | image[i]&64>>3 | image[i]&32>>5;
-        //buffer[outIndex] |= image[i]&128>>1 | image[i]&64>>3 | image[i]&32>>5;
+        // 10001000
+        buffer[outIndex++] = 0x88 | image[i]&128>>1 | image[i]&64>>4;
 
-        // 01001001
-        buffer[outIndex+1] = 0x49 | image[i]&16<<1 | image[i]&8>>1;
-        //buffer[outIndex+1] |= image[i]&16<<1 | image[i]&8>>1;
+        // 10001000
+        buffer[outIndex++] = 0x88 | image[i]&32>>3 | image[i]&16>>2;
 
-        // 00100100
-        buffer[outIndex+2] = 0x24 |image[i]&4<<5 | image[i]&2<<3 | image[i]&1<<1;
-        //buffer[outIndex+2] |= image[i]&4<<5 | image[i]&2<<3 | image[i]&1<<1;
+        // 10001000
+        buffer[outIndex++] = 0x88 |image[i]&8<<4 | image[i]&4;
+
+        // 10001000
+        buffer[outIndex++] = 0x88 |image[i]&2<<6 | image[i]&1<<2;
     }
 
     timer.stop();