Hi David.
I test your diagnostic code, and the modified adafruit library for receive at least 32bit of registers reads, and this is the results.
With your code on DUE, STM32F103C and NODEMCU the results are same.
Read registers 8-bit SPI with MISO (+ DC)
data sheet specific calls
ILI9163C reg(0x04) = 0x548066
ILI9163C reg(0x09) = 0x00610000
ILI9163C reg(0x0A) = 0x08
ILI9163C reg(0x0B) = 0x00
ILI9163C reg(0x0C) = 0x66
ILI9163C reg(0x0D) = 0x00
ILI9163C reg(0x0E) = 0x00
ILI9163C reg(0x0F) = 0x00
ILI9163C reg(0x2E) = 0xA8A8A8
ILI9163C reg(0xA1) = 0x93309330
ILI9163C reg(0xBF) = 0x00000000
ILI9163C reg(0xD3) = 0xFFFFFFFF
ILI9163C reg(0xDA) = 0x54
ILI9163C reg(0xDB) = 0x80
ILI9163C reg(0xDC) = 0x66
ILI9163C reg(0x36) = 0x0000
And with same boards with modified adafruit library are same results, but different from your code
Display Power Mode: 0x9C
MADCTL Mode: 0x28
Pixel Format: 0x66
Image Format: 0x0
Self Diagnostic: 0x0
----------------------------------------------
0x04: 0x2A4033
0x05: 0x0
0x09: 0xCA318200
0x0A: 0x9C
0x0B: 0x28
0x0C: 0x66
0x0D: 0x0
0x0E: 0x0
0x0F: 0x0
0x45: 0x0
0x52: 0x0
0x54: 0x0
0x56: 0x0
0x5F: 0x0
0xAA: 0x0
0xAF: 0x0
0x2E: 0xA8A8
0xA1: 0xC9984998
0xBF: 0x0
0xD3: 0xFFFFFFFF
0xDA: 0x54
0xDB: 0x80
0xDC: 0x66
0xB0: 0x0
0x36: 0x0
This is your code, you send me some changes in last post, and this is the result after this modifications
// see if 4-line mode can read anything
#define TFT_MOSI 4//D7//75
#define TFT_MISO 5//D6//74
#define TFT_SCK 6//D5//76
#define TFT_SS 9//D1//9
#define TFT_DC 10//D2//10 //DC=7 for HX8347
#define TFT_RESET 8//D3//8 //Backlight on HX8347
#define NINEBITS (1<<0)
#define SDA_INPUT (1<<1)
#define HAS_MISO (1<<2)
#define IS_9341 (1<<3)
char *chip = "controller";
//char interface = 0; //regular ST7735, ILI9163
//char interface = HAS_MISO | IS_9341; //ILI9341 SPI
char interface = HAS_MISO; //regular SPI
//char interface = NINEBITS | SDA_INPUT; //ILI9481 SPI
uint32_t readwrite8(uint8_t cmd, uint8_t bits, uint8_t dummy)
{
digitalWrite(TFT_SS, LOW);
write9(cmd, 0);
uint32_t ret = read8(bits, dummy);
digitalWrite(TFT_SS, HIGH);
return ret;
}
void write9(uint8_t val, uint8_t dc)
{
pinMode(TFT_MOSI, OUTPUT);
digitalWrite(TFT_DC, dc);
if (interface & NINEBITS) {
digitalWrite(TFT_MOSI, dc);
digitalWrite(TFT_SCK, HIGH);
digitalWrite(TFT_SCK, LOW);
}
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;
}
}
void writeblock(uint8_t cmd, uint8_t *block, int8_t N)
{
uint8_t val = cmd;
digitalWrite(TFT_SS, LOW);
write9(cmd, 0);
while (N-- > 0) write9(*block++, 1);
digitalWrite(TFT_SS, HIGH);
}
uint32_t read8(uint8_t bits, uint8_t dummy)
{
uint32_t ret = 0;
uint8_t SDA = (interface & HAS_MISO) ? TFT_MISO : TFT_MOSI;
pinMode(SDA, 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(SDA)) ret |= 1;;
digitalWrite(TFT_SCK, HIGH);
digitalWrite(TFT_SCK, LOW);
}
return ret;
}
void showreg(uint8_t reg, uint8_t bits, uint8_t dummy)
{
uint32_t val, mask = 0x10000000;
for (uint8_t wid = 32; wid > bits; wid -= 4) mask >>= 4;
writeblock(0x01, NULL, 0); //software reset first
delay(100);
uint8_t d[4];
if (interface & SDA_INPUT) {
d[0] = 0x00;
writeblock(0xB0, d, 1); //UNLOCK
d[0] = 0x80;
writeblock(0xC6, d, 1); //enable SDA as input
}
// works for an ILI9341 in 4-wire SPI mode
if ((interface & IS_9341) && ((reg >= 0xB0 && reg < 0xF0)) ) {
val = 0;
d[0] = 0x10;
while (bits > 0) {
writeblock(0xD9, d, 1); // CS sequence
val <<= 8;
val |= readwrite8(reg, 8, 0); // CS sequence
bits -= 8;
d[0]++;
}
}
else val = readwrite8(reg, bits, dummy);
Serial.print(chip);
Serial.print(" reg(0x");
if (reg < 0x10) Serial.print("0");
Serial.print(reg , HEX);
Serial.print(") = 0x");
while (val < mask) Serial.print("0"), mask >>= 4;
if (val) Serial.println(val, HEX);
else Serial.println();
}
void setup() {
// put your setup code here, to run once:
uint32_t ID = 0;
Serial.begin(115200);
while (!Serial) ;
delay(3000);
if (interface & HAS_MISO)
Serial.println("Read registers 8-bit SPI with MISO (+ DC)");
else if (interface & NINEBITS)
Serial.println("Bi-directional Read registers 9-bit SPI");
else
Serial.println("Bi-directional Read registers SDA (+ DC)");
digitalWrite(TFT_SS, HIGH);
// digitalWrite(TFT_SCK, HIGH);
pinMode(TFT_SS, OUTPUT);
pinMode(TFT_SCK, OUTPUT);
pinMode(TFT_MOSI, OUTPUT);
pinMode(TFT_MISO, INPUT);
pinMode(TFT_DC, OUTPUT);
pinMode(TFT_RESET, OUTPUT);
digitalWrite(TFT_RESET, HIGH);
digitalWrite(TFT_RESET, LOW); //Hardware Reset
delay(50);
digitalWrite(TFT_RESET, HIGH);
writeblock(0x01, NULL, 0); //Software Reset
delay(100);
ID = readwrite8(0x04, 24, 1);
if (ID == 0x7C89F0uL) chip = "ST7735S";
if (ID == 0x548066uL) chip = "ILI9163C";
ID &= 0xFF0000;
if (ID == 0x5C0000) chip = "ST7735";
/*
Serial.println("Scan all registers for any response");
for (uint8_t reg = 0; reg < 0xFF; reg++) {
if (readwrite8(reg, 32, 0) != 0xFFFFFFFF)
showreg(reg, 32, 0);
}
*/
Serial.println("data sheet specific calls");
showreg(0x04, 24, 1); //RDDID
showreg(0x09, 32, 1); //RDDSTATUS
showreg(0x0A, 8, 0);
showreg(0x0B, 8, 0); //RDDMADCTL
showreg(0x0C, 8, 0); //RDDCOLMOD
showreg(0x0D, 8, 0);
showreg(0x0E, 8, 0);
showreg(0x0F, 8, 0);
showreg(0x2E, 24, 8); //readGRAM
showreg(0xA1, 32, 1); //ILI9481 DDB_Start
showreg(0xBF, 32, 1); //ILI9481 ID
showreg(0xD3, 32, 1); //RDID4 according to data sheet
showreg(0xDA, 8, 0); //RDID1
showreg(0xDB, 8, 0); //RDID2
showreg(0xDC, 8, 0); //RDID3
showreg(0x36, 16, 0); //RDID3
}
void loop() {
// put your main code here, to run repeatedly:
}
#if defined(USE_SPI)
// use SPI mode #0
uint8_t spi(uint8_t c)
{
SPDR = c;
while ((SPSR & 0x80) == 0) ;
return SPDR;
}
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_SS, LOW);
SPSR = (0 << SPI2X);
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); //1MHz
digitalWrite(TFT_DC, LOW);
pinMode(TFT_MOSI, OUTPUT);
spi(cmd);
if (bits) {
digitalWrite(TFT_DC, HIGH);
pinMode(TFT_MOSI, INPUT);
while (bits) {
ret <<= 8;
ret |= spi(0x00);
bits -= 8;
}
ret >>= dummy;
}
digitalWrite(TFT_SS, HIGH);
return ret;
}
#endif
And this is the modifications that I need to do in the adafruit library, for read more than 8 bit form spi
void CodeTronic_ILI9486::dummyclock(void) {
if (hwSPI) spi_begin();
digitalWrite(_sclk, LOW);
digitalWrite(_sclk, HIGH);
if (hwSPI) spi_end();
}
uint16_t CodeTronic_ILI9486::readcommand16(uint8_t c) {
if (hwSPI) spi_begin();
digitalWrite(_dc, LOW);
digitalWrite(_sclk, LOW);
digitalWrite(_cs, LOW);
spiwrite(c);
digitalWrite(_dc, HIGH);
uint16_t r = spiread();
r <<= 8;
dummyclock();
r |= spiread();
digitalWrite(_cs, HIGH);
if (hwSPI) spi_end();
return r;
}
uint32_t CodeTronic_ILI9486::readcommand24(uint8_t c) {
if (hwSPI) spi_begin();
digitalWrite(_dc, LOW);
digitalWrite(_sclk, LOW);
digitalWrite(_cs, LOW);
spiwrite(c);
digitalWrite(_dc, HIGH);
uint32_t r = spiread();
r <<= 8;
dummyclock();
r |= spiread();
r <<= 8;
dummyclock();
r |= spiread();
digitalWrite(_cs, HIGH);
if (hwSPI) spi_end();
return r;
}
uint32_t CodeTronic_ILI9486::readcommand32(uint8_t c) {
if (hwSPI) spi_begin();
digitalWrite(_dc, LOW);
digitalWrite(_sclk, LOW);
digitalWrite(_cs, LOW);
spiwrite(c);
digitalWrite(_dc, HIGH);
uint32_t r = spiread();
r <<= 8;
dummyclock();
r |= spiread();
r <<= 8;
dummyclock();
r |= spiread();
r <<= 8;
dummyclock();
r |= spiread();
digitalWrite(_cs, HIGH);
if (hwSPI) spi_end();
return r;
}