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() {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 |