主题 : Tiny210  LCD驱动 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
楼主  发表于: 2013-06-04 16:15

 Tiny210  LCD驱动

在光盘资料里面的23.lcd_picture基础上修改1024*600的LCD驱动,显示红、绿、蓝单色没有问题,显示图片时会有噪点,修改过DCLK的极性,没有改善,请问是什么问题?编译生成的bin文件为1.8M,尝试过烧写在DRAM和Nandflash里面,都有问题。
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2013-06-04 17:42

 Re:Tiny210 LCD驱动

可以修改GPxxDRV调节一下IO的驱动能力
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
2楼  发表于: 2013-06-04 17:49

 回 1楼(mindee) 的帖子

是修改GPF0~GPF3等data bus的驱动能力吗?
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
3楼  发表于: 2013-06-05 10:28

 Re:Tiny210 LCD驱动

把GPF0~GPF3 的驱动能力设为4倍,还是有问题,没有改善。
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
4楼  发表于: 2013-06-27 11:21

 Re:Tiny210 LCD驱动

#include "font_8x16.h"


#define GPF0CON            (*(volatile unsigned long *)0xE0200120)
#define GPF1CON            (*(volatile unsigned long *)0xE0200140)
#define GPF2CON            (*(volatile unsigned long *)0xE0200160)
#define GPF3CON            (*(volatile unsigned long *)0xE0200180)

#define GPF0DRV            (*(volatile unsigned long *)0xE020012C)
#define GPF1DRV            (*(volatile unsigned long *)0xE020014C)
#define GPF2DRV            (*(volatile unsigned long *)0xE020016C)
#define GPF3DRV            (*(volatile unsigned long *)0xE020018C)

#define GPF0PUD            (*(volatile unsigned long *)0xE0200128)
#define GPF1PUD            (*(volatile unsigned long *)0xE0200148)
#define GPF2PUD            (*(volatile unsigned long *)0xE0200168)
#define GPF3PUD            (*(volatile unsigned long *)0xE0200188)

#define GPD0CON            (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT            (*(volatile unsigned long *)0xE02000A4)

#define CLK_SRC1        (*(volatile unsigned long *)0xe0100204)
#define CLK_DIV1        (*(volatile unsigned long *)0xe0100304)
#define DISPLAY_CONTROL    (*(volatile unsigned long *)0xe0107008)

#define VIDCON0        (*(volatile unsigned long *)0xF8000000)
#define VIDCON1        (*(volatile unsigned long *)0xF8000004)
#define VIDTCON2        (*(volatile unsigned long *)0xF8000018)
#define WINCON0         (*(volatile unsigned long *)0xF8000020)
#define WINCON2         (*(volatile unsigned long *)0xF8000028)
#define SHADOWCON         (*(volatile unsigned long *)0xF8000034)
#define VIDOSD0A         (*(volatile unsigned long *)0xF8000040)
#define VIDOSD0B         (*(volatile unsigned long *)0xF8000044)
#define VIDOSD0C         (*(volatile unsigned long *)0xF8000048)

#define VIDW00ADD0B0     (*(volatile unsigned long *)0xF80000A0)
#define VIDW00ADD1B0     (*(volatile unsigned long *)0xF80000D0)

#define VIDTCON0         (*(volatile unsigned long *)0xF8000010)
#define VIDTCON1         (*(volatile unsigned long *)0xF8000014)

#define HSPW             (0)
#define HBPD            (160 - 1)
#define HFPD             (160 - 1)
#define VSPW            (0)
#define VBPD             (23 - 1)
#define VFPD             (12 - 1)

// FB地址
#define FB_ADDR            (0x23000000)
#define ROW                (600)
#define COL                (1024)
#define HOZVAL            (COL-1)
#define LINEVAL            (ROW-1)

