也开始驱动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) 顶楼主啊,好东西啊,支持啊 请问下楼主 这种液晶是不是不带驱动芯片的 内部没有保存液晶点阵数据用的RAM
如果用CPLD+SARM(或SDRAM)驱动是不是CPLD负责外部数据的输入(比如和单片机的数据口接在一起),单片机发送数据到CPLD,CPLD再写入数据到SRAM相应的缓冲区,当输入口空闲时,CPLD平时就负责从SRAM中的缓冲区读数据以很快的速度刷新液晶屏吗?
呵呵,没搞过,好奇的问一下:) CPLD测试代码.rar 无内容 点击此处下载 ourdev_503407.rar(文件大小:160K) (原文件名:闪烁灯.rar)
cpld测试代码.
【2楼】 lanshuitianxia 黑蚂蚁:单片机通过CPLD存数据到SDRAM,再从SDRAM读取数据刷新到LCD.就是这么个过程 顶,lz开始玩大屏了,不得不提一下,以前你那个stm32做的mp3实在是太牛了! 呵呵 谢谢楼主 明白了 顶,同感,LZ做的MP3很强大~~~~ 搞成类似于单色LCM接口,应该有市场的,7' 480x234就行 又有大作了。。。顶 哈哈,牛人,从AVR到STM32到CPLD,楼主通吃了,是个人才. STM32驱动LCD,那是用STM32软件模拟的LCD驱动时序吗?请教一下楼主. LZ找的我的代码是AVR用IO刷RGB吧?估计速度不会比你用STM32的GPIO慢.
看来LZ要大干一翻了哦.
对了,你这AT080多少米 【12楼】 Oliver 老易:8寸的,单个250左右,批量可以到200.速度肯定STM32的GPIO快了.可以到50M.
【11楼】 gdrc 古道热肠:这个是用软件模拟的,FSMC总线连接到CPLD了. 请问芯片mp1542价格? 【13楼】 liujun6037,
50MHZ是输出的最高速度(电路速度).
CORTEX-M3的GPIO实际上能扭个几M就不得了了.ARM7核更糟糕 具体没试验过.有机会试试看. mark mark~ LZ还有没有空板呀? 不理解,大家花费那么大的代价,,做个电脑上很成熟的 VGA 显示,,有哪些意义呢???想学习:有哪些意义呢??
直接弄个 PC104 带VGA的,再买个 12、、14寸的标准液晶显示器,,也便宜得很啊。。?? 这个板子画的漂亮 【20楼】 caosix:工业控制器了解过没?了解下这方面,你就觉得这个还是有意义的. 没玩过,不错哦 mark~ 楼主,这个东西很不错哦!能否加好友,详细聊聊啊!我的qq:550993108 好 CPLD 液晶 MAX II没有存储器块,很让人郁闷。。。
除此之外没有PLL,SDRAM的CLK不好弄。。 这块屏我也在用,频率不应低于38M,否则人可以感觉到屏闪 期待楼主的大作呀 to caosix:
你知道哪有便宜的PC104工控板吗? 顶一下 八错 你好屏是什么型号 还有多余的焊好的版吗,我想要一块 我搞了一年才搞定的,没那么简单。相当的困难。
具体可以参考这里。
http://bbs.eeworld.com.cn/forumdisplay.php?fid=98
点击此处下载 ourdev_507695.rar(文件大小:1.21M) (原文件名:mini2440_20091020_open.rar) 【36楼】 wangkj 老王:看过老王的大作,小弟愚笨只得多花点时间了.呵呵... 呵呵。。。相信楼主会比老王快些 http://bbs.eeworld.com.cn/thread-74199-1-1.html
值得学习的开源项目组织。 我今天去买了一个群创的7寸屏,800*480的。正在研究控制器~
现在实现的时序图,但转接板还没到,尚不知道是否能用
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_507946.jpg 39楼,一个很好的推荐。 mark 我也 发一个
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_507957.JPG
驱动7寸LCD (原文件名:200911271641.JPG) windowsce你买的那屏多少钱呢 花了245大圆。。。AT070TN83 V.1
心疼死了……不过高兴的是,今天转接板到了,通过一个下午的努力,已经可以显示图像了。
DE模式正常了,HV模式虽然能显示,但图像位置不对,我觉得可能是时序有错。 【45楼】 windowsce :就可以显示图像了啊?神速,呵呵. 你用MAX II驱动比我用cyclone3驱动要难的~
cyclone可以用dcfifo解决跨时钟域的问题,可MAX II没有存储器块~
我想了半天也没有好方法高效的解决数据跨时钟域传输的问题。。。
这个屏的DE模式,只要时序差不多就行。
总共花了,,,可能4、5个小时,买完屏晚上回家写了3小时,基本功能实现了;调试焊接折腾了1个多小时,剩下1小时就是调时序。。。
换个图,刚才那个图太恶心了
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_508879.jpg 贴点代码吧。只是部分代码,初学者,全贴太丢人了。。。
大概的原理就是,用时钟驱动计数器,根据计数器的值发送数据到屏上
为了简单,内存占用比较浪费。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 楼主做的太漂亮了! 你的这个屏在那里买的呢?? 我也想买一个!! MARK 那块黑白点阵上的英文是亮点!!!!貌似还是过去式 学习 【48楼】 windowsce代码全贴出来算了,^-^ 上午在WC里突发奇想……于是便有了这个:把UCGUI叠加到DVI的视频上。。。没得可放,只有个2012。。。
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512785.jpg
TO53:上面贴出的就是我用来驱动LCD的代码。。。 mark mark 漂亮啊 mark 不得不赞一下了 MARK 支持楼主!!! windowsce可以说说你的屏在那里买的嘛??是在淘宝上嘛??我正想买个这么大的屏!! 俺那个在中关村老中发3层买的~ 谢谢windowsce回复! 我不在北京啊!! 还是在淘宝上看看吧!! 好东西 很厉害,记过 厉害啊,mark 如果让我现在选方案,我不会考虑用CPLD,现在的S3C2416非常便宜,如果仅仅是驱动LCD,用4层板都可以了,没评估过2层板是否可以,2层板的话,做不到等长布线,估计SDRAM达不到133M,不过用CPLD估计也是不能达到133M的。
用S3C2416,无论从成本和难度来讲,都比CPLD要有优势。 有时候不单单是成本问题,BGA这种封装焊接一般公司都没法做的 BGA对个人DIY讲,是有点麻烦,如果对公司来讲,我不觉得有什么问题,一千多块钱一台的小型回流焊,对小公司也不吃力吧 S3C2416 pitch 0.65mm 就是公司做板 也不是件容易的事情 一般bga都是0.8的 楼主有没有试过接vga?
能支持1024x768吗? 学习了 很强 楼主的板子画得很漂亮,
卖不卖啊,大家好一起玩。 回复【36楼】wangkj 老王
-----------------------------------------------------------------------
关键的Actel_FPGA代码部分没有 我也mark 进展如何了? 记号。。。。 这要是搞出来了。。就是一重磅炸_弹。好多相关小公司要喝西北风了 以前我也驱动过 VGA后来用nios驱动 9325那块2.8 的液晶,现在正在玩4.3inch的那块 打算cpld+stm32, 不错 等哥做好了 我们比比 我也驱动了 再写写就可以赶上你啦 哈哈 这么多人搞这呀。。争取2010年内我也搞一个 2012之后再搞吧 回复【楼主位】liujun6037
-----------------------------------------------------------------------
楼主想请教下SDRAM初始化的问题吗?
我有几个疑问1.SDRAM初始化刷新后需要有个等待周期,这个等待周期的时间tRFC怎么知道?我在DATASHEET没有找到。
2.SDRAM初始化的时候刷新需要几次啊?我看网上很多都是2次或者8次,这个怎么确定的啊。谢谢回复。
可以邮箱联系吗?我的邮箱是wu283326736@163.com.
我现在做的和你们一样只是分辨率大点。希望能帮忙啊 你好,能不能把老易的代码给我传一份呢,谢了,我的邮箱:315841689@qq.com 回复【86楼】haha2440
-----------------------------------------------------------------------
你好,能不能把老易的代码给我传一份呢,谢了,我的邮箱:XU1763@126.COM 不顶都不好意思了,你太好了,哥们,我代表党和国家感谢你! 简直就是人才中的霸主,我空想的,你都付诸现实了,牛! 添加个视频,手机拍摄的,比较恶心。。。
UCGUI叠加到DVI视频上。
DVI的分辨率是800*480@60Hz,UCGUI跑个DEMO。自认为效果很不错。
./emotion/em023.gif
点击此处下载 ourdev_533494.rar(文件大小:2.50M) (原文件名:20091210009.rar) 800*480这个分辨率也太低了点,对dvi来讲,整个大的看看 不得不赞一下. 楼主,请问,你的那个SRAM怎么和单片机连也和CPLD连啊;刷屏的速度怎么控制啊;SRAM读数据至少要2个时钟吧,1024*768的分辨率,你能达到60HZ的刷屏吗? mark mark 正想做个类似的板子,不知道楼主的板子出售吗? 人过留名。 很好!多谢!! mark 学习了