liujun6037 发表于 2009-11-15 12:32:07

也开始驱动LCD了(STM32+CPLD+SDRAM+800*600 LCD/VGA)

最近需要驱动一个800*600的LCD,看到论坛上有很多网友多成功驱动了480*272的那款.我要驱动的是800*600的群创LCD,不过这种数字屏驱动原理基本都差不多,在网上找到了老易的驱动代码过来修改下,在我的800*600上调试成功. 后面要做的是驱动SDRAM,用SDRAM做显存,用CPLD来驱动这个LCD,CPLD基本不懂,还得一步步来,网上求助,好像大家都不想帮助别人,诶.幸好找到一个懂FPGA/CPLD的老乡,也算是一种缘分吧,寄了块板子给他,我们一起研究.到时候做出来再和各位分享经验了.
先上用STM32直接驱动LCD,只能显示彩条:
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503363.jpg
(原文件名:IMG_6068.jpg)

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503364.jpg
(原文件名:IMG_6069.jpg)

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503365.jpg
(原文件名:IMG_6070.jpg)

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503366.jpg
(原文件名:IMG_6072.jpg)

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503367.jpg
(原文件名:IMG_6074.jpg)

点击此处打开 ourdev_503368.jpg(文件大小:436K,只有400K以内的图片才能直接显示) (原文件名:IMG_6075.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503369.jpg
(原文件名:IMG_6076.jpg)

点击此处打开 ourdev_503370.jpg(文件大小:409K,只有400K以内的图片才能直接显示) (原文件名:IMG_6078.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503371.jpg
(原文件名:IMG_6084.jpg)

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503372.jpg
(原文件名:IMG_6077.jpg)
在发上我现在的资料.PCB原理图和两个测试代码,供有需要的网友参考.VGA部分我老乡在测试,看看有没有问题.
LCD stm32驱动代码ourdev_503394.rar(文件大小:218K) (原文件名:LCD驱动代码(滚动彩条).rar)
CPLD测试ourdev_503395.rar(文件大小:115字节) (原文件名:CPLD测试代码.rar)
LCD驱动原理图ourdev_503396.rar(文件大小:1.02M) (原文件名:LCD驱动原理图PCB.rar)

RENMA 发表于 2009-11-15 13:09:15

顶楼主啊,好东西啊,支持啊

lanshuitianxia 发表于 2009-11-15 13:13:40

请问下楼主 这种液晶是不是不带驱动芯片的 内部没有保存液晶点阵数据用的RAM
如果用CPLD+SARM(或SDRAM)驱动是不是CPLD负责外部数据的输入(比如和单片机的数据口接在一起),单片机发送数据到CPLD,CPLD再写入数据到SRAM相应的缓冲区,当输入口空闲时,CPLD平时就负责从SRAM中的缓冲区读数据以很快的速度刷新液晶屏吗?
呵呵,没搞过,好奇的问一下:)

bill 发表于 2009-11-15 13:24:22

CPLD测试代码.rar 无内容

liujun6037 发表于 2009-11-15 13:37:03

点击此处下载 ourdev_503407.rar(文件大小:160K) (原文件名:闪烁灯.rar)
cpld测试代码.
【2楼】 lanshuitianxia 黑蚂蚁:单片机通过CPLD存数据到SDRAM,再从SDRAM读取数据刷新到LCD.就是这么个过程

simon51 发表于 2009-11-15 14:38:19

顶,lz开始玩大屏了,不得不提一下,以前你那个stm32做的mp3实在是太牛了!

lanshuitianxia 发表于 2009-11-15 14:52:39

呵呵 谢谢楼主 明白了

jetbo 发表于 2009-11-15 15:06:20

顶,同感,LZ做的MP3很强大~~~~

zhangyunfu 发表于 2009-11-15 15:38:42

搞成类似于单色LCM接口,应该有市场的,7' 480x234就行

fjhcpu 发表于 2009-11-15 15:48:20

又有大作了。。。顶

gdrc 发表于 2009-11-15 16:59:35

哈哈,牛人,从AVR到STM32到CPLD,楼主通吃了,是个人才.

gdrc 发表于 2009-11-15 17:08:43

STM32驱动LCD,那是用STM32软件模拟的LCD驱动时序吗?请教一下楼主.

Oliver 发表于 2009-11-15 17:43:13

LZ找的我的代码是AVR用IO刷RGB吧?估计速度不会比你用STM32的GPIO慢.

看来LZ要大干一翻了哦.

对了,你这AT080多少米

liujun6037 发表于 2009-11-15 17:49:52

【12楼】 Oliver 老易:8寸的,单个250左右,批量可以到200.速度肯定STM32的GPIO快了.可以到50M.
【11楼】 gdrc 古道热肠:这个是用软件模拟的,FSMC总线连接到CPLD了.

gaolf_2000 发表于 2009-11-15 18:16:08

请问芯片mp1542价格?

Oliver 发表于 2009-11-15 18:22:44

【13楼】 liujun6037,
50MHZ是输出的最高速度(电路速度).
CORTEX-M3的GPIO实际上能扭个几M就不得了了.ARM7核更糟糕

liujun6037 发表于 2009-11-15 19:15:54

具体没试验过.有机会试试看.

vipcff 发表于 2009-11-15 19:32:50

mark

cinderellah 发表于 2009-11-15 19:39:38

mark~

windowsce 发表于 2009-11-15 20:19:37

LZ还有没有空板呀?

caosix 发表于 2009-11-15 21:17:19

不理解,大家花费那么大的代价,,做个电脑上很成熟的 VGA 显示,,有哪些意义呢???想学习:有哪些意义呢??

直接弄个 PC104 带VGA的,再买个 12、、14寸的标准液晶显示器,,也便宜得很啊。。??

joyko 发表于 2009-11-15 21:32:13

这个板子画的漂亮

liujun6037 发表于 2009-11-15 21:38:14

【20楼】 caosix:工业控制器了解过没?了解下这方面,你就觉得这个还是有意义的.

caep1986 发表于 2009-11-15 21:51:52

没玩过,不错哦

shangdawei 发表于 2009-11-16 12:25:08

mark~

flyingcys 发表于 2009-11-16 17:58:28

楼主,这个东西很不错哦!能否加好友,详细聊聊啊!我的qq:550993108

clever0725 发表于 2009-11-16 19:26:19

好 CPLD 液晶

windowsce 发表于 2009-11-16 22:29:34

MAX II没有存储器块,很让人郁闷。。。
除此之外没有PLL,SDRAM的CLK不好弄。。

gaolf_2000 发表于 2009-11-17 10:31:03

这块屏我也在用,频率不应低于38M,否则人可以感觉到屏闪

fjhcpu 发表于 2009-11-22 12:25:09

期待楼主的大作呀

eiglxl 发表于 2009-11-22 12:32:33

to caosix:

你知道哪有便宜的PC104工控板吗?

yangyb 发表于 2009-11-25 16:30:48

顶一下

avrpicarm 发表于 2009-11-25 17:03:45

八错

rafd 发表于 2009-11-26 11:46:59

你好屏是什么型号

rafd 发表于 2009-11-26 11:53:49

还有多余的焊好的版吗,我想要一块

wangkj 发表于 2009-11-26 13:49:48

我搞了一年才搞定的,没那么简单。相当的困难。
具体可以参考这里。
http://bbs.eeworld.com.cn/forumdisplay.php?fid=98

点击此处下载 ourdev_507695.rar(文件大小:1.21M) (原文件名:mini2440_20091020_open.rar)

liujun6037 发表于 2009-11-26 14:06:31

【36楼】 wangkj 老王:看过老王的大作,小弟愚笨只得多花点时间了.呵呵...

fjhcpu 发表于 2009-11-26 18:42:12

呵呵。。。相信楼主会比老王快些

1181zjf 发表于 2009-11-26 21:32:03

http://bbs.eeworld.com.cn/thread-74199-1-1.html
值得学习的开源项目组织。

windowsce 发表于 2009-11-26 23:07:02

我今天去买了一个群创的7寸屏,800*480的。正在研究控制器~
现在实现的时序图,但转接板还没到,尚不知道是否能用

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_507946.jpg

astudent 发表于 2009-11-26 23:34:00

39楼,一个很好的推荐。

loongsuns 发表于 2009-11-27 00:32:16

mark

durgy 发表于 2009-11-27 00:57:45

我也 发一个
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_507957.JPG
驱动7寸LCD (原文件名:200911271641.JPG)

fjhcpu 发表于 2009-11-27 13:10:10

windowsce你买的那屏多少钱呢

windowsce 发表于 2009-11-29 17:38:39

花了245大圆。。。AT070TN83 V.1
心疼死了……不过高兴的是,今天转接板到了,通过一个下午的努力,已经可以显示图像了。
DE模式正常了,HV模式虽然能显示,但图像位置不对,我觉得可能是时序有错。

liujun6037 发表于 2009-11-29 17:48:20

【45楼】 windowsce :就可以显示图像了啊?神速,呵呵.

windowsce 发表于 2009-11-29 20:15:30

你用MAX II驱动比我用cyclone3驱动要难的~
cyclone可以用dcfifo解决跨时钟域的问题,可MAX II没有存储器块~
我想了半天也没有好方法高效的解决数据跨时钟域传输的问题。。。
这个屏的DE模式,只要时序差不多就行。
总共花了,,,可能4、5个小时,买完屏晚上回家写了3小时,基本功能实现了;调试焊接折腾了1个多小时,剩下1小时就是调时序。。。

换个图,刚才那个图太恶心了
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_508879.jpg

windowsce 发表于 2009-11-29 20:31:32

贴点代码吧。只是部分代码,初学者,全贴太丢人了。。。

大概的原理就是,用时钟驱动计数器,根据计数器的值发送数据到屏上
为了简单,内存占用比较浪费。4字节数据只用其中3个字节。

//产生VSYNC和HSYNC计数
reg HSYNC_cnt, VSYNC_cnt;
always @ (posedge LCD_DCLK)
begin
        if (reset || !CONFIG_Display_en)
        begin
                HSYNC_cnt <= 12'd0;
                VSYNC_cnt <= 12'd0;
        end
        else if (HSYNC_cnt < LCDCFG_tHP)
        begin
                HSYNC_cnt <= HSYNC_cnt + 12'd1;
                VSYNC_cnt <= VSYNC_cnt;
        end
        else if (VSYNC_cnt < LCDCFG_tVP)
        begin
                HSYNC_cnt <= 12'd0;
                VSYNC_cnt <= VSYNC_cnt + 12'd1;
        end
        else
        begin
                HSYNC_cnt <= 12'd0;
                VSYNC_cnt <= 12'd0;
        end
end

DE根据计数器的值判断是否需要传输数据到屏上

wire HoriValid;//有效像素
wire VertValid;//有效行
        assign VertValid = (VSYNC_cnt >= LCDCFG_tVW + LCDCFG_tVBP) && (VSYNC_cnt < LCDCFG_tVW + LCDCFG_tVBP + LCDCFG_tW);
        assign HoriValid = VertValid && (HSYNC_cnt >= LCDCFG_tHW + LCDCFG_tHBP) && (HSYNC_cnt < LCDCFG_tHW + LCDCFG_tHBP + LCDCFG_tHV);
always @ (posedge LCD_DCLK)
begin
        if (reset || !CONFIG_Display_en)
        begin
                LCD_DE_m <= 0;
                LCD_RED_m <= 8'b0;
                LCD_GREEN_m <= 8'b0;
                LCD_BLUE_m <= 8'b0;
        end
        else if (HoriValid)//传输像素数据到LCD
        begin
                LCD_DE_m <= 1;
                LCD_RED_m <= LCDFIFO_rddata;
                LCD_GREEN_m <= LCDFIFO_rddata;
                LCD_BLUE_m <= LCDFIFO_rddata;
        end
        else
        begin
                LCD_DE_m <= 0;
                LCD_RED_m <= 8'b0;
                LCD_GREEN_m <= 8'b0;
                LCD_BLUE_m <= 8'b0;
        end
end
我用一个FIFO存储需要发到屏上的像素。随时补充新数据进去。

reg CurrentReadLine, data_reqline;
//本地总线读取控制 当FIFO数据不足时请求传输下一行的数据
always @ (posedge clk)
begin
        if (reset || !CONFIG_Display_en)
        begin
                data_req <= 0;
                LCDFIFO_clrreq <= 1;
                CurrentReadLine <= 12'd0;
                data_reqline<= 12'd0;
        end
        else if (VSYNC_cnt == 12'd0)//当扫描回到0行的时候清空FIFO。
        begin
                data_req <= 0;
                LCDFIFO_clrreq <= 1;
                CurrentReadLine <= 12'd0;
                data_reqline<= 12'd0;
        end
        else if (data_req && !data_idle)
        begin
                data_req <= 0;
        end
        else if (!data_req && data_idle && (LCDFIFO_wrusedw < LCDCFG_tHV) && (CurrentReadLine < LCDCFG_tW))//判断接口空闲 FIFO数据不足
        begin
                data_req <= 1;
                LCDFIFO_clrreq <= 0;
                CurrentReadLine <= CurrentReadLine + 12'd1;
                data_reqline<= CurrentReadLine;
        end
        else
        begin
        end
end

//FIFO 2048字*32bit,CYCLONE III需要占用8个M9K存储器块。
wire LCDFIFO_rddata;
wire LCDFIFO_wrusedw;
reg LCDFIFO_clrreq;
LCD_FIFO (
        .aclr(reset || LCDFIFO_clrreq),
        .data(data_wrdata),
        .rdclk(LCD_DCLK),
        .rdreq(HoriValid),
        .wrclk(clk),
        .wrreq(data_wren),
        .q(LCDFIFO_rddata),
        .rdempty(),
        .rdusedw(),
        .wrempty(),
        .wrfull(),
        .wrusedw(LCDFIFO_wrusedw));

我用的LCD时序
//LCD时序配置
parameter
        LCDCFG_tHV = 800,                        //Horizontal valid data width
        LCDCFG_tW = 480,                        //Vertical valid data width
        LCDCFG_tHP = 928,                        //HSYNC Period
        LCDCFG_tHW = 48,                        //HSYNC Pulse Width
        LCDCFG_tHBP = 40,                        //HSYNC Back Porch
        LCDCFG_tVP = 525,                        //VSYNC Period
        LCDCFG_tVW = 3,                        //VSYNC Pulse Width
        LCDCFG_tVBP = 29;                        //VSYNC Back Porch

这是根据计数器产生VSYNC和HSYNC信号,但似乎时序上有问题。虽可显示图像,但图像位置不正确。尚不知道怎么计算正确的时序。。。

//产生VSYNC和HSYNC计数 根据计数产生相应的时序
reg HSYNC_cnt, VSYNC_cnt;
always @ (posedge LCD_DCLK)
begin
        if (reset || !CONFIG_Display_en)
        begin
                HSYNC_cnt <= 12'd0;
                VSYNC_cnt <= 12'd0;
        end
        else if (HSYNC_cnt < LCDCFG_tHP)
        begin
                HSYNC_cnt <= HSYNC_cnt + 12'd1;
                VSYNC_cnt <= VSYNC_cnt;
        end
        else if (VSYNC_cnt < LCDCFG_tVP)
        begin
                HSYNC_cnt <= 12'd0;
                VSYNC_cnt <= VSYNC_cnt + 12'd1;
        end
        else
        begin
                HSYNC_cnt <= 12'd0;
                VSYNC_cnt <= 12'd0;
        end
end

luozhongchao 发表于 2009-12-2 14:36:26

楼主做的太漂亮了! 你的这个屏在那里买的呢?? 我也想买一个!!

linfeng286 发表于 2009-12-2 14:40:52

MARK

Garbage614 发表于 2009-12-3 22:33:24

那块黑白点阵上的英文是亮点!!!!貌似还是过去式

lixun00 发表于 2009-12-5 23:52:57

学习

zchong 发表于 2009-12-6 21:34:42

【48楼】 windowsce代码全贴出来算了,^-^

windowsce 发表于 2009-12-10 14:28:09

上午在WC里突发奇想……于是便有了这个:把UCGUI叠加到DVI的视频上。。。没得可放,只有个2012。。。

http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512785.jpg

TO53:上面贴出的就是我用来驱动LCD的代码。。。

EngKing 发表于 2009-12-10 15:17:19

mark

ahfong2006 发表于 2009-12-10 15:36:47

mark

Forever 发表于 2009-12-11 11:32:22

漂亮啊

powerg7 发表于 2009-12-11 12:08:20

mark

idodi 发表于 2009-12-11 13:10:58

不得不赞一下了

quzegang 发表于 2009-12-16 17:09:15

MARK

dengxiaofeng 发表于 2009-12-16 18:02:08

支持楼主!!!

luozhongchao 发表于 2009-12-16 19:31:58

windowsce可以说说你的屏在那里买的嘛??是在淘宝上嘛??我正想买个这么大的屏!!

windowsce 发表于 2009-12-16 20:50:06

俺那个在中关村老中发3层买的~

luozhongchao 发表于 2009-12-18 16:47:58

谢谢windowsce回复! 我不在北京啊!! 还是在淘宝上看看吧!!

algebra 发表于 2009-12-21 16:28:02

好东西

avic 发表于 2009-12-27 22:02:32

很厉害,记过

hwdpaley 发表于 2009-12-31 09:58:22

厉害啊,mark

kent_gwk 发表于 2009-12-31 10:27:17

如果让我现在选方案,我不会考虑用CPLD,现在的S3C2416非常便宜,如果仅仅是驱动LCD,用4层板都可以了,没评估过2层板是否可以,2层板的话,做不到等长布线,估计SDRAM达不到133M,不过用CPLD估计也是不能达到133M的。

用S3C2416,无论从成本和难度来讲,都比CPLD要有优势。

again 发表于 2009-12-31 11:14:37

有时候不单单是成本问题,BGA这种封装焊接一般公司都没法做的

kent_gwk 发表于 2009-12-31 11:56:29

BGA对个人DIY讲,是有点麻烦,如果对公司来讲,我不觉得有什么问题,一千多块钱一台的小型回流焊,对小公司也不吃力吧

gaiwang42 发表于 2009-12-31 21:51:22

S3C2416 pitch 0.65mm 就是公司做板 也不是件容易的事情 一般bga都是0.8的

gaiwang42 发表于 2009-12-31 21:53:17

楼主有没有试过接vga?
能支持1024x768吗?

qzzz 发表于 2010-1-1 06:03:06

学习了

health 发表于 2010-1-1 14:02:06

很强

liu_xf 发表于 2010-1-13 12:54:45

楼主的板子画得很漂亮,

卖不卖啊,大家好一起玩。

wang110 发表于 2010-1-15 21:36:52

回复【36楼】wangkj 老王
-----------------------------------------------------------------------

关键的Actel_FPGA代码部分没有

on-raptor 发表于 2010-1-21 22:46:00

我也mark

1181zjf 发表于 2010-1-22 13:27:17

进展如何了?

chenloveyj 发表于 2010-1-22 17:13:54

记号。。。。

niba 发表于 2010-1-22 18:40:52

这要是搞出来了。。就是一重磅炸_弹。好多相关小公司要喝西北风了

hanbin08041813 发表于 2010-1-28 11:19:45

以前我也驱动过 VGA后来用nios驱动 9325那块2.8 的液晶,现在正在玩4.3inch的那块 打算cpld+stm32,   不错   等哥做好了 我们比比

hanbin08041813 发表于 2010-1-29 20:39:27

我也驱动了    再写写就可以赶上你啦 哈哈

niba 发表于 2010-1-29 20:53:23

这么多人搞这呀。。争取2010年内我也搞一个

moen 发表于 2010-1-29 21:00:33

2012之后再搞吧

wu283326736 发表于 2010-1-31 11:08:34

回复【楼主位】liujun6037
-----------------------------------------------------------------------

楼主想请教下SDRAM初始化的问题吗?
我有几个疑问1.SDRAM初始化刷新后需要有个等待周期,这个等待周期的时间tRFC怎么知道?我在DATASHEET没有找到。
             2.SDRAM初始化的时候刷新需要几次啊?我看网上很多都是2次或者8次,这个怎么确定的啊。谢谢回复。
可以邮箱联系吗?我的邮箱是wu283326736@163.com.
我现在做的和你们一样只是分辨率大点。希望能帮忙啊

haha2440 发表于 2010-2-3 10:44:36

你好,能不能把老易的代码给我传一份呢,谢了,我的邮箱:315841689@qq.com

XU112 发表于 2010-2-4 23:11:04

回复【86楼】haha2440
-----------------------------------------------------------------------

你好,能不能把老易的代码给我传一份呢,谢了,我的邮箱:XU1763@126.COM

xflqsw 发表于 2010-2-7 19:31:18

不顶都不好意思了,你太好了,哥们,我代表党和国家感谢你!

xflqsw 发表于 2010-2-7 19:32:54

简直就是人才中的霸主,我空想的,你都付诸现实了,牛!

windowsce 发表于 2010-2-11 01:20:12

添加个视频,手机拍摄的,比较恶心。。。
UCGUI叠加到DVI视频上。
DVI的分辨率是800*480@60Hz,UCGUI跑个DEMO。自认为效果很不错。
./emotion/em023.gif

点击此处下载 ourdev_533494.rar(文件大小:2.50M) (原文件名:20091210009.rar)

gaiwang42 发表于 2010-2-11 09:55:47

800*480这个分辨率也太低了点,对dvi来讲,整个大的看看

Cortex-M8 发表于 2010-2-25 17:27:26

不得不赞一下.

hscheng 发表于 2010-3-7 10:41:41

楼主,请问,你的那个SRAM怎么和单片机连也和CPLD连啊;刷屏的速度怎么控制啊;SRAM读数据至少要2个时钟吧,1024*768的分辨率,你能达到60HZ的刷屏吗?

uplinux 发表于 2010-3-21 01:07:42

mark

EngKing 发表于 2010-3-21 09:19:58

mark

cht-rtos 发表于 2010-4-27 13:39:15

正想做个类似的板子,不知道楼主的板子出售吗?

xiaolou7 发表于 2010-4-27 20:57:47

人过留名。

arm0756 发表于 2010-4-27 23:58:47

很好!多谢!!

smartzou 发表于 2010-4-28 00:39:12

mark

v_8787 发表于 2010-4-29 09:12:07

学习了
页: [1] 2 3
查看完整版本: 也开始驱动LCD了(STM32+CPLD+SDRAM+800*600 LCD/VGA)