169 lines
4.2 KiB
C++
169 lines
4.2 KiB
C++
// Read the ID from the TFT controller
|
|
// The sketch only supports displays with a bi-directional SPI data line (often labelled SDA)
|
|
|
|
// Bit bashes SPI so it does NOT assume hardware SPI wired up
|
|
// No other libraries are needed
|
|
|
|
// NOTE: This sketch does not work with parallel displays!
|
|
|
|
// Original author unknown
|
|
// Adapted by Bodmer 22/5/16, updated 16/9/16
|
|
|
|
// Change the pin settings to suit your hardware
|
|
|
|
// UNO etc
|
|
//#define TFT_MOSI 11
|
|
//#define TFT_SCK 13
|
|
//#define TFT_CS 9
|
|
//#define TFT_DC 8
|
|
//#define TFT_RESET 7
|
|
|
|
//Mega
|
|
//#define TFT_MOSI 51
|
|
//#define TFT_SCK 52
|
|
//#define TFT_CS 47
|
|
//#define TFT_DC 48
|
|
//#define TFT_RESET 44
|
|
|
|
//Micro
|
|
//#define TFT_MOSI MOSI
|
|
//#define TFT_SCK SCK
|
|
//#define TFT_CS 10
|
|
//#define TFT_DC 9
|
|
//#define TFT_RESET 8
|
|
|
|
//NodeMCU
|
|
#define TFT_MOSI D7
|
|
#define TFT_SCK D5
|
|
#define TFT_CS D8
|
|
#define TFT_DC D3
|
|
#define TFT_RESET D4
|
|
|
|
/* Example Serial Monitor output:
|
|
|
|
TFT driver register values:
|
|
===========================
|
|
Register 0x01: 0x00
|
|
Register 0x04: 0x548066
|
|
Register 0x09: 0x610000
|
|
Register 0x0A: 0x08
|
|
Register 0x0B: 0x00
|
|
Register 0x0C: 0x06
|
|
Register 0x0D: 0x00
|
|
Register 0x0E: 0x00
|
|
Register 0x0F: 0x00
|
|
Register 0x2E: 0x1834B4
|
|
Register 0xDA: 0x54
|
|
Register 0xDB: 0x80
|
|
Register 0xDC: 0x66
|
|
===========================
|
|
|
|
Looks like driver chip is: ILI9163 (based on datasheet ID)
|
|
|
|
*/
|
|
|
|
char *chip = "Unknown ";
|
|
|
|
uint32_t readwrite8(uint8_t cmd, uint8_t bits, uint8_t dummy)
|
|
{
|
|
uint32_t ret = 0;
|
|
uint8_t val = cmd;
|
|
int cnt = 8;
|
|
digitalWrite(TFT_CS, LOW);
|
|
digitalWrite(TFT_DC, LOW);
|
|
pinMode(TFT_MOSI, OUTPUT);
|
|
for (int i = 0; i < 8; i++) { //send command
|
|
digitalWrite(TFT_MOSI, (val & 0x80) != 0);
|
|
digitalWrite(TFT_SCK, HIGH);
|
|
digitalWrite(TFT_SCK, LOW);
|
|
val <<= 1;
|
|
}
|
|
if (bits == 0) {
|
|
digitalWrite(TFT_CS, HIGH);
|
|
return 0;
|
|
}
|
|
pinMode(TFT_MOSI, INPUT_PULLUP);
|
|
digitalWrite(TFT_DC, HIGH);
|
|
for (int i = 0; i < dummy; i++) { //any dummy clocks
|
|
digitalWrite(TFT_SCK, HIGH);
|
|
digitalWrite(TFT_SCK, LOW);
|
|
}
|
|
for (int i = 0; i < bits; i++) { // read results
|
|
ret <<= 1;
|
|
if (digitalRead(TFT_MOSI)) ret |= 1;;
|
|
digitalWrite(TFT_SCK, HIGH);
|
|
digitalWrite(TFT_SCK, LOW);
|
|
}
|
|
digitalWrite(TFT_CS, HIGH);
|
|
return ret;
|
|
}
|
|
|
|
void showreg(uint8_t reg, uint8_t bits, uint8_t dummy)
|
|
{
|
|
uint32_t val;
|
|
val = readwrite8(reg, bits, dummy);
|
|
|
|
Serial.print("Register 0x");
|
|
if (reg < 0x10) Serial.print("0");
|
|
Serial.print(reg , HEX);
|
|
Serial.print(": 0x");
|
|
if (val < 0x10) Serial.print("0");
|
|
Serial.println(val, HEX);
|
|
}
|
|
|
|
void setup() {
|
|
// put your setup code here, to run once:
|
|
uint32_t ID = 0;
|
|
Serial.begin(115200);
|
|
|
|
delay(4000); // Delay to allow USB to connect to a Leonardo etc
|
|
|
|
Serial.println("TFT driver register values:");
|
|
Serial.println("===========================");
|
|
digitalWrite(TFT_CS, HIGH);
|
|
// digitalWrite(TFT_SCK, HIGH);
|
|
pinMode(TFT_CS, OUTPUT);
|
|
pinMode(TFT_SCK, OUTPUT);
|
|
pinMode(TFT_MOSI, OUTPUT);
|
|
pinMode(MISO, INPUT_PULLUP);
|
|
pinMode(TFT_DC, OUTPUT);
|
|
pinMode(TFT_RESET, OUTPUT);
|
|
digitalWrite(TFT_RESET, HIGH);
|
|
digitalWrite(TFT_RESET, LOW); //Hardware Reset
|
|
delay(50);
|
|
digitalWrite(TFT_RESET, HIGH);
|
|
showreg(0x01, 0, 0); //Software Reset
|
|
delay(100);
|
|
ID = readwrite8(0x04, 24, 1);
|
|
|
|
if ((ID & 0xFF8000) == 0x5C8000uL) chip = "ST7735 (based on datasheet ID)";
|
|
if (ID == 0x7C89F0uL) chip = "ST7735S (empirical value)";
|
|
if (ID == 0x548066uL) chip = "ILI9163C (based on datasheet ID)";
|
|
if (ID == 0x5C0000uL) chip = "S6D02A1 (based on datasheet ID)";
|
|
|
|
showreg(0x04, 24, 1); //RDDID
|
|
showreg(0x09, 32, 1); //RDSTATUS
|
|
showreg(0x0A, 8, 0);
|
|
showreg(0x0B, 8, 0);
|
|
showreg(0x0C, 8, 0);
|
|
showreg(0x0D, 8, 0);
|
|
showreg(0x0E, 8, 0);
|
|
showreg(0x0F, 8, 0);
|
|
showreg(0x2E, 24, 8); //readGRAM
|
|
showreg(0x3F, 32, 1); //readGRAM
|
|
showreg(0xDA, 8, 0);
|
|
showreg(0xDB, 8, 0);
|
|
showreg(0xDC, 8, 0);
|
|
|
|
Serial.println("===========================");
|
|
Serial.println();
|
|
Serial.print("Looks like driver chip is: " );Serial.println(chip);
|
|
}
|
|
|
|
void loop() {
|
|
|
|
}
|
|
|
|
|
|
|