// 初始化LCD
void lcd_init(void)
{
    // 配置引脚用于LCD功能
    


    GPF0DRV = 0x5555;
    GPF1DRV = 0x5555;
    GPF2DRV = 0x5555;
    GPF3DRV = 0x5555;


    GPF0CON = 0x22222222;
    GPF1CON = 0x22222222;
    GPF2CON = 0x22222222;
    GPF3CON = 0x22222222;


    // 打开背光
    GPD0CON &= ~(0xf<<4);
    GPD0CON |= (1<<4);
    GPD0DAT |= (1<<1);

    // 10: RGB=FIMD I80=FIMD ITU=FIMD
    DISPLAY_CONTROL = 2<<0;

    // bit[26~28]:使用RGB接口
    // bit[18]:RGB 并行
    // bit[2]:选择时钟源为HCLK_DSYS=166MHz
    VIDCON0 &= ~( (3<<26)|(1<<18)|(1<<2) );

    // bit[1]:使能lcd控制器
    // bit[0]:当前帧结束后使能lcd控制器
    VIDCON0 |= ( (1<<0)|(1<<1) );

    // bit[6]:选择需要分频
    // bit[6~13]:分频系数为15,即VCLK = 166M/(14+1) = 11M
    VIDCON0 |= 2<<6 | 1<<4;


    // H43-HSD043I9W1.pdf(p13) 时序图:VSYNC和HSYNC都是低脉冲
    // s5pv210芯片手册(p1207) 时序图:VSYNC和HSYNC都是高脉冲有效,所以需要反转
    VIDCON1 |= 0<<4 |1<<5 | 1<<6| 1<<7;

    // 设置时序
    VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
    VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;
    // 设置长宽
    VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);

    // 设置windows1
    // bit[0]:使能
    // bit[2~5]:24bpp
    WINCON0 |= 1<<0;
    WINCON0 &= ~(0xf << 2);
    WINCON0 |= (0xB<<2) | (1<<15);

#define LeftTopX     0
#define LeftTopY     0
#define RightBotX   1023
#define RightBotY   599

    // 设置windows1的上下左右
    VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
    VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
    VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);


    // 设置fb的地址
    VIDW00ADD0B0 = FB_ADDR;
    VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);

    // 使能channel 0传输数据
    SHADOWCON = 0x1;
}





// 描点
void lcd_draw_pixel(int row, int col, int color)
{
    unsigned long * pixel = (unsigned long  *)FB_ADDR;

    *(pixel + row * COL + col) = color;

}

// 清屏
void lcd_clear_screen(int color)
{
    int i, j;

    for (i = 0; i < ROW; i++)
        for (j = 0; j < COL; j++)
            lcd_draw_pixel(i, j, color);

}

// 划横线
void lcd_draw_hline(int row, int col1, int col2, int color)
{
    int j;

    // 描第row行,第j列
    for (j = col1; j <= col2; j++)
        lcd_draw_pixel(row, j, color);

}

// 划竖线
void lcd_draw_vline(int col, int row1, int row2, int color)
{
    int i;
    // 描第i行,第col列
    for (i = row1; i <= row2; i++)
        lcd_draw_pixel(i, col, color);

}

// 划十字
void lcd_draw_cross(int row, int col, int halflen, int color)
{
    lcd_draw_hline(row, col-halflen, col+halflen, color);
    lcd_draw_vline(col, row-halflen, row+halflen, color);
}

// 画字符
void lcd_draw_char(unsigned char c)
{
    // 必须是静态变量
    static int x = 0;    // 第几列
    static int y = 0;    // 第几行

    int i,j;
    unsigned char line_dots;

    // 获得字模
    unsigned char *char_dots = (unsigned char *) (fontdata_8x16 + c * 16);


    // 是否需要回车换行
    if (c == '\n')
    {
        y += 16;
        if (y > ROW)
            y = 0;
        return ;
    }
    else if (c == '\r')
    {
        x = 0;
        return;
    }

    for (i = 0; i < 16; i++)
    {
        line_dots = char_dots;
        for (j = 0; j < 8; j++)
        {
            // 为1,则描蓝点
            if (line_dots & (0x80 >> j))
            {
                lcd_draw_pixel(y+i, x+j, 0xff);
            }
        }
    }

    // 光标移动到下一个8*16的位置
    x += 8;
    if (x > COL)
    {
        x = 0;
        y += 16;
        if (y > ROW)
            y = 0;
    }
}


