Files
TFT_eSPI/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino
T
Bodmer 40d35b1892 Examples menu now based on resolution
Reference to particular drivers in examples have been removed as
multiple display drivers are now supported.
Tabs replaced by spaces in header file by file editor.
RPi TFT with write strobe SPI clock rate dropped to 20MHz (display
cannot cope with new high rate siWriteBlock() function)
2017-04-24 22:35:11 +01:00

167 lines
4.1 KiB
Arduino

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