Hi all, more progress (see attached).
So I found the app notes for the SSD1963, this really cleared things up for me, sort of.
I'm also waiting to hear back from the display place about the funky code in the app note, I'm hoping they have a good solution to my problem.
I still have this chunk of dead space to the right, and this strange flicker (which gets worse if I forget to switch to the internal PLL, so it might be a clock thing). I expected the display to be rock solid, so I'm not sure if it's the code.. or hardware, both, neither?
I'll keep chugging along, if anyone has any input, I'm all ears, and a foot. (I prefer the metric system).
(setting the Horizontal Display Period Start Position, shifts the display the wrong way, so I'm at a loss about the white chunk)
init code is below
void LCD_Init(void)
{
/* #1 */
LCD_RST_SET
HAL_Delay(100);
LCD_RST_RESET
HAL_Delay(120);
LCD_RST_SET
HAL_Delay(150);
// Software reset
LCD_Send_Cmd(0x01); // Trigger software reset
HAL_Delay(50); // Wait for reset to complete
/* #2 */
// PLL configuration
LCD_Send_Cmd(0xE2); // PLL multiplier, set PLL clock
//LCD_Send_Dat(0x1D); // M = 29
//LCD_Send_Dat(0x02); // n = 2
//LCD_Send_Dat(0x54); // dummy byte
LCD_Send_Dat(0x1E);
LCD_Send_Dat(0x02);
LCD_Send_Dat(0x54);
/* #3 */
LCD_Send_Cmd(0xE0); //
LCD_Send_Dat(0x01); // Enable PLL
HAL_Delay(10); // Wait for PLL to stabilize
/* #4 */
/* #5 */
LCD_Send_Cmd(0xE0); //
LCD_Send_Dat(0x03); // Switch to PLL
/* #6 */
LCD_Send_Cmd(0x01);
/* #7 */
// Set pixel clock (DCLK)
LCD_Send_Cmd(0xE6);
//LCD_Send_Dat(0x03); // Set DCLK frequency to 21MHz
//LCD_Send_Dat(0x5C); //
//LCD_Send_Dat(0x28); //
LCD_Send_Dat(0x03);
LCD_Send_Dat(0xFF);
LCD_Send_Dat(0xF5);
/* #8 A */
// Set display configuration
LCD_Send_Cmd(0xB0); // Set display mode
LCD_Send_Dat(0x24); // 24-bit color depth
LCD_Send_Dat(0x00); // TFT type
LCD_Send_Dat(0x03); // 1024 pixels horizontal
LCD_Send_Dat(0xFF); //
LCD_Send_Dat(0x00); // 100 pixels vertical
LCD_Send_Dat(0x63); //
LCD_Send_Dat(0x00); // dummy byte
/* #8 B */
// Horizontal timings
LCD_Send_Cmd(0xB4);
LCD_Send_Dat(0x05); // HT: horizontal total period (display + non-display) – 1
LCD_Send_Dat(0x3F); // 1344 - 1 - 1343
LCD_Send_Dat(0x00); // HPS: Horizontal Sync Pulse Start Position = Horizontal Pulse Width + Horizontal Back Porch
LCD_Send_Dat(0x9F); // 1 + 158 = 159
LCD_Send_Dat(0x00); // HPW: Horizontal Sync Pulse Width - 1
// 1 - 1
LCD_Send_Dat(0x00); // LPS: Horizontal Display Period Start Position = 0x0000
LCD_Send_Dat(0x00);
LCD_Send_Dat(0x00); // LPSPP: Horizontal Sync Pulse Subpixel Start Position(for serial TFT interface). Dummy value for TFT interface.
/* #8 C */
// Vertical timings
LCD_Send_Cmd(0xB6);
LCD_Send_Dat(0x00); // VT: Vertical Total (display + non-display) Period – 1
LCD_Send_Dat(0x81); // 130 - 1 = 129
LCD_Send_Dat(0x00); // VPS: Vertical Sync Pulse Start Position = Vertical Pulse Width + Vertical Back Porch
LCD_Send_Dat(0x17); // 2 + 21 = 23
LCD_Send_Dat(0x01); // VPW: Vertical Sync Pulse Width – 1, 2 - 1 = 1
LCD_Send_Dat(0x00); // FPS: Vertical Display Period Start Position = 0x0000
LCD_Send_Dat(0x00);
/* #9 */
LCD_Send_Cmd(0xBE); //set PWM for B/L
LCD_Send_Dat(0x08);
LCD_Send_Dat(0x80);
LCD_Send_Dat(0x01);
/* #10 */
// Turn on display
LCD_Send_Cmd(0x29); // Display on command
/* #11 A */
// Set column address range
LCD_Send_Cmd(0x2A);
LCD_Send_Dat(0x00);
LCD_Send_Dat(0x00);
LCD_Send_Dat(0x00); //100 - 1
LCD_Send_Dat(0x63);
/* #11 B */
// Set page address range
LCD_Send_Cmd(0x2B);
LCD_Send_Dat(0x00);
LCD_Send_Dat(0x00);
LCD_Send_Dat(0x03); //1024 - 1
LCD_Send_Dat(0xFF);
/* #12 */
LCD_Send_Cmd(0x36); // set address mode
LCD_Send_Dat(0x08); //
//LCD_Send_Dat(0x02); //
/* #13 */
// Pixel data format configuration
LCD_Send_Cmd(0xF0);
LCD_Send_Dat(0x00); // 8bit interface
//HAL_Delay(100); // Wait for the display to stabilize before use
}