st7701s 412 960屏幕裸奔显示不全,有一部分开机显示一点然后就不在显示了。 用的是tcon+buffer. 怎么改参数都不行。求助。
如何调啊。或者调整方向。412*960分辨率。
static void LCD_TCON_Init(void)
{
//CCU->PLL_VIDEO_CR=0x81004103;
/*** 初始化IO ***/
//LCD_TCON_IO_Init();
/*** 开启TCON时钟 ***/
/* 选通TCON时钟 */
//bit[31]: 1 选通TCON时钟
//bit[26:24]: 000 选择时钟源为PLL_VIDEO(1X) = 198MHz
CCU->TCON_CLK = 0x80000000;
/* 选通LCD总线时钟 */
//bit[4]: 1 选通LCD总线时钟接入AHB(200MHz)时钟
CCU->GR1 |= (1<<4);
/* 解除LCD总线复位 */
//bit[4]: 1 LCD复位解除
CCU->SOFT_RST1 |= (1<<4);
/*** 初始化TCON ***/
/* 配置初始化参数 */
LCD_Dev.clktcon = 90;
LCD_Dev.pixel_clock_hz = 15;
LCD_Dev.Height=960;
LCD_Dev.Width=412;
LCD_Dev.VSPW=1; //高度 帧
LCD_Dev.VBPD=10;
LCD_Dev.VFPD=10;
LCD_Dev.HSPW=1; //宽度 行
LCD_Dev.HBPD=20;
LCD_Dev.HFPD=20;
LCD_Dev.H_totaltime=LCD_Dev.Width+LCD_Dev.HFPD+LCD_Dev.HBPD+LCD_Dev.HSPW;
LCD_Dev.V_totaltime=LCD_Dev.H_totaltime*LCD_Dev.Height+LCD_Dev.VSPW+LCD_Dev.VBPD+LCD_Dev.VFPD;
/* 配置TCON_CR寄存器 */
//bit[31]: 0 先失能TCON
//bit[0]: 0 选择TCON0
TCON->CR = 0x00000000;
/* 配置TCON_FRM_CR寄存器 */
//bit[31]: 1 使能FRM
//bit[6]: 1 Red占5bit
//bit[5]: 0 Green占6bit
//bit[4]: 1 Blue占5bit
//bit[1:0]: 00 关闭测试
// TCON->FRM_CR &= ~((1<<5)|(0x3<<0));
// TCON->FRM_CR |= ((1<<31)|(1<<6)|(1<<4));
//个人替换
TCON->FRM_CR &= ~((1<<5)|(1<<6)|(1<<4)|(0x2<<0));
TCON->FRM_CR |= (1<<31)|(1<<5)|(1<<6)|(1<<4);
/* 这几个寄存器似乎与DMA方式没有关系,我也不知道实干嘛用的 */
/* 配置TCON_FRM_Seed寄存器 */
// TCON->FRM_Seed0_R = 0x11111111;
// TCON->FRM_Seed0_G = 0x11111111;
// TCON->FRM_Seed0_B = 0x11111111;
// TCON->FRM_Seed1_R = 0x11111111;
// TCON->FRM_Seed1_G = 0x11111111;
// TCON->FRM_Seed1_B = 0x11111111;
// // /* 配置TCON_FRM_Table寄存器 */
// TCON->FRM_TBL0 = 0x01010000;
// TCON->FRM_TBL1 = 0x15151111;
// TCON->FRM_TBL2 = 0x57575555;
// TCON->FRM_TBL3 = 0x7f7f7777;
// /* 配置初始化参数 */
// LCD_Dev.Height=960; 帧
// LCD_Dev.Width=412; //行
// LCD_Dev.VSPW=1; //高度 帧 垂直方向最低脉冲的宽度(如该脉冲宽度较低电子枪可能会反应不过来
// LCD_Dev.VBPD=8; 是指电子枪移动至分辨率第一个垂直像素前,所能移动的像素个数(上宽,不可视)
// LCD_Dev.VFPD=8; 是指电子枪移动至分辨率最后一个垂直像素后,还可以继续移动的像素个数(下宽
// LCD_Dev.HSPW=10; //宽度 行 水平方向最低脉冲的宽度(如该脉冲宽度较低电子枪可能会反应不过来
// LCD_Dev.HBPD=10; 是指电子枪移动至分辨率第一个水平像素前,所能移动的像素个数(前宽,不可视
// LCD_Dev.HFPD=10; 是指电子枪移动至分辨率最后一个水平像素后,还可以继续移动的像素个数(后宽,
/* 配置TCON0_CR寄存器 */
//bit[31]: 1 时钟发生器使能
//bit[26:24]: 00 接口类型选择RGB接口,即HV(Sync+DE)
//bit[21]: 1 复位FIFO1
//bit[23]: 1 RGB变BGR
//bit[20]: 1 使能总线
//bit[8:4]: VFP+VBP+VSPW
//bit[1:0]: 10 数据源为DMA565
//TCON->T0_CR = ((1<<31)|(1<<21)|(0<<23)|(1<<20)|((LCD_Dev.VFPD+LCD_Dev.VBPD+LCD_Dev.VSPW)<<4)|(0x2<<0));
TCON->T0_CR = ((1<<31)|(0x0<<24)|(1<<21)|(0<<23)|(1<<20)|(((LCD_Dev.VFPD+LCD_Dev.VBPD+LCD_Dev.VSPW) & 0x1f)<<4)|(0x2<<0));
//LCD_Dev.clktcon = 198000000;
//LCD_Dev.pixel_clock_hz = 33000000;
/* 配置TCON_CCR寄存器 */
//bit[31:28]: 0x1 dclk_en = 1; dclk1_en = 0; dclk2_en = 0; dclkm2_en = 0;
//bit[7:0]: 30 DCLK = PLL_VIDEO / 30 = 6.6MHz
TCON->CCR = ((0xf<<28)|((LCD_Dev.clktcon / LCD_Dev.pixel_clock_hz)<<0));
/* 配置TCON0_BTR寄存器 */
//bit[26:16]: 屏幕宽度-1
//bit[10:0]: 屏幕高度-1
TCON->T0_BTR0 = (((LCD_Dev.Width-1)<<16)|((LCD_Dev.Height-1)<<0));
//bit[27:16]: Width+HFP+HBP+HSPW-1
//bit[9:0]: HBP-1
//TCON->T0_BTR1 = (((LCD_Dev.Width+LCD_Dev.HBPD- 4)<<16)|((LCD_Dev.HBPD - 1)<<0));
u32 bp, total;
bp = LCD_Dev.HSPW + LCD_Dev.HBPD;
total = LCD_Dev.Width + LCD_Dev.HFPD + bp;
TCON->T0_BTR1 = ((total - 1) << 16) | ((bp - 1) << 0);
//bit[27:16]: Height+VFP+VBP+VSPW*2
//bit[9:0]: VBP-1
bp = LCD_Dev.VSPW + LCD_Dev.VBPD;
total = LCD_Dev.Height + LCD_Dev.VFPD + bp;
TCON->T0_BTR2 = ((total * 2) << 16) | ((bp - 1) << 0);
//TCON->T0_BTR2 = ((((LCD_Dev.Height+LCD_Dev.VFPD+LCD_Dev.VBPD+LCD_Dev.VSPW) - 1)<<16)|((LCD_Dev.VBPD - 1)<<0));
//TCON->T0_BTR2 = ((((LCD_Dev.VFPD) - 1)<<16)|((LCD_Dev.VBPD - 1)<<0));
//bit[25:16]: HSPW
//bit[5:0]: VSPW
TCON->T0_BTR3 = (((LCD_Dev.HSPW-1)<<16)|((LCD_Dev.VSPW-1)<<0));
TCON->T0_HVTR = 0;
TCON->T0_CPU_CR = 0;
/* 配置TCON0_IO寄存器 */
//bit[26]: 1 DotCLK电平反转,经过实验这样要更稳定些
//bit[23:0]: 1…… 反人类的ST7789……数据线电平全部反转
//TCON->T0_IO_CR0 = ((1<<26)|(1<<27)|(0xC00000 << 0));
//TCON->T0_IO_CR0 = ((0x00<<28)|(0xC00000 << 0));
TCON->T0_IO_CR0 = ((0x2<<28)|(1<<26)|(0xFFFFFF << 0));
//TCON->T0_IO_CR0 = 0x01ffffff;
// u32 val = (1 << 28);
// if(!dev->timing.h_sync_active)
// val |= (1 << 25);
// if(!dev->timing.v_sync_active)
// val |= (1 << 24);
// if(!dev->timing.den_active)
// val |= (1 << 27);
// if(!dev->timing.clk_active)
// val |= (1 << 26);
// TCON->T0_IO_CR0 = val;
//TCON->T0_IO_CR1 = 0x00080000;
TCON->T0_IO_CR1 = 0;
//TCON->T0_IO_CR1 = ((0xF00000 << 0));
/* 配置TCON_CR寄存器 */
//bit[31]: 1 使能TCON
//bit[0]: 0 选择TCON0
TCON->CR = 0x80000000;
/* 等待FIFO1复位 */
while(TCON->T0_CR & (1<<21));
}
最近编辑记录 haixian20 (2025-03-23 15:18:42)
离线
采集波形是这个样子, 上面紫红的是时钟, 第二个是DE 上拉到vcc. 第三个是Vertical , 第三个是horizontal。 第四个是RGB颜色。
Vertical 的低电平位置为啥是一堆翻转高低高低高低反复。horizontal是一个低电平。如何调。
离线