// 画图
void lcd_draw_bmp(const unsigned char gImage_bmp[])
{
    int i, j;
    unsigned char *p = (unsigned char *)gImage_bmp;
    int blue, green, red;
    int color;

    
    for (i = 0; i < 600; i++)
        for (j = 0; j < 1024; j++)
        {
            
            
            red   = *p++;

            green = *p++;

            blue  = *p++;
        
            color = red << 16 | green << 8 | blue << 0;
            lcd_draw_pixel(i, j, color);
        }

}



void CPT236_Lcd_ClearScr_32( )
{
    int x,y,j;
    unsigned char CH,CM,CL;
    int C=0;
    CH=0;
    CM=0;
    CL=0;
        
    for( y = 0 ; y < 200; y++ )
    {
        
        for( j = 0; j < 3; j++ )
    {
            for( x = 0 ; x < 1024 ; x++ )
        
                      {        
            
            lcd_draw_pixel((3*y+j),x,C);
                                
                      }
        
        }
        CH++;
        CM++;
        CL++;
        C=(CH<<16|CM<<8|CL);


    
        
    }
}
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
5楼  发表于: 2013-06-29 11:06

 Re:Tiny210 LCD驱动

经过几天的测试,发现跟VIDCON0的设置有关,而VIDCON0 是设置VCLK的分频系数的,当分频系数设置为2时,会有噪点,设置为4时,没有噪点,但是会屏闪,因为VCLK=166/(4+1)=33.2MHz,而lcd是1024*600的,VCLK应该是51MHz左右。难道是VCLK较高的时候,时钟源不稳?
级别: 新手上路
UID: 95846
精华: 0
发帖: 29
金钱: 145 两
威望: 29 点
综合积分: 58 分
注册时间: 2013-08-27
最后登录: 2016-02-18
6楼  发表于: 2013-10-18 13:44

 Re:Tiny210 LCD驱动

请问楼主调试完成了吗?应该是VCLK问题,可以在上面加个滤波电路试试!
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
7楼  发表于: 2013-10-25 09:59

 回 6楼(dky525) 的帖子

试过在VCLK上加个50pF的电容,没有多大作用。
请问你调试成功了吗?可以把你的程序发给我参考一下吗?谢谢
级别: 新手上路
UID: 95846
精华: 0
发帖: 29
金钱: 145 两
威望: 29 点
综合积分: 58 分
注册时间: 2013-08-27
最后登录: 2016-02-18
8楼  发表于: 2013-10-28 11:48

 Re:Re:Tiny210 LCD驱动

引用第5楼zhsyghhz于2013-06-29 11:06发表的 Re:Tiny210 LCD驱动 :
经过几天的测试,发现跟VIDCON0的设置有关,而VIDCON0 是设置VCLK的分频系数的,当分频系数设置为2时,会有噪点,设置为4时,没有噪点,但是会屏闪,因为VCLK=166/(4+1)=33.2MHz,而lcd是1024*600的,VCLK应该是51MHz左右。难道是VCLK较高的时候,时钟源不稳?



“当分频系数设置为2时,会有噪点”此时把VCLK反向试试。
级别: 侠客
UID: 22542
精华: 0
发帖: 70
金钱: 355 两
威望: 71 点
综合积分: 140 分
注册时间: 2010-06-02
最后登录: 2017-03-10
9楼  发表于: 2013-10-28 17:31

 回 8楼(dky525) 的帖子

最初遇到这个问题的时候,就试过把VCLK的极性反向,没有改善。