Harry Chen / EPD_GDEW075T8

Dependents:   EInkTest

Committer:
HarryChen
Date:
Mon Oct 15 04:12:41 2018 +0000
Revision:
3:8129e159831b
Parent:
2:73f957691c31
Child:
4:a038b8b2ee11
Allow user to customize pin name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HarryChen 0:518ad5d26088 1 #include "mbed.h"
HarryChen 0:518ad5d26088 2 #include "GDEW075T8.h"
HarryChen 1:6ae4383194a1 3 #include "PixelSource.h"
HarryChen 0:518ad5d26088 4
HarryChen 3:8129e159831b 5 static DigitalOut *nCS, *nDC, *nRST;
HarryChen 3:8129e159831b 6 static DigitalIn *ready;
HarryChen 3:8129e159831b 7 static SPI *spi;
HarryChen 0:518ad5d26088 8
HarryChen 1:6ae4383194a1 9 static void sendCommand(unsigned char command) {
HarryChen 3:8129e159831b 10 *nCS = 0;
HarryChen 3:8129e159831b 11 *nDC = 0; // command write
HarryChen 3:8129e159831b 12 spi->write(command);
HarryChen 3:8129e159831b 13 *nCS = 1;
HarryChen 0:518ad5d26088 14 }
HarryChen 0:518ad5d26088 15
HarryChen 1:6ae4383194a1 16 static void sendData(unsigned char data) {
HarryChen 3:8129e159831b 17 *nCS = 0;
HarryChen 3:8129e159831b 18 *nDC = 1; // data write
HarryChen 3:8129e159831b 19 spi->write(data);
HarryChen 3:8129e159831b 20 *nCS = 1;
HarryChen 0:518ad5d26088 21 }
HarryChen 0:518ad5d26088 22
HarryChen 1:6ae4383194a1 23 static void waitForReady(void) {
HarryChen 0:518ad5d26088 24 unsigned char busy;
HarryChen 0:518ad5d26088 25 do {
HarryChen 1:6ae4383194a1 26 sendCommand(0x71);
HarryChen 3:8129e159831b 27 busy = !(*ready & 0x01);
HarryChen 0:518ad5d26088 28 } while (busy);
HarryChen 0:518ad5d26088 29 wait(0.2);
HarryChen 0:518ad5d26088 30 }
HarryChen 0:518ad5d26088 31
HarryChen 1:6ae4383194a1 32 static void init(void) {
HarryChen 0:518ad5d26088 33 // BS tied to GND
HarryChen 0:518ad5d26088 34 // nBS_L; //4 wire spi mode selected
HarryChen 0:518ad5d26088 35
HarryChen 1:6ae4383194a1 36 // module reset
HarryChen 3:8129e159831b 37 *nRST = 0;
HarryChen 0:518ad5d26088 38 wait(0.1);
HarryChen 3:8129e159831b 39 *nRST = 1;;
HarryChen 0:518ad5d26088 40 wait(0.1);
HarryChen 0:518ad5d26088 41
HarryChen 0:518ad5d26088 42 }
HarryChen 0:518ad5d26088 43
HarryChen 2:73f957691c31 44 static void refresh() {
HarryChen 2:73f957691c31 45 sendCommand(0x12);
HarryChen 2:73f957691c31 46 wait(0.1);
HarryChen 2:73f957691c31 47 waitForReady();
HarryChen 2:73f957691c31 48 }
HarryChen 2:73f957691c31 49
HarryChen 1:6ae4383194a1 50 #define PIXEL_WHITE 0x02
HarryChen 1:6ae4383194a1 51 #define PIXEL_BLACK 0x00
HarryChen 1:6ae4383194a1 52 #define PIXEL(p) ((p) ? (PIXEL_BLACK) : (PIXEL_WHITE))
HarryChen 0:518ad5d26088 53
HarryChen 1:6ae4383194a1 54 static void display(GDE::PixelSource &source) {
HarryChen 1:6ae4383194a1 55
HarryChen 1:6ae4383194a1 56 // start user data transmission
HarryChen 1:6ae4383194a1 57 sendCommand(0x10);
HarryChen 1:6ae4383194a1 58
HarryChen 1:6ae4383194a1 59 source.init();
HarryChen 1:6ae4383194a1 60
HarryChen 2:73f957691c31 61 int i = 0;
HarryChen 2:73f957691c31 62
HarryChen 2:73f957691c31 63 while (i++ < GDE::BUFFER_SIZE && source.hasNext()) {
HarryChen 1:6ae4383194a1 64 unsigned char p = source.nextPixelGroup();
HarryChen 1:6ae4383194a1 65 // transmit 2 pixels each time
HarryChen 1:6ae4383194a1 66 for (int j = 0; j < 4; ++j) {
HarryChen 1:6ae4383194a1 67 unsigned char data = ((PIXEL(p & 0x01)) << 4) | (PIXEL(p & 0x02));
HarryChen 1:6ae4383194a1 68 sendData(data);
HarryChen 1:6ae4383194a1 69 p >>= 2;
HarryChen 1:6ae4383194a1 70 }
HarryChen 0:518ad5d26088 71 }
HarryChen 1:6ae4383194a1 72
HarryChen 1:6ae4383194a1 73 // power on
HarryChen 1:6ae4383194a1 74 sendCommand(0x04);
HarryChen 1:6ae4383194a1 75 waitForReady();
HarryChen 0:518ad5d26088 76
HarryChen 1:6ae4383194a1 77 // display refresh
HarryChen 2:73f957691c31 78 refresh();
HarryChen 0:518ad5d26088 79
HarryChen 1:6ae4383194a1 80 wait(1);
HarryChen 0:518ad5d26088 81 }
HarryChen 0:518ad5d26088 82
HarryChen 1:6ae4383194a1 83 namespace GDE {
HarryChen 3:8129e159831b 84
HarryChen 3:8129e159831b 85 void setup(DigitalOut *nCS, DigitalOut *nDC,
HarryChen 3:8129e159831b 86 DigitalOut *nRST, DigitalIn *ready,
HarryChen 3:8129e159831b 87 SPI *spi) {
HarryChen 3:8129e159831b 88 ::nCS = nCS;
HarryChen 3:8129e159831b 89 ::nDC = nDC;
HarryChen 3:8129e159831b 90 ::nRST = nRST;
HarryChen 3:8129e159831b 91 ::ready = ready;
HarryChen 3:8129e159831b 92 ::spi = spi;
HarryChen 3:8129e159831b 93 }
HarryChen 0:518ad5d26088 94
HarryChen 1:6ae4383194a1 95 void start() {
HarryChen 1:6ae4383194a1 96
HarryChen 1:6ae4383194a1 97 init();
HarryChen 1:6ae4383194a1 98
HarryChen 1:6ae4383194a1 99 // power setting
HarryChen 1:6ae4383194a1 100 sendCommand(0x01);
HarryChen 1:6ae4383194a1 101 sendData(0x37);
HarryChen 1:6ae4383194a1 102 sendData(0x00);
HarryChen 1:6ae4383194a1 103
HarryChen 1:6ae4383194a1 104 // pannel setting
HarryChen 1:6ae4383194a1 105 sendCommand(0x00);
HarryChen 1:6ae4383194a1 106 sendData(0xCF);
HarryChen 1:6ae4383194a1 107 sendData(0x08);
HarryChen 1:6ae4383194a1 108
HarryChen 1:6ae4383194a1 109 // boost setting
HarryChen 1:6ae4383194a1 110 sendCommand(0x06);
HarryChen 1:6ae4383194a1 111 sendData(0xc7);
HarryChen 1:6ae4383194a1 112 sendData(0xcc);
HarryChen 1:6ae4383194a1 113 sendData(0x28);
HarryChen 1:6ae4383194a1 114
HarryChen 1:6ae4383194a1 115
HarryChen 1:6ae4383194a1 116 // PLL setting
HarryChen 1:6ae4383194a1 117 sendCommand(0x30);
HarryChen 1:6ae4383194a1 118 sendData(0x3c);
HarryChen 1:6ae4383194a1 119
HarryChen 1:6ae4383194a1 120 // temperature setting
HarryChen 1:6ae4383194a1 121 sendCommand(0x41);
HarryChen 1:6ae4383194a1 122 sendData(0x00);
HarryChen 1:6ae4383194a1 123
HarryChen 1:6ae4383194a1 124 // VCOM and DATA interval setting
HarryChen 1:6ae4383194a1 125 sendCommand(0x50);
HarryChen 1:6ae4383194a1 126 sendData(0x77);
HarryChen 1:6ae4383194a1 127
HarryChen 1:6ae4383194a1 128 // TCON setting
HarryChen 1:6ae4383194a1 129 sendCommand(0x60);
HarryChen 1:6ae4383194a1 130 sendData(0x22);
HarryChen 1:6ae4383194a1 131
HarryChen 1:6ae4383194a1 132 // resolution setting
HarryChen 1:6ae4383194a1 133 sendCommand(0x61);
HarryChen 1:6ae4383194a1 134 // source 640
HarryChen 1:6ae4383194a1 135 sendData(0x02);
HarryChen 1:6ae4383194a1 136 sendData(0x80);
HarryChen 1:6ae4383194a1 137 // gate 384
HarryChen 1:6ae4383194a1 138 sendData(0x01);
HarryChen 1:6ae4383194a1 139 sendData(0x80);
HarryChen 1:6ae4383194a1 140
HarryChen 1:6ae4383194a1 141 // VDCS setting
HarryChen 1:6ae4383194a1 142 sendCommand(0x82);
HarryChen 1:6ae4383194a1 143 // decided by LUT file
HarryChen 1:6ae4383194a1 144 sendData(0x1E);
HarryChen 1:6ae4383194a1 145
HarryChen 1:6ae4383194a1 146 // flash mode
HarryChen 1:6ae4383194a1 147 sendCommand(0xe5);
HarryChen 1:6ae4383194a1 148 sendData(0x03);
HarryChen 1:6ae4383194a1 149
HarryChen 1:6ae4383194a1 150 }
HarryChen 1:6ae4383194a1 151
HarryChen 1:6ae4383194a1 152 void showPixels(PixelSource &source, bool needRefresh) {
HarryChen 1:6ae4383194a1 153 if (needRefresh) {
HarryChen 1:6ae4383194a1 154 PixelSource fullBlackSource = PixelSource();
HarryChen 1:6ae4383194a1 155 display(fullBlackSource);
HarryChen 1:6ae4383194a1 156 }
HarryChen 1:6ae4383194a1 157 display(source);
HarryChen 1:6ae4383194a1 158 }
HarryChen 1:6ae4383194a1 159
HarryChen 1:6ae4383194a1 160 void stop() {
HarryChen 1:6ae4383194a1 161
HarryChen 1:6ae4383194a1 162 sendCommand(0x02);
HarryChen 1:6ae4383194a1 163 waitForReady();
HarryChen 1:6ae4383194a1 164
HarryChen 1:6ae4383194a1 165 sendCommand(0x07);
HarryChen 1:6ae4383194a1 166 sendData(0xa5);
HarryChen 1:6ae4383194a1 167
HarryChen 0:518ad5d26088 168 }
HarryChen 0:518ad5d26088 169
HarryChen 0:518ad5d26088 170 }