Adapting SPI_TFT_ILI9320 library to work with the ILI9325 Controller
Overview
I'd been happily using Frank Vannieuwkerke's SPI_TFT_ILI9320 library quite happily for awhile with my Mini-DK2 board (thanks Frank!) and the HY28A SPI TFT display that came with it, and it worked beautifully. Until that is, I bought another one and was told that the 'A' display variant was now obsolete and that it has been replaced with the HY28B display, which has a different pin-out in order to accommodate a new controller (ILI9325) and dual parallel and SPI interfaces. Luckily, the changes required to Frank's library are not great. You just need some new code to reset the display.
New SPI tft_reset() function
void SPI_TFT::tft_reset()
{
DigitalOut lcd_reset(P3_26); // Hard coded to reset the display properly on my board
lcd_reset = 1; // Reset is active low.
wait_ms(100);
lcd_reset = 0; // Reset
wait_ms(2); // wait at least 1ms
lcd_reset = 1;
wait_ms(50); // Now wait at least 50ms before doing anything else
_spi.format(8,3); // 8 bit spi mode 3
_spi.frequency(SPI_F_HI); // 24 Mhz SPI clock on my board, but Frank's code sets it to 48MHz
// Begin 9325C setup
// LCD reset for the ILI9325C
wr_reg(0x00e7,0x0010);
wr_reg(0x0000,0x0001); // Start internal oscillator
wr_reg(0x0001,0x0100);
wr_reg(0x0002,0x0700); // Power on sequence
wr_reg(0x0003,(1<<12)|(1<<5)|(1<<4)|(1<<3)); // Important!
wr_reg(0x0004,0x0000);
wr_reg(0x0008,0x0207); // Display Control 2
wr_reg(0x0009,0x0000); // Display Control 3
wr_reg(0x000a,0x0000); // Display Control 4
wr_reg(0x000c,0x0001); // RGB Display Interface Control 1
wr_reg(0x000d,0x0000); // Frame Marker Position
wr_reg(0x000f,0x0000); // RGB Display Interface Control 2
// Power on sequence
wr_reg(0x0010,0x0000); // Power Control 1
wr_reg(0x0011,0x0007); // Power Control 2
wr_reg(0x0012,0x0000); // Power Control 3
wr_reg(0x0013,0x0000); // Power Control 4
wait_ms(50);
wr_reg(0x0010,0x1590); // Power Control 1
wr_reg(0x0011,0x0227); // Power Control 2
wait_ms(50);
wr_reg(0x0012,0x009c); // Power Control 3
wait_ms(50);
wr_reg(0x0013,0x1900); // Power Control 4
wr_reg(0x0029,0x0023); // Power Control 7
wr_reg(0x002b,0x000e); // Frame Rate and Color Control
wait_ms(50);
wr_reg(0x0020,0x0000); // Set GRAM Horizontal Address
wr_reg(0x0021,0x0000); // Set GRAM Vertical Address
wait_ms(50);
wr_reg(0x0030,0x0007); // Gamma control
wr_reg(0x0031,0x0707); // Gamma control
wr_reg(0x0032,0x0006); // Gamma control
wr_reg(0x0035,0x0704); // Gamma control
wr_reg(0x0036,0x1f04); // Gamma control
wr_reg(0x0037,0x0004); // Gamma control
wr_reg(0x0038,0x0000); // Gamma control
wr_reg(0x0039,0x0706); // Gamma control
wr_reg(0x003c,0x0701); // Gamma control
wr_reg(0x003d,0x000f); // Gamma control
wait_ms(50);
wr_reg(0x0050,0x0000); // Horizontal and Vertical RAM Address Position
wr_reg(0x0051,0x00ef); // Horizontal and Vertical RAM Address Position
wr_reg(0x0052,0x0000); // Horizontal and Vertical RAM Address Position
wr_reg(0x0053,0x013f); // Horizontal and Vertical RAM Address Position
wr_reg(0x0060,0xa700); // Gate Scan Control
wr_reg(0x0061,0x0001); // Gate Scan Control
wr_reg(0x006a,0x0000); // Gate Scan Control
wr_reg(0x0080,0x0000); // Partial Image 1 Display Position
wr_reg(0x0081,0x0000); // Partial Image 1 RAM Start/End Address
wr_reg(0x0082,0x0000); // Partial Image 1 RAM Start/End Address
wr_reg(0x0083,0x0000); // Partial Image 2 Display Position
wr_reg(0x0084,0x0000); // Partial Image 2 RAM Start/End Address
wr_reg(0x0085,0x0000); // Partial Image 2 RAM Start/End Address
wr_reg(0x0090,0x0010); // Panel Interface Control 1
wr_reg(0x0092,0x0000); // Panel Interface Control 2
wr_reg(0x0093,0x0003);
wr_reg(0x0095,0x0110); // Panel Interface Control 4
wr_reg(0x0097,0x0000); // Panel Interface Control 5
wr_reg(0x0098,0x0000);
wr_reg(0x0007,0x0133); // Sequence to turn Display On
// End 9325 setup
wr_reg(0x0020,0x0000); // Set X position to 0
wr_reg(0x0021,0x0000); // Set Y position to 0
wait_ms(100);
WindowMax();
}
I publish my initialisation code for the ILI9325 controller for whoever might find it useful. Simply replace the tft_reset() function in Frank's original library with this one.
3 comments on Adapting SPI_TFT_ILI9320 library to work with the ILI9325 Controller:
Please log in to post comments.

Hi Jason
I'm trying to get HY28B dispay to work with KL25Z without any luck using the updated tft_reset function above. When the board is powered up, the display stays grayish color. Is there anything else I need to modify?
Thanks a lot.