Tomas Hübner
/
DMANeoPixel
Programming an array of NeoPixels using the GPDMA for maximum performance.
Revision 2:1f2f547a9991, committed 2014-12-06
- 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();