diff --git a/STM32F1/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp b/STM32F1/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp index 2f6e1c7..e8eba84 100644 --- a/STM32F1/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp +++ b/STM32F1/libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp @@ -327,9 +327,11 @@ void Adafruit_ILI9341::begin(void) { void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + byte buf[4]; writecommand(ILI9341_CASET); // Column addr set *dcport |= dcpinmask; *csport &= ~cspinmask; + SPI.write(x0 >> 8); SPI.write(x0 & 0xFF); // XSTART SPI.write(x1 >> 8); @@ -338,11 +340,13 @@ void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, writecommand(ILI9341_PASET); // Row addr set *dcport |= dcpinmask; *csport &= ~cspinmask; + SPI.write(y0>>8); SPI.write(y0); // YSTART SPI.write(y1>>8); SPI.write(y1); // YEND + writecommand(ILI9341_RAMWR); // write to RAM } @@ -433,33 +437,56 @@ void Adafruit_ILI9341::fillScreen(uint16_t color) { } // fill a rectangle -void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color) { +void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { int numPixels; - // rudimentary clipping (drawChar w/big text requires this) - if((x >= _width) || (y >= _height)) return; - if((x + w - 1) >= _width) w = _width - x; - if((y + h - 1) >= _height) h = _height - y; - if (hwSPI) spi_begin(); - setAddrWindow(x, y, x+w-1, y+h-1); + unsigned char *buff; - uint8_t hi = color >> 8, lo = color; + // rudimentary clipping (drawChar w/big text requires this) + if((x >= _width) || (y >= _height)) return; + if((x + w - 1) >= _width) w = _width - x; + if((y + h - 1) >= _height) h = _height - y; - *dcport |= dcpinmask; - *csport &= ~cspinmask; + if (hwSPI) spi_begin(); + setAddrWindow(x, y, x+w-1, y+h-1); + + uint8_t hi = color >> 8, lo = color; - for(y=h; y>0; y--) - { - for(x=w; x>0; x--) + *dcport |= dcpinmask; + *csport &= ~cspinmask; + if (true) { - SPI.write(hi); - SPI.write(lo); - } - } - - if (hwSPI) spi_end(); - *csport |= cspinmask; + // Use DMA + byte lineBuffer[h*2];// Buffer to be sent via DMA + + // need to build a buffer of the required height (h) + // Note I suspect there is a faster way to do this + for(int i=0;i0; y--) + { + for(x=w; x>0; x--) + { + SPI.write(hi); + SPI.write(lo); + } + } + } + + if (hwSPI) spi_end(); + *csport |= cspinmask; } diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 0ca5da7..b9caaad 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -330,6 +330,29 @@ uint8 SPIClass::transfer(uint8 byte) { return b; } +uint8 SPIClass::DMATransfer(uint8 *data, uint32 length) { + uint8 b; + + + + dma1_ch3_Active=true; + + spi_tx_dma_enable(SPI1); + dma_init(DMA1); + + + dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); + dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, + data, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT)); + + dma_set_num_transfers(DMA1, DMA_CH3, length); // 2 bytes per pixel + dma_enable(DMA1, DMA_CH3); + while (dma1_ch3_Active); + + return b; +} + + void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 6ade819..3a32e39 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -40,6 +40,7 @@ #include #include +#include #include #include @@ -121,6 +122,7 @@ private: }; +volatile static bool dma1_ch3_Active; /** * @brief Wirish SPI interface. @@ -130,6 +132,9 @@ private: */ class SPIClass { public: + + + /** * @param spiPortNumber Number of the SPI port to manage. */ @@ -223,6 +228,8 @@ public: */ uint8 transfer(uint8 data); + uint8 DMATransfer(uint8 *data, uint32 length); + /* * Pin accessors */ @@ -289,7 +296,14 @@ public: spi_dev *dev(){ return spi_d;} + + private: + + static inline void DMA1_CH3_Event() { + dma1_ch3_Active = 0; + dma_disable(DMA1, DMA_CH3); + } spi_dev *spi_d; uint8_t _SSPin; uint32_t clockDivider;