ILI9341_SPI

Dependencies:   fonts

Dependents:   ov7670_dma_nucleo_f4 NUCLEO-F446RE_testDCMI

Committer:
tmnt
Date:
Fri Apr 29 13:36:39 2016 +0000
Revision:
0:2d4605aef62f
Child:
1:2446b5e1a4fb
Add  ILI9341_SPI  library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tmnt 0:2d4605aef62f 1
tmnt 0:2d4605aef62f 2 #include <mbed.h>
tmnt 0:2d4605aef62f 3 #include "ILI9341.h"
tmnt 0:2d4605aef62f 4
tmnt 0:2d4605aef62f 5 ili9341_spi::ili9341_spi(SPI& _spi, PinName _cs,PinName _dc,PinName _rs) : spi(_spi), cs(_cs),dc(_dc),rs(_rs) {}
tmnt 0:2d4605aef62f 6
tmnt 0:2d4605aef62f 7
tmnt 0:2d4605aef62f 8 void ili9341_spi::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h)
tmnt 0:2d4605aef62f 9 {
tmnt 0:2d4605aef62f 10 wr_cmd(0x2A);
tmnt 0:2d4605aef62f 11 spi.write(x >> 8);
tmnt 0:2d4605aef62f 12 spi.write(x);
tmnt 0:2d4605aef62f 13 spi.write((x+w-1) >> 8);
tmnt 0:2d4605aef62f 14 spi.write(x+w-1);
tmnt 0:2d4605aef62f 15
tmnt 0:2d4605aef62f 16 cs = 1;
tmnt 0:2d4605aef62f 17 wr_cmd(0x2B);
tmnt 0:2d4605aef62f 18 spi.write(y >> 8);
tmnt 0:2d4605aef62f 19 spi.write(y);
tmnt 0:2d4605aef62f 20 spi.write((y+h-1) >> 8);
tmnt 0:2d4605aef62f 21 spi.write(y+h-1);
tmnt 0:2d4605aef62f 22 cs = 1;
tmnt 0:2d4605aef62f 23 }
tmnt 0:2d4605aef62f 24 void ili9341_spi::wr_cmd(unsigned char cmd)
tmnt 0:2d4605aef62f 25 {
tmnt 0:2d4605aef62f 26 dc = 0;
tmnt 0:2d4605aef62f 27 cs = 0;
tmnt 0:2d4605aef62f 28 spi.write(cmd); // mbed lib
tmnt 0:2d4605aef62f 29 dc = 1;
tmnt 0:2d4605aef62f 30 }
tmnt 0:2d4605aef62f 31 void ili9341_spi::wr_dat(unsigned char dat)
tmnt 0:2d4605aef62f 32 {
tmnt 0:2d4605aef62f 33 spi.write(dat); // mbed lib
tmnt 0:2d4605aef62f 34 }
tmnt 0:2d4605aef62f 35 char ili9341_spi::rd_byte(unsigned char cmd)
tmnt 0:2d4605aef62f 36 {
tmnt 0:2d4605aef62f 37 char r;
tmnt 0:2d4605aef62f 38 dc = 0;
tmnt 0:2d4605aef62f 39 cs = 0;
tmnt 0:2d4605aef62f 40 spi.write(cmd); // mbed lib
tmnt 0:2d4605aef62f 41 cs = 1;
tmnt 0:2d4605aef62f 42 r = spi.write(0xff);
tmnt 0:2d4605aef62f 43 cs = 1;
tmnt 0:2d4605aef62f 44 return(r);
tmnt 0:2d4605aef62f 45 }
tmnt 0:2d4605aef62f 46 int ili9341_spi::rd_32(unsigned char cmd)
tmnt 0:2d4605aef62f 47 {
tmnt 0:2d4605aef62f 48 int d;
tmnt 0:2d4605aef62f 49 char r;
tmnt 0:2d4605aef62f 50 dc = 0;
tmnt 0:2d4605aef62f 51 cs = 0;
tmnt 0:2d4605aef62f 52 d = cmd;
tmnt 0:2d4605aef62f 53 d = d << 1;
tmnt 0:2d4605aef62f 54 spi.format(9,3); // we have to add a dummy clock cycle
tmnt 0:2d4605aef62f 55 spi.write(d);
tmnt 0:2d4605aef62f 56 spi.format(8,3);
tmnt 0:2d4605aef62f 57 dc = 1;
tmnt 0:2d4605aef62f 58 r = spi.write(0xff);
tmnt 0:2d4605aef62f 59 d = r;
tmnt 0:2d4605aef62f 60 r = spi.write(0xff);
tmnt 0:2d4605aef62f 61 d = (d << 8) | r;
tmnt 0:2d4605aef62f 62 r = spi.write(0xff);
tmnt 0:2d4605aef62f 63 d = (d << 8) | r;
tmnt 0:2d4605aef62f 64 r = spi.write(0xff);
tmnt 0:2d4605aef62f 65 d = (d << 8) | r;
tmnt 0:2d4605aef62f 66 cs = 1;
tmnt 0:2d4605aef62f 67 return(d);
tmnt 0:2d4605aef62f 68 }
tmnt 0:2d4605aef62f 69 int ili9341_spi:: Read_ID(void){
tmnt 0:2d4605aef62f 70 int r;
tmnt 0:2d4605aef62f 71 r = rd_byte(0x0A);
tmnt 0:2d4605aef62f 72 r = rd_byte(0x0A);
tmnt 0:2d4605aef62f 73 r = rd_byte(0x0A);
tmnt 0:2d4605aef62f 74 r = rd_byte(0x0A);
tmnt 0:2d4605aef62f 75 return(r);
tmnt 0:2d4605aef62f 76 }
tmnt 0:2d4605aef62f 77
tmnt 0:2d4605aef62f 78 void ili9341_spi::tft_reset()
tmnt 0:2d4605aef62f 79 {
tmnt 0:2d4605aef62f 80 cs = 1; // cs high
tmnt 0:2d4605aef62f 81 dc = 1; // dc high
tmnt 0:2d4605aef62f 82 rs = 0; // display reset
tmnt 0:2d4605aef62f 83
tmnt 0:2d4605aef62f 84 wait_us(50);
tmnt 0:2d4605aef62f 85 rs = 1; // end hardware reset
tmnt 0:2d4605aef62f 86 wait_ms(5);
tmnt 0:2d4605aef62f 87
tmnt 0:2d4605aef62f 88 wr_cmd(0x01); // SW reset
tmnt 0:2d4605aef62f 89 wait_ms(5);
tmnt 0:2d4605aef62f 90 wr_cmd(0x28); // display off
tmnt 0:2d4605aef62f 91
tmnt 0:2d4605aef62f 92 /* Start Initial Sequence ----------------------------------------------------*/
tmnt 0:2d4605aef62f 93 wr_cmd(0xCF);
tmnt 0:2d4605aef62f 94 spi.write(0x00);
tmnt 0:2d4605aef62f 95 spi.write(0x83);
tmnt 0:2d4605aef62f 96 spi.write(0x30);
tmnt 0:2d4605aef62f 97 cs = 1;
tmnt 0:2d4605aef62f 98
tmnt 0:2d4605aef62f 99 wr_cmd(0xED);
tmnt 0:2d4605aef62f 100 spi.write(0x64);
tmnt 0:2d4605aef62f 101 spi.write(0x03);
tmnt 0:2d4605aef62f 102 spi.write(0x12);
tmnt 0:2d4605aef62f 103 spi.write(0x81);
tmnt 0:2d4605aef62f 104 cs = 1;
tmnt 0:2d4605aef62f 105
tmnt 0:2d4605aef62f 106 wr_cmd(0xE8);
tmnt 0:2d4605aef62f 107 spi.write(0x85);
tmnt 0:2d4605aef62f 108 spi.write(0x01);
tmnt 0:2d4605aef62f 109 spi.write(0x79);
tmnt 0:2d4605aef62f 110 cs = 1;
tmnt 0:2d4605aef62f 111
tmnt 0:2d4605aef62f 112 wr_cmd(0xCB);
tmnt 0:2d4605aef62f 113 spi.write(0x39);
tmnt 0:2d4605aef62f 114 spi.write(0x2C);
tmnt 0:2d4605aef62f 115 spi.write(0x00);
tmnt 0:2d4605aef62f 116 spi.write(0x34);
tmnt 0:2d4605aef62f 117 spi.write(0x02);
tmnt 0:2d4605aef62f 118 cs = 1;
tmnt 0:2d4605aef62f 119
tmnt 0:2d4605aef62f 120 wr_cmd(0xF7);
tmnt 0:2d4605aef62f 121 spi.write(0x20);
tmnt 0:2d4605aef62f 122 cs = 1;
tmnt 0:2d4605aef62f 123
tmnt 0:2d4605aef62f 124 wr_cmd(0xEA);
tmnt 0:2d4605aef62f 125 spi.write(0x00);
tmnt 0:2d4605aef62f 126 spi.write(0x00);
tmnt 0:2d4605aef62f 127 cs = 1;
tmnt 0:2d4605aef62f 128
tmnt 0:2d4605aef62f 129 wr_cmd(0xC0); // POWER_CONTROL_1
tmnt 0:2d4605aef62f 130 spi.write(0x26);
tmnt 0:2d4605aef62f 131 cs = 1;
tmnt 0:2d4605aef62f 132
tmnt 0:2d4605aef62f 133 wr_cmd(0xC1); // POWER_CONTROL_2
tmnt 0:2d4605aef62f 134 spi.write(0x11);
tmnt 0:2d4605aef62f 135 cs = 1;
tmnt 0:2d4605aef62f 136
tmnt 0:2d4605aef62f 137 wr_cmd(0xC5); // VCOM_CONTROL_1
tmnt 0:2d4605aef62f 138 spi.write(0x35);
tmnt 0:2d4605aef62f 139 spi.write(0x3E);
tmnt 0:2d4605aef62f 140 cs = 1;
tmnt 0:2d4605aef62f 141
tmnt 0:2d4605aef62f 142 wr_cmd(0xC7); // VCOM_CONTROL_2
tmnt 0:2d4605aef62f 143 spi.write(0xBE);
tmnt 0:2d4605aef62f 144 cs = 1;
tmnt 0:2d4605aef62f 145
tmnt 0:2d4605aef62f 146 wr_cmd(0x36); // MEMORY_ACCESS_CONTROL
tmnt 0:2d4605aef62f 147 spi.write(0x48);
tmnt 0:2d4605aef62f 148 cs = 1;
tmnt 0:2d4605aef62f 149
tmnt 0:2d4605aef62f 150 wr_cmd(0x3A); // COLMOD_PIXEL_FORMAT_SET
tmnt 0:2d4605aef62f 151 spi.write(0x55); // 16 bit pixel
tmnt 0:2d4605aef62f 152 cs = 1;
tmnt 0:2d4605aef62f 153
tmnt 0:2d4605aef62f 154 wr_cmd(0xB1); // Frame Rate
tmnt 0:2d4605aef62f 155 spi.write(0x00);
tmnt 0:2d4605aef62f 156 spi.write(0x1B);
tmnt 0:2d4605aef62f 157 cs = 1;
tmnt 0:2d4605aef62f 158
tmnt 0:2d4605aef62f 159 wr_cmd(0xF2); // Gamma Function Disable
tmnt 0:2d4605aef62f 160 spi.write(0x08);
tmnt 0:2d4605aef62f 161 cs = 1;
tmnt 0:2d4605aef62f 162
tmnt 0:2d4605aef62f 163 wr_cmd(0x26);
tmnt 0:2d4605aef62f 164 spi.write(0x01); // gamma set for curve 01/2/04/08
tmnt 0:2d4605aef62f 165 cs = 1;
tmnt 0:2d4605aef62f 166
tmnt 0:2d4605aef62f 167 wr_cmd(0xE0); // positive gamma correction
tmnt 0:2d4605aef62f 168 spi.write(0x1F);
tmnt 0:2d4605aef62f 169 spi.write(0x1A);
tmnt 0:2d4605aef62f 170 spi.write(0x18);
tmnt 0:2d4605aef62f 171 spi.write(0x0A);
tmnt 0:2d4605aef62f 172 spi.write(0x0F);
tmnt 0:2d4605aef62f 173 spi.write(0x06);
tmnt 0:2d4605aef62f 174 spi.write(0x45);
tmnt 0:2d4605aef62f 175 spi.write(0x87);
tmnt 0:2d4605aef62f 176 spi.write(0x32);
tmnt 0:2d4605aef62f 177 spi.write(0x0A);
tmnt 0:2d4605aef62f 178 spi.write(0x07);
tmnt 0:2d4605aef62f 179 spi.write(0x02);
tmnt 0:2d4605aef62f 180 spi.write(0x07);
tmnt 0:2d4605aef62f 181 spi.write(0x05);
tmnt 0:2d4605aef62f 182 spi.write(0x00);
tmnt 0:2d4605aef62f 183 cs = 1;
tmnt 0:2d4605aef62f 184
tmnt 0:2d4605aef62f 185 wr_cmd(0xE1); // negativ gamma correction
tmnt 0:2d4605aef62f 186 spi.write(0x00);
tmnt 0:2d4605aef62f 187 spi.write(0x25);
tmnt 0:2d4605aef62f 188 spi.write(0x27);
tmnt 0:2d4605aef62f 189 spi.write(0x05);
tmnt 0:2d4605aef62f 190 spi.write(0x10);
tmnt 0:2d4605aef62f 191 spi.write(0x09);
tmnt 0:2d4605aef62f 192 spi.write(0x3A);
tmnt 0:2d4605aef62f 193 spi.write(0x78);
tmnt 0:2d4605aef62f 194 spi.write(0x4D);
tmnt 0:2d4605aef62f 195 spi.write(0x05);
tmnt 0:2d4605aef62f 196 spi.write(0x18);
tmnt 0:2d4605aef62f 197 spi.write(0x0D);
tmnt 0:2d4605aef62f 198 spi.write(0x38);
tmnt 0:2d4605aef62f 199 spi.write(0x3A);
tmnt 0:2d4605aef62f 200 spi.write(0x1F);
tmnt 0:2d4605aef62f 201 cs = 1;
tmnt 0:2d4605aef62f 202
tmnt 0:2d4605aef62f 203 wr_cmd(0x2A);
tmnt 0:2d4605aef62f 204 spi.write(0);
tmnt 0:2d4605aef62f 205 spi.write(0);
tmnt 0:2d4605aef62f 206 spi.write(0);
tmnt 0:2d4605aef62f 207 spi.write(0x95);
tmnt 0:2d4605aef62f 208
tmnt 0:2d4605aef62f 209 cs = 1;
tmnt 0:2d4605aef62f 210 wr_cmd(0x2B);
tmnt 0:2d4605aef62f 211 spi.write(0);
tmnt 0:2d4605aef62f 212 spi.write(0);
tmnt 0:2d4605aef62f 213 spi.write(0x00);
tmnt 0:2d4605aef62f 214 spi.write(0x90);
tmnt 0:2d4605aef62f 215 cs = 1;
tmnt 0:2d4605aef62f 216
tmnt 0:2d4605aef62f 217 //wr_cmd(0x34); // tearing effect off
tmnt 0:2d4605aef62f 218 //_cs = 1;
tmnt 0:2d4605aef62f 219
tmnt 0:2d4605aef62f 220 //wr_cmd(0x35); // tearing effect on
tmnt 0:2d4605aef62f 221 //_cs = 1;
tmnt 0:2d4605aef62f 222
tmnt 0:2d4605aef62f 223 wr_cmd(0xB7); // entry mode
tmnt 0:2d4605aef62f 224 spi.write(0x07);
tmnt 0:2d4605aef62f 225 cs = 1;
tmnt 0:2d4605aef62f 226
tmnt 0:2d4605aef62f 227 wr_cmd(0xB6); // display function control
tmnt 0:2d4605aef62f 228 spi.write(0x0A);
tmnt 0:2d4605aef62f 229 spi.write(0x82);
tmnt 0:2d4605aef62f 230 spi.write(0x27);
tmnt 0:2d4605aef62f 231 spi.write(0x00);
tmnt 0:2d4605aef62f 232 cs = 1;
tmnt 0:2d4605aef62f 233
tmnt 0:2d4605aef62f 234 wr_cmd(0x11); // sleep out
tmnt 0:2d4605aef62f 235 cs = 1;
tmnt 0:2d4605aef62f 236
tmnt 0:2d4605aef62f 237 wait_ms(100);
tmnt 0:2d4605aef62f 238
tmnt 0:2d4605aef62f 239 wr_cmd(0x29); // display on
tmnt 0:2d4605aef62f 240 cs = 1;
tmnt 0:2d4605aef62f 241
tmnt 0:2d4605aef62f 242 wait_ms(100);
tmnt 0:2d4605aef62f 243
tmnt 0:2d4605aef62f 244 }
tmnt 0:2d4605aef62f 245 void ili9341_spi::pixel(int x, int y, int color)
tmnt 0:2d4605aef62f 246 {
tmnt 0:2d4605aef62f 247 wr_cmd(0x2A);
tmnt 0:2d4605aef62f 248 spi.write(x >> 8);
tmnt 0:2d4605aef62f 249 spi.write(x);
tmnt 0:2d4605aef62f 250 cs = 1;
tmnt 0:2d4605aef62f 251 wr_cmd(0x2B);
tmnt 0:2d4605aef62f 252 spi.write(y >> 8);
tmnt 0:2d4605aef62f 253 spi.write(y);
tmnt 0:2d4605aef62f 254 cs = 1;
tmnt 0:2d4605aef62f 255 wr_cmd(0x2C); // send pixel
tmnt 0:2d4605aef62f 256 //#if defined TARGET_KL25Z // 8 Bit SPI
tmnt 0:2d4605aef62f 257 spi.write(color >> 8);
tmnt 0:2d4605aef62f 258 spi.write(color & 0xff);
tmnt 0:2d4605aef62f 259 /*#else
tmnt 0:2d4605aef62f 260 SPI::format(16,3); // switch to 16 bit Mode 3
tmnt 0:2d4605aef62f 261 SPI::write(color); // Write D0..D15
tmnt 0:2d4605aef62f 262 SPI::format(8,3);
tmnt 0:2d4605aef62f 263 #endif*/
tmnt 0:2d4605aef62f 264 cs = 1;
tmnt 0:2d4605aef62f 265 }
tmnt 0:2d4605aef62f 266 void ili9341_spi::vline(int x, int y0, int y1, int color)
tmnt 0:2d4605aef62f 267 {
tmnt 0:2d4605aef62f 268 int h;
tmnt 0:2d4605aef62f 269 h = y1 - y0 + 1;
tmnt 0:2d4605aef62f 270 window(x,y0,1,h);
tmnt 0:2d4605aef62f 271 wr_cmd(0x2C); // send pixel
tmnt 0:2d4605aef62f 272 //#if defined TARGET_KL25Z // 8 Bit SPI
tmnt 0:2d4605aef62f 273 for (int y=0; y<h; y++) {
tmnt 0:2d4605aef62f 274 spi.write(color >> 8);
tmnt 0:2d4605aef62f 275 spi.write(color & 0xff);
tmnt 0:2d4605aef62f 276 }
tmnt 0:2d4605aef62f 277 /* #else
tmnt 0:2d4605aef62f 278 SPI::format(16,3); // switch to 16 bit Mode 3
tmnt 0:2d4605aef62f 279 for (int y=0; y<h; y++) {
tmnt 0:2d4605aef62f 280 SPI::write(color);
tmnt 0:2d4605aef62f 281 }
tmnt 0:2d4605aef62f 282 SPI::format(8,3);*/
tmnt 0:2d4605aef62f 283 //#endif
tmnt 0:2d4605aef62f 284 cs = 1;
tmnt 0:2d4605aef62f 285 //WindowMax();
tmnt 0:2d4605aef62f 286 return;
tmnt 0:2d4605aef62f 287 }
tmnt 0:2d4605aef62f 288
tmnt 0:2d4605aef62f 289 void ili9341_spi::circle(int x0, int y0, int r, int color)
tmnt 0:2d4605aef62f 290 {
tmnt 0:2d4605aef62f 291
tmnt 0:2d4605aef62f 292 int x = -r, y = 0, err = 2-2*r, e2;
tmnt 0:2d4605aef62f 293 do {
tmnt 0:2d4605aef62f 294 pixel(x0-x, y0+y,color);
tmnt 0:2d4605aef62f 295 pixel(x0+x, y0+y,color);
tmnt 0:2d4605aef62f 296 pixel(x0+x, y0-y,color);
tmnt 0:2d4605aef62f 297 pixel(x0-x, y0-y,color);
tmnt 0:2d4605aef62f 298 e2 = err;
tmnt 0:2d4605aef62f 299 if (e2 <= y) {
tmnt 0:2d4605aef62f 300 err += ++y*2+1;
tmnt 0:2d4605aef62f 301 if (-x == y && e2 <= x) e2 = 0;
tmnt 0:2d4605aef62f 302 }
tmnt 0:2d4605aef62f 303 if (e2 > x) err += ++x*2+1;
tmnt 0:2d4605aef62f 304 } while (x <= 0);
tmnt 0:2d4605aef62f 305 }
tmnt 0:2d4605aef62f 306
tmnt 0:2d4605aef62f 307 void ili9341_spi::fillrect(int x0, int y0, int x1, int y1, int color)
tmnt 0:2d4605aef62f 308 {
tmnt 0:2d4605aef62f 309
tmnt 0:2d4605aef62f 310 int h = y1 - y0 + 1;
tmnt 0:2d4605aef62f 311 int w = x1 - x0 + 1;
tmnt 0:2d4605aef62f 312 int pixel = h * w;
tmnt 0:2d4605aef62f 313 //window(x0,y0,w,h);
tmnt 0:2d4605aef62f 314 wr_cmd(0x2C); // send pixel
tmnt 0:2d4605aef62f 315 //#if defined TARGET_KL25Z // 8 Bit SPI
tmnt 0:2d4605aef62f 316 for (int p=0; p<pixel; p++) {
tmnt 0:2d4605aef62f 317 spi.write(color >> 8);
tmnt 0:2d4605aef62f 318 spi.write(color & 0xff);
tmnt 0:2d4605aef62f 319 }
tmnt 0:2d4605aef62f 320 /*#else
tmnt 0:2d4605aef62f 321 SPI::format(16,3); // switch to 16 bit Mode 3
tmnt 0:2d4605aef62f 322 for (int p=0; p<pixel; p++) {
tmnt 0:2d4605aef62f 323 SPI::write(color);
tmnt 0:2d4605aef62f 324 }
tmnt 0:2d4605aef62f 325 SPI::format(8,3);
tmnt 0:2d4605aef62f 326 #endif*/
tmnt 0:2d4605aef62f 327 cs = 1;
tmnt 0:2d4605aef62f 328 //WindowMax();
tmnt 0:2d4605aef62f 329 return;
tmnt 0:2d4605aef62f 330 }
tmnt 0:2d4605aef62f 331 void ili9341_spi::select() {
tmnt 0:2d4605aef62f 332 //Set CS low to start transmission (interrupts conversion)
tmnt 0:2d4605aef62f 333 cs = 0;
tmnt 0:2d4605aef62f 334 }
tmnt 0:2d4605aef62f 335 void ili9341_spi::deselect() {
tmnt 0:2d4605aef62f 336 //Set CS high to stop transmission (restarts conversion)
tmnt 0:2d4605aef62f 337 cs = 1;
tmnt 0:2d4605aef62f 338 }