SPI based library for the ST7735 LCD controller.
Dependents: RayCastingEngine RETRO_LCD_PerformanceTest RETRO_loop_test RETRO_RickGame ... more
Revision 5:21c987ee68d2, committed 2014-10-05
- Comitter:
- taylorza
- Date:
- Sun Oct 05 22:24:22 2014 +0000
- Parent:
- 4:88d22437119c
- Child:
- 6:67d3d4a953e0
- Commit message:
- Fixed initialization routine and added fast SPI handling for the LPC11U24
Changed in this revision
LCD_ST7735.cpp | Show annotated file Show diff for this revision Revisions of this file |
LCD_ST7735.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/LCD_ST7735.cpp Sun Sep 21 07:01:15 2014 +0000 +++ b/LCD_ST7735.cpp Sun Oct 05 22:24:22 2014 +0000 @@ -16,7 +16,7 @@ _spi(mosiPin, misoPin, clkPin) { _spi.format(8, 3); - _spi.frequency(15000000); + _spi.frequency(8000000); initDisplay(); clearScreen(); @@ -26,7 +26,7 @@ void LCD_ST7735::setOrientation(Orientation orientation, bool flip) { - const static uint8_t my = 0x80; + const static uint8_t my = 0x80; const static uint8_t mx = 0x40; const static uint8_t mv = 0x20; @@ -443,11 +443,11 @@ { reset(); - write(CMD_SLPOUT); + writeCommand(CMD_SLPOUT); write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3); - write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3); - write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6); + write(CMD_FRMCTR2, (uint8_t[]){0x01, 0x2c, 0x2d}, 3); + write(CMD_FRMCTR3, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6); write(CMD_INVCTR, (uint8_t[]){0x07}, 1); @@ -498,7 +498,7 @@ write(CMD_COLMOD, (uint8_t[]){0x05}, 1); // Enable display - write(CMD_DISPON); + writeCommand(CMD_DISPON); setBacklight(true); } @@ -530,78 +530,83 @@ uint8_t y2h = (uint8_t)(y2 >> 8); write(CMD_RASET, (uint8_t[]){y1h, y1l, y2h, y2l}, 4); } - -void LCD_ST7735::write(uint8_t cmd) + +void LCD_ST7735::writeCommand(uint8_t cmd) { - write(cmd, NULL, 0); + _cs = 0; + _ds = 0; + _spi.fastWrite(cmd); + _spi.waitWhileBusy(); + _spi.clearRx(); + _cs = 1; } void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen) { - _ds = 0; _cs = 0; - _spi.write(cmd); + _ds = 0; + _spi.fastWrite(cmd); + _spi.waitWhileBusy(); if (data != NULL & dataLen > 0) { _ds = 1; for(int i = 0; i < dataLen; ++i) { - _spi.write(data[i]); + _spi.fastWrite(data[i]); } + _spi.waitWhileBusy(); _ds = 0; } - _cs = 1; + _spi.clearRx(); + _cs = 1; } void LCD_ST7735::write(uint8_t cmd, uint16_t data) { - _ds = 0; - _cs = 0; - _spi.write(cmd); - _ds = 1; - _spi.write(data >> 8); - _spi.write(data); - _ds = 0; + _cs = 0; + _ds = 0; + _spi.fastWrite(cmd); + _spi.waitWhileBusy(); + _ds = 1; + _spi.fastWrite(data >> 8); + _spi.fastWrite(data); + _spi.waitWhileBusy(); + _spi.clearRx(); + _ds = 0; _cs = 1; } -void LCD_ST7735::writeData(uint8_t data) -{ - _ds = 1; - _cs = 0; - _spi.write(data); - _ds = 0; - _cs = 1; -} - void LCD_ST7735::beginBatchCommand(uint8_t cmd) { - _ds = 0; _cs = 0; - _spi.write(cmd); + _ds = 0; + _spi.fastWrite(cmd); + _spi.waitWhileBusy(); _ds = 1; } void LCD_ST7735::writeBatchData(uint8_t data) { - _spi.write(data); + _spi.fastWrite(data); } void LCD_ST7735::writeBatchData(uint8_t dataHigh, uint8_t dataLow) { - _spi.write(dataHigh); - _spi.write(dataLow); + _spi.fastWrite(dataHigh); + _spi.fastWrite(dataLow); } void LCD_ST7735::writeBatchData(uint16_t data) { - _spi.write(data >> 8); - _spi.write(data); + _spi.fastWrite(data >> 8); + _spi.fastWrite(data); } void LCD_ST7735::endBatchCommand() { + _spi.waitWhileBusy(); + _spi.clearRx(); _ds = 0; _cs = 1; }
--- a/LCD_ST7735.h Sun Sep 21 07:01:15 2014 +0000 +++ b/LCD_ST7735.h Sun Oct 05 22:24:22 2014 +0000 @@ -200,10 +200,11 @@ private: void initDisplay(); void reset(); - void write(uint8_t cmd); + + void writeCommand(uint8_t cmd); void write(uint8_t cmd, uint8_t data[], int dataLen); void write(uint8_t cmd, uint16_t data); - void writeData(uint8_t data); + void beginBatchCommand(uint8_t cmd); void writeBatchData(uint8_t data); void writeBatchData(uint8_t dataHigh, uint8_t dataLow); @@ -223,12 +224,50 @@ uint8_t _backgroundColorHigh; uint8_t _backgroundColorLow; + private: + class LCDSPI : public SPI + { + public: + LCDSPI(PinName mosi, PinName miso, PinName sclk) : + SPI(mosi, miso, sclk) + { + } + + void waitWhileBusy() + { + #ifdef TARGET_LPC11U24 + while (((_spi.spi->SR) & 0x10) != 0); + #endif + } + + void fastWrite(uint8_t data) + { + #ifdef TARGET_LPC11U24 + while (((_spi.spi->SR) & 0x01) == 0); + _spi.spi->DR = data; + #else + SPI::write(data); + #endif + } + + void clearRx() + { + #ifdef TARGET_LPC11U24 + while (((_spi.spi->SR) & 0x14) != 0) + { + while (((_spi.spi->SR) & 0x04) == 0); + int data = _spi.spi->DR; + } + #endif + } + }; + private: DigitalOut _backlight; DigitalOut _reset; DigitalOut _ds; DigitalOut _cs; - SPI _spi; + LCDSPI _spi; private: static const uint8_t CMD_SLPOUT = 0x11; @@ -255,7 +294,7 @@ static const uint8_t CMD_GAMCTRP1 = 0xe0; static const uint8_t CMD_GAMCTRN1 = 0xe1; - static const uint8_t CMD_EXTCTRL = 0xf0; + static const uint8_t CMD_EXTCTRL = 0xf0; }; #endif // __LCD_ST7735__