Day2调节屏幕驱动
原理图:
要想调节屏幕驱动
#include "app_io.h"
#include "app_spi.h"
#include "board_SK.h"
#include "gr55xx_hal_gpio.h"
#include "gr55xx_hal_spi.h"
#include "app_qspi.h"
#define GH32_CS_10_PIN APP_IO_PIN_6
#define GH32_CS_IO_MUX APP_IO_MUX_7
#define GH32_CS_IO_TYP APP_IO_TYPE_NORMAL
#define GH32_RE_IO_PIN APP_IO_PIN_9
#define GH32_RE_IO_MUX APP_IO_MUX_7
#define GH32_RE_IO_TYP APP_IO_TYPE_NORMAL
#define GH32_DC_IO_PIN APP_IO_PIN_10
#define GH32_DC_IO_MUX APP_IO_MUX_7
#define GH32_DC_IO_TYP APP_IO_TYPE_NORMAL
#define GH32_TE_IO_PIN APP_IO_PIN_11
#define GH32_TE_IO_MUX APP_IO_MUX_7
#define GH32_TE_IO_TYP APP_IO_TYPE_NORMAL
#define QSPI_ID APP_FLASH_QSPI_ID
#define APP_FLASH_CS_IO_TYPE APP_QSPI1_CS_IO_TYPE
#define APP_QSPI1_CS_IO_TYPE APP_IO_TYPE_NORMAL
#define APP_FLASH_GPIO_MUX APP_QSPI1_GPIO_MUX
#define APP_QSPI1_GPIO_MUX APP_IO_MUX_2
#define APP_FLASH_CS_PIN APP_QSPI1_CS_PIN
#define APP_QSPI1_CS_PIN APP_IO_PIN_15
#define APP_FLASH_CLK_IO_TYPE APP_QSPI1_CLK_IO_TYPE
#define APP_QSPI1_CLK_IO_TYPE APP_IO_TYPE_NORMAL
#define APP_FLASH_GPIO_MUX APP_QSPI1_GPIO_MUX
#define APP_QSPI1_GPIO_MUX APP_IO_MUX_2
#define APP_FLASH_CLK_PIN APP_QSPI1_CLK_PIN
#define APP_QSPI1_CLK_PIN APP_IO_PIN_9
spi_handle_t *spi_m_handle;
app_spi_params_t spi_m_param;
void lcd_x_pin_ctrl(uint8_t pin_level)
{
if (pin_level) app_io_write_pin(GH32_CS_IO_TYP, GH32_CS_10_PIN, APP_IO_PIN_SET);
else app_io_write_pin(GH32_CS_IO_TYP, GH32_CS_10_PIN, APP_IO_PIN_RESET);
if (pin_level) app_io_write_pin(GH32_RE_IO_TYP, GH32_RE_IO_PIN, APP_IO_PIN_SET);
else app_io_write_pin(GH32_RE_IO_TYP, GH32_RE_IO_PIN, APP_IO_PIN_RESET);
if (pin_level) app_io_write_pin(GH32_DC_IO_TYP, GH32_DC_IO_PIN, APP_IO_PIN_SET);
else app_io_write_pin(GH32_DC_IO_TYP, GH32_DC_IO_PIN, APP_IO_PIN_RESET);
if (pin_level) app_io_write_pin(GH32_TE_IO_TYP, GH32_TE_IO_PIN, APP_IO_PIN_SET);
else app_io_write_pin(GH32_TE_IO_TYP, GH32_TE_IO_PIN, APP_IO_PIN_RESET);
}
void spi_master_cb(app_spi_evt_t *p_evt)
{
}
void hal_gh3x2x_spi_init(void)
{
spi_m_param.id = APP_SPI_ID_MASTER;
spi_m_param.pin_cfg.cs.enable = APP_SPI_PIN_DISABLE;
//时钟线
spi_m_param.pin_cfg.clk.type = APP_IO_TYPE_NORMAL;
spi_m_param.pin_cfg.clk.pin = APP_IO_PIN_3;
spi_m_param.pin_cfg.clk.mux = APP_IO_MUX_2;
spi_m_param.pin_cfg.clk.mode = APP_IO_MODE_MUX;
spi_m_param.pin_cfg.clk.pull = APP_IO_PULLUP;
spi_m_param.pin_cfg.clk.enable = APP_SPI_PIN_ENABLE;
//5515给屏幕的
spi_m_param.pin_cfg.mosi.type = APP_IO_TYPE_NORMAL;
spi_m_param.pin_cfg.mosi.pin = APP_IO_PIN_4;
spi_m_param.pin_cfg.mosi.mux = APP_IO_MUX_2;
spi_m_param.pin_cfg.mosi.mode = APP_IO_MODE_MUX;
spi_m_param.pin_cfg.mosi.pull = APP_IO_PULLUP;
spi_m_param.pin_cfg.mosi.enable = APP_SPI_PIN_ENABLE;
//屏幕给5515的
spi_m_param.pin_cfg.miso.type = APP_IO_TYPE_NORMAL;
spi_m_param.pin_cfg.miso.pin = APP_IO_PIN_5;
spi_m_param.pin_cfg.miso.mux = APP_IO_MUX_2;
spi_m_param.pin_cfg.miso.mode = APP_IO_MODE_MUX;
spi_m_param.pin_cfg.miso.pull = APP_IO_PULLUP;
spi_m_param.pin_cfg.miso.enable = APP_SPI_PIN_ENABLE;
spi_m_param.init.data_size = SPI_DATASIZE_8BIT;
spi_m_param.init.clock_polarity = SPI_POLARITY_LOW;
spi_m_param.init.clock_phase = SPI_PHASE_1EDGE;
spi_m_param.init.baudrate_prescaler = 8; //64/8MHz
spi_m_param.init.ti_mode = SPI_TIMODE_DISABLE;
spi_m_param.init.slave_select = SPI_SLAVE_SELECT_0;
spi_m_param.is_soft_cs = 1;
app_spi_init(&spi_m_param, spi_master_cb);
spi_m_handle = app_spi_get_handle(APP_SPI_ID_MASTER);
app_io_init_t io_init = APP_IO_DEFAULT_CONFIG;
io_init.pull = APP_IO_PULLUP;
io_init.mode = APP_IO_MODE_OUTPUT;
io_init.pin = GH32_CS_10_PIN;
io_init.mux = APP_IO_MUX_7;
app_io_init(GH32_CS_IO_TYP, &io_init);
app_io_write_pin(GH32_CS_IO_TYP, GH32_CS_10_PIN, APP_IO_PIN_SET);
app_io_init(GH32_RE_IO_TYP, &io_init);
app_io_write_pin(GH32_RE_IO_TYP, GH32_RE_IO_PIN, APP_IO_PIN_SET);
app_io_init(GH32_DC_IO_TYP, &io_init);
app_io_write_pin(GH32_DC_IO_TYP, GH32_DC_IO_PIN, APP_IO_PIN_SET);
app_io_init(GH32_TE_IO_TYP, &io_init);
app_io_write_pin(GH32_TE_IO_TYP, GH32_TE_IO_PIN, APP_IO_PIN_SET);
}
// 使能SPI通信
uint8_t lcd_spi_write(uint8_t write_buffer[], uint16_t length)
{
hal_status_t ret;
app_io_write_pin(GH32_CS_IO_TYP, GH32_CS_10_PIN, APP_IO_PIN_RESET); // 拉低CS引脚以选择设备
ret = hal_spi_transmit(spi_m_handle, write_buffer, length, 1000);
printf("SPI lcd_spi_write: %d\n", ret);
if (ret != HAL_OK) return 0;
else return 1;
}
uint8_t lcd_spi_read(uint8_t read_buffer[], uint16_t length)
{
hal_status_t ret;
app_io_write_pin(GH32_CS_IO_TYP, GH32_CS_10_PIN, APP_IO_PIN_SET); // 拉高CS引脚以结束通信
ret = hal_spi_receive(spi_m_handle, read_buffer, length, 1000);
printf("SPI lcd_spi_read: %d\n", ret);
if (ret != HAL_OK) return 0;
else return 1;
}
// 向LCD发送命令
uint8_t WriteComm(uint8_t send)
{
app_io_write_pin(GH32_DC_IO_TYP, GH32_DC_IO_PIN, APP_IO_PIN_SET); // 设置DCX为低,表示将要发送的是命令
return lcd_spi_write(&send, 1);
}
// 向LCD发送数据
uint8_t WriteData(uint8_t send)
{
app_io_write_pin(GH32_DC_IO_TYP, GH32_DC_IO_PIN, APP_IO_PIN_RESET);
return lcd_spi_write(&send, 1);
}
// 设置LCD的寄存器并发送数据
void lcd_set_register_and_data()
{
WriteComm(0xFE);WriteData(0x01);
WriteComm(0x04);WriteData(0xa0); //SPI write ram enable
WriteComm(0x05);WriteData(0x70); //128RGB);;LCDSPI_InitDAT( T->B);;LCDSPI_InitDAT( NW
WriteComm(0x06);WriteData(0x3C); //NL = 240 line
WriteComm(0x25);WriteData(0x06); //normal mode: gamma1);;LCDSPI_InitDAT( 24bit
WriteComm(0x26);WriteData(0x80); //T1A = 280(640 * 100ns = 64us);
WriteComm(0x27);WriteData(0x12); //normal mode VBP = 12 0c
WriteComm(0x28);WriteData(0x12); //normal mode VFP = 8 08
WriteComm(0x2A);WriteData(0x06); //idle mode: gamma1);;LCDSPI_InitDAT( 24bit
WriteComm(0x2B);WriteData(0x80); //T1B = 280(640 * 100ns = 64us);
WriteComm(0x2D);WriteData(0x12); //idle mode VBP = 12 0c
WriteComm(0x2F);WriteData(0x12); //idle mode VFP = 8 08
WriteComm(0x37);WriteData(0x0C); //precharge to VGSP);;LCDSPI_InitDAT( mux 1:6
WriteComm(0x6D);WriteData(0x18); //skip frame VGMP and VGSP regulator off
WriteComm(0x29);WriteData(0x01); //normal mode skip frame off
WriteComm(0x30);WriteData(0x43); //idle mode skip frame = 60/2 = 30Hz
WriteComm(0x0E);WriteData(0x83); //AVDD = 5.6V normal mode
WriteComm(0x0F);WriteData(0x83); //AVDD = 5.6V idle mode
WriteComm(0x10);WriteData(0x71); //AVDD = 3xVCI);;LCDSPI_InitDAT( AVDD regulator enable);;LCDSPI_InitDAT(VCL regulator enable
WriteComm(0x11);WriteData(0xb3); //VCL = -2xVCI);;LCDSPI_InitDAT( normal mode
WriteComm(0x12);WriteData(0xb3); //VCL = -2xVCI);;LCDSPI_InitDAT( idle mode
WriteComm(0x13);WriteData(0x80); //VGH = AVDD normal mode
WriteComm(0x14);WriteData(0x80); //VGH = AVDD idle mode
WriteComm(0x15);WriteData(0x81); //VGL = VCL - VCI normal mode
WriteComm(0x16);WriteData(0x81); //VGL = VCL - VCI idle mode
WriteComm(0x18);WriteData(0x66); //VGHR = 6V normal/idle mode
WriteComm(0x19);WriteData(0x44); //VGLR = -6V normal/idle mode
WriteComm(0x1E);WriteData(0x02); //Switch EQ on
WriteComm(0x5B);WriteData(0x10); //VREFN5 on
WriteComm(0x62);WriteData(0x19); //VREFN5 = -3V normal mode
WriteComm(0x63);WriteData(0x19); //VREFN5 = -3V idle mode
WriteComm(0x70);WriteData(0x55); //display off SD to AVDD);;LCDSPI_InitDAT( display on SD to AVDD
WriteComm(0x1D);WriteData(0x02); //Switch EQ on
WriteComm(0x89);WriteData(0x18); //VGMP =118 );;LCDSPI_InitDAT(5.5V
WriteComm(0x8A);WriteData(0xb9); //VGSP = 090 );;LCDSPI_InitDAT(2V
WriteComm(0x8B);WriteData(0x01); //VGMP VGSP high byte
WriteComm(0x8C);WriteData(0x10); //VGMP = 110 );;LCDSPI_InitDAT(5.4V
WriteComm(0x8D);WriteData(0x90); //VGSP = 090 );;LCDSPI_InitDAT(2V
WriteComm(0x8E);WriteData(0x01); //VGMP VGSP high byte
WriteComm(0x6E);WriteData(0x0A); //MIPI interface off
WriteComm(0x6A);WriteData(0x05); //MUX
WriteComm(0x3A);WriteData(0x08); //T1_sd
WriteComm(0x3B);WriteData(0x00); //Tp_sd
WriteComm(0x3D);WriteData(0x16); //Th_sd
WriteComm(0x3F);WriteData(0x27); //Tsw_sd
WriteComm(0x40);WriteData(0x0F); //Thsw_sd
WriteComm(0x41);WriteData(0x0D); //Thsd_sd
WriteComm(0x42);WriteData(0x14); //Mux 142536);;LCDSPI_InitDAT( odd/even line SWAP
WriteComm(0x43);WriteData(0x41);
WriteComm(0x44);WriteData(0x25);
WriteComm(0x45);WriteData(0x52);
WriteComm(0x46);WriteData(0x36);
WriteComm(0x47);WriteData(0x63);
WriteComm(0x48);WriteData(0x14);
WriteComm(0x49);WriteData(0x41);
WriteComm(0x4A);WriteData(0x25);
WriteComm(0x4B);WriteData(0x52);
WriteComm(0x4C);WriteData(0x36);
WriteComm(0x4D);WriteData(0x63);
WriteComm(0x4E);WriteData(0x14); //Data R1R2G1G2B1B2);;LCDSPI_InitDAT( odd/even line SWAP
WriteComm(0x4F);WriteData(0x41);
WriteComm(0x50);WriteData(0x25);
WriteComm(0x51);WriteData(0x52);
WriteComm(0x52);WriteData(0x36);
WriteComm(0x53);WriteData(0x63);
WriteComm(0x54);WriteData(0x14);
WriteComm(0x55);WriteData(0x41);
WriteComm(0x56);WriteData(0x25);
WriteComm(0x57);WriteData(0x52);
WriteComm(0x58);WriteData(0x36);
WriteComm(0x59);WriteData(0x63);
WriteComm(0x66);WriteData(0x90); //idle mode internal power
WriteComm(0x67);WriteData(0x40); //internal power delay 1 frame off
WriteComm(0x72);WriteData(0x1A); //internal OVDD = 4.6V
WriteComm(0x73);WriteData(0x07); //internal OVSS = -2V
WriteComm(0x74);WriteData(0x0C); //OVDD power from AVDD);;LCDSPI_InitDAT( source power from AVDD
WriteComm(0x6A);WriteData(0x3D); //swire 61=0x3D pulse);;LCDSPI_InitDAT( 4.6V for SGM38042
WriteComm(0x6B);WriteData(0x29); //swire 41=0x29 pulse);;LCDSPI_InitDAT( -2.4V for SGM38042
WriteComm(0xFE);WriteData(0x04);
WriteComm(0x5E);WriteData(0x01);
WriteComm(0x5F);WriteData(0xB8);
WriteComm(0x60);WriteData(0xBB);
WriteComm(0x61);WriteData(0xBB);
WriteComm(0x62);WriteData(0xBB);
WriteComm(0x76);WriteData(0xBB);
WriteComm(0x77);WriteData(0x3B);
WriteComm(0x78);WriteData(0x92);
WriteComm(0x79);WriteData(0xBB);
WriteComm(0x7A);WriteData(0xBB);
WriteComm(0x00);WriteData(0xDC); //SN_CK1
WriteComm(0x01);WriteData(0x00);
WriteComm(0x02);WriteData(0x02);
WriteComm(0x03);WriteData(0x00);
WriteComm(0x04);WriteData(0x08);
WriteComm(0x05);WriteData(0x01);
WriteComm(0x06);WriteData(0x70);
WriteComm(0x07);WriteData(0x0A);
WriteComm(0x08);WriteData(0x00);
WriteComm(0x09);WriteData(0xDC); //SN_CK2
WriteComm(0x0a);WriteData(0x00);
WriteComm(0x0b);WriteData(0x02);
WriteComm(0x0C);WriteData(0x00);
WriteComm(0x0D);WriteData(0x08);
WriteComm(0x0E);WriteData(0x00);
WriteComm(0x0F);WriteData(0x70);
WriteComm(0x10);WriteData(0x0A);
WriteComm(0x11);WriteData(0x00);
WriteComm(0x12);WriteData(0xCC); //EM_CK1
WriteComm(0x13);WriteData(0x00);
WriteComm(0x14);WriteData(0x02);
WriteComm(0x15);WriteData(0x00);
WriteComm(0x16);WriteData(0x20);
WriteComm(0x17);WriteData(0x00);
WriteComm(0x18);WriteData(0x28);
WriteComm(0x19);WriteData(0x26);
WriteComm(0x1A);WriteData(0x00);
WriteComm(0x1B);WriteData(0xCC); //EM_CK2
WriteComm(0x1C);WriteData(0x00);
WriteComm(0x1D);WriteData(0x02);
WriteComm(0x1E);WriteData(0x00);
WriteComm(0x1F);WriteData(0x20);
WriteComm(0x20);WriteData(0x01);
WriteComm(0x21);WriteData(0x28);
WriteComm(0x22);WriteData(0x26);
WriteComm(0x23);WriteData(0x00);
WriteComm(0x4C);WriteData(0x89); //SN_STV
WriteComm(0x4D);WriteData(0x00);
WriteComm(0x4E);WriteData(0x01);
WriteComm(0x4F);WriteData(0x00);
WriteComm(0x50);WriteData(0x01);
WriteComm(0x51);WriteData(0xBB);
WriteComm(0x52);WriteData(0xBB);
WriteComm(0x53);WriteData(0xCA); //EM_STV
WriteComm(0x54);WriteData(0x00);
WriteComm(0x55);WriteData(0x03);
WriteComm(0x56);WriteData(0x00);
WriteComm(0x58);WriteData(0x00);
WriteComm(0x59);WriteData(0x00);
WriteComm(0x65);WriteData(0x45); //04
WriteComm(0x66);WriteData(0x0C); //03
WriteComm(0x67);WriteData(0x00); //10
WriteComm(0xFE);WriteData(0x01);//ID
WriteComm(0xE5);WriteData(0x00);
WriteComm(0xE6);WriteData(0x10);
WriteComm(0xE7);WriteData(0x31);
WriteComm(0xFE);WriteData(0x00);
WriteComm(0xC4);WriteData(0x80);
WriteComm(0x2A);WriteData(0x00);WriteData(0x04);WriteData(0x00);WriteData(0x7B);
WriteComm(0x11);WriteData(0x00);
delay_ms(150);
WriteComm(0x29);WriteData(0x00);
}