您尚未登录。

楼主 # 2025-03-23 14:57:10

haixian20
会员
注册时间: 2025-02-13
已发帖子: 4
积分: 5

st7701s 412 960屏幕裸奔显示不全

st7701s 412 960屏幕裸奔显示不全,有一部分开机显示一点然后就不在显示了。 用的是tcon+buffer. 怎么改参数都不行。求助。
如何调啊。或者调整方向。412*960分辨率。




c7861fc98d2ca4f0c907770491c877a.jpgd9d2c0921a5d42c498a1b779723a396.jpg

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)

离线

楼主 #1 2025-03-24 22:34:58

haixian20
会员
注册时间: 2025-02-13
已发帖子: 4
积分: 5

Re: st7701s 412 960屏幕裸奔显示不全

采集波形是这个样子, 上面紫红的是时钟, 第二个是DE 上拉到vcc.  第三个是Vertical , 第三个是horizontal。 第四个是RGB颜色。

Vertical 的低电平位置为啥是一堆翻转高低高低高低反复。horizontal是一个低电平。如何调。

20250324223024.png

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn