0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ZYNQ LCD显示OV5640图像测试方法

电子设计 来源:米联客 作者:米联客 2020-12-01 11:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在实际开发中,我们会经常使用到LCD屏,LCD屏的种类有很多种,对应的使用方法也有所不同,但是,在ZYNQ 图像传输开发中,思路大体类似,下面介绍在ZYNQ中,使用LCD显示OV5640图像方法。

1.1 概述
总体来说,搭建LCD显示的工程架构同之前搭建OV5640 HDMI显示的工程类似,采集输入端、VDMA处理、显示输出端,这里变化的是显示输出端。

测试使用模块:OV5640摄像头,LCD (RGB或HDMI接口) 屏,米联客ZYNQ开发板。这里需要说明LCD屏的分辨率是1024x600,OV5640使用的分辨率是640X480。

测试工程:测试工程是在摄像头采集的测试工程的基础上进行修改,下面仅说明区别,其他相同的部分,这里不在赘述。
为了做对比,我分别做了RGB /HDMI 接口LCD屏的640x480、640x480_1024x600测试历程。这里使用缩放IP,将640x480分辨率图像放大到1024x600。

LCD 测试工程
LCD(RGB接口) 640x480
640x480_1024x600 (使用缩放ip)
LCD(HDMI接口) 640x480
640x480_1024x600 (使用缩放ip)

1.2 验证测试效果

1.2.1 RGB接口LCD屏测试

(1)640X480分辨率输入,直接输出测试

可以看到图像显示仅占据一部分界面,这是因为输出分辨率大于输入分辨率。输入图像仅占据输出图像的一部分。

1)640x480分辨率输出

(2)640x480分辨率图像输入,采集图像经过HLS IP处理放大到1024x600输出。

2)1024x600分辨率输出

1.2.2 HDMI接口的LCD屏测试

(1)640X480分辨率输入,直接输出测试
可以看到图像显示仅占据一部分界面,这是因为输出分辨率大于输入分辨率。输入图像仅占据输出图像的一部分。

(2)640x480分辨率图像输入,采集图像经过HLS IP处理放大到1024x600输出。

2)1024x600分辨率输出

1.3 硬件工程

1.3.1 硬件平台搭建

1、VTC设置

由于LCD屏是1024x600,对于VTC中没有现成的参数配置,因此,这里我们使用AXI4总线对VTC分辨率进行配置。

生成后的IP

选择自动连线,将VTC连接到总线上。然后,如图所示连接,并将s_axi_aclken给定值1。


2、ZYNQ 时钟设置

ZYNQ IP 提供的FCLK_CLK0用于AXI 数据传输的时钟,这个时钟给定值要根据数据传输情况给定,不能设置太高也不能设置太低,否则会造成数据的堵塞,不会输出。通常我这里调试,640X480输出会给100M,1080P输出会给155M(实际输出是150M)。具体参考程序。

3、缩放IP设置

OV5640的有几种分辨率(640x480、720P),而LCD屏的分辨率是1024x600;如果直接使用5640的分辨率显示,使用640X480输出,则不会铺满整个LCD屏;或者使用720P输出,则720P分辨率大于1024x600,则LCD不能显示5640采集的全部图像;因此,使用了hls封装的缩放IP,可以将输出的分辨率调整为LCD屏分辨率1024x600。
使用的硬件工程,在OV5640 VDMA图像传输的基础上进行修改。将HLS生成的IP添加工程中,将Video In to AXI4-Stream的输出接口与HLS IP的输入接口连接,HLS IP的输出接口与VDMA的AXIS接口连接。

4、LCD接口设置

HDMI接口:对于HDMI接口的LCD屏,Video Out IP后面接HDMI_FPGA_ML IP,将RGB信号转换为HDMI信号输出。

RGB接口:对于RGB接口的LCD屏,Video Out IP信号直接输出,这个IP输出的是RGB信号,同事需要注意,对驱动LCD屏的其他信号,如时钟、使能信号进行配置。

1.3.2 SDK工程

640x480显示工程对应的main.c主函数
#include "I2C_16bit.h"

#include "xiicps.h"

#include "xil_io.h"

#include "xparameters.h"

#include "vtc_config.h"

#define VDMA_BASEADDR XPAR_AXI_VDMA_0_BASEADDR

#define VIDEO_BASEADDR0 0x01000000

#define VIDEO_BASEADDR1 0x02000000

#define VIDEO_BASEADDR2 0x03000000

#define H_ACTIVE 1024

#define V_ACTIVE 600

#define H_STRIDE 1024

XIicPs Iic;

u32 i=0;

#define SUM 2457600 //背景写黑 1280*720*4

void main()

{

//设置内存中的背景

for(i=0;i

Xil_Out16((VIDEO_BASEADDR0 + i), 0x00);

Xil_Out16((VIDEO_BASEADDR1 + i), 0x00);

Xil_Out16((VIDEO_BASEADDR2 + i), 0x00);

}

// Initialize OV5640 regesiter

I2C_config_init();

// Config VTC

Vtc_init(&Vtc, VTC_DEV_ID, &Vtc_timing, VIDEO_RESOLUTION_WSVGA);

//Xil_Out32((VDMA_BASEADDR + 0x030), 0x108B);// enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x030), 0x108B);// enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x0AC), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x0B0), VIDEO_BASEADDR1); // start address

Xil_Out32((VDMA_BASEADDR + 0x0B4), VIDEO_BASEADDR2); // start address

Xil_Out32((VDMA_BASEADDR + 0x0A8), (H_STRIDE*3)); // h offset (H_STRIDE* 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x0A4), (H_ACTIVE*3)); // h size (H_ACTIVE * 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x0A0), V_ACTIVE); // v size (V_ACTIVE)

/*****************从DDR读数据设置**********************/

Xil_Out32((VDMA_BASEADDR + 0x000), 0x8B); // enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x05c), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x060), VIDEO_BASEADDR1); // start address

Xil_Out32((VDMA_BASEADDR + 0x064), VIDEO_BASEADDR2); // start address

Xil_Out32((VDMA_BASEADDR + 0x058), (H_STRIDE*3)); // h offset (H_STRIDE * 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x054), (H_ACTIVE*3)); // h size (H_ACTIVE * 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x050), V_ACTIVE); // v size (V_ACTIVE)

while (1) ;

}

640x480_1024x600 (使用缩放ip) 显示工程对应的main.c主函数
#include "I2C_16bit.h"

#include "xiicps.h"

#include "xil_io.h"

#include "xparameters.h"

#include "vtc_config.h"

#include "xhls_video_scaler_top.h"

#define XPAR_HLS_VIDEO_SCALER_TOP_DEVICE_ID XPAR_HLS_VIDEO_SCALER_TOP_0_DEVICE_ID

#define VDMA_BASEADDR XPAR_AXI_VDMA_0_BASEADDR

#define VIDEO_BASEADDR0 0x01000000

#define VIDEO_BASEADDR1 0x02000000

#define VIDEO_BASEADDR2 0x03000000

#define H_ACTIVE 1024

#define V_ACTIVE 600

#define H_STRIDE 1024

XHls_video_scaler_top XHls_video_scaler;

XIicPs Iic;

void XHls_video_scaler_initialize(void)

{

int status;

status=XHls_video_scaler_top_Initialize(&XHls_video_scaler, XPAR_HLS_VIDEO_SCALER_TOP_DEVICE_ID);

if(0!=status)

{

xil_printf("XPAR_HLS_VIDEO_SCALER FAILED/n");

}

}

void XHls_video_scaler_setup(u16 row,u16 col,u16 drow,u16 dcol)

{

XHls_video_scaler_top_SetRows(&XHls_video_scaler,row);

XHls_video_scaler_top_SetCols(&XHls_video_scaler, col);

XHls_video_scaler_top_SetDrows(&XHls_video_scaler, drow);

XHls_video_scaler_top_SetDcols(&XHls_video_scaler, dcol);

XHls_video_scaler_top_InterruptGlobalDisable(&XHls_video_scaler);

XHls_video_scaler_top_EnableAutoRestart(&XHls_video_scaler);

XHls_video_scaler_top_Start(&XHls_video_scaler);

}

void main()

{

// Initialize OV5640 regesiter

I2C_config_init();

// Config VTC

Vtc_init(&Vtc, VTC_DEV_ID, &Vtc_timing, VIDEO_RESOLUTION_WSVGA);

//Initialize XHls_video_scaler Ip

XHls_video_scaler_initialize();

//set input and output resolution ratio

XHls_video_scaler_setup(480,640,600,1024);

//Xil_Out32((VDMA_BASEADDR + 0x030), 0x108B);// enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x030), 0x108B);// enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x0AC), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x0B0), VIDEO_BASEADDR1); // start address

Xil_Out32((VDMA_BASEADDR + 0x0B4), VIDEO_BASEADDR2); // start address

Xil_Out32((VDMA_BASEADDR + 0x0A8), (H_STRIDE*3)); // h offset (H_STRIDE* 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x0A4), (H_ACTIVE*3)); // h size (H_ACTIVE * 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x0A0), V_ACTIVE); // v size (V_ACTIVE)

/*****************从DDR读数据设置**********************/

Xil_Out32((VDMA_BASEADDR + 0x000), 0x8B); // enable circular mode

Xil_Out32((VDMA_BASEADDR + 0x05c), VIDEO_BASEADDR0); // start address

Xil_Out32((VDMA_BASEADDR + 0x060), VIDEO_BASEADDR1); // start address

Xil_Out32((VDMA_BASEADDR + 0x064), VIDEO_BASEADDR2); // start address

Xil_Out32((VDMA_BASEADDR + 0x058), (H_STRIDE*3)); // h offset (H_STRIDE * 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x054), (H_ACTIVE*3)); // h size (H_ACTIVE * 3) bytes

Xil_Out32((VDMA_BASEADDR + 0x050), V_ACTIVE); // v size (V_ACTIVE)

while (1) ;

}

1.4 小结

实际使用中,屏的分辨率和使用方法各有差异,但是使用的思路是类似的,这里给出的是RGB、HDMI接口屏的OV5640传输显示,大家可以根据自己实际使用情况进行调整。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lcd
    lcd
    +关注

    关注

    36

    文章

    4635

    浏览量

    178210
  • Zynq
    +关注

    关注

    10

    文章

    635

    浏览量

    49614
  • RGB接口
    +关注

    关注

    1

    文章

    5

    浏览量

    10681
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何在防止 OV219 加载的同时正确启用 IMX5640

    引脚。但是,我们使用的不是 EVK 上定义的 OV5640,而是 IMX219(Raspberry Pi 相机模块 V2)。我们修改了 DTS 以识别此设备。 I2C 通信似乎正在工作,并且
    发表于 04-03 07:56

    基于智多晶FPGA的DVP转MIPI CSI-2视频传输方案

    在嵌入式视觉系统中,DVP接口作为一种经典成熟的并行视频接口,凭借其实现简单、时序直观的特点,至今仍被大量图像传感器(如OV5640)广泛采用。但随着移动设备和高清显示的发展,MIPI CSI-2
    的头像 发表于 03-20 09:32 1.1w次阅读
    基于智多晶FPGA的DVP转MIPI CSI-2视频传输方案

    ESP32-S3在初始化摄像头时检测到摄像头模组型号不被支持

    :更换一个确认完好的OV2640/OV5640模组测试; 复位引脚:将CAM_PIN_RESET接3.3V(跳过软件复位,直接硬件复位)。 三、关键注意事项 ESP32-S3必须使用外部SPI RAM
    发表于 02-11 06:38

    蜂鸟处理器+OV5640摄像头模块开发

    本队伍编号CICC3042,本文重点介绍蜂鸟处理器和OV5640模块的结合方式、OV5640的窗口调节,以及图像的resize方法,试图以一种简单快速的方式得到令人满意的
    发表于 10-31 07:59

    【CPKCOR-RA8D1】3.测试摄像头及屏幕

    图像传感器,支持不同的分辨率和功能(如 OV5640 支持自动对焦)。 (4)CEU 初始化 err = ceu_init(g_image_vga_sram, VGA_WIDTH
    发表于 10-29 23:11

    使用e203驱动OV5640

    寄存器配置,使得数据线方向为输入。其实此处我们可以取巧,在已经测试过从设备可用的状况下,我们可以直接模拟一个ack信号,这样就可以省略一个检测ack信号的函数。 外部逻辑分析检测I2C信号,能够返回ACK,读写成功
    发表于 10-29 06:15

    利用MCU的引脚去配置OV5640时产生的问题及解决办法

    本篇主要介绍,在利用MCU的引脚去配置OV5640是时产生的问题 问题描述 我们利用MCU的引脚去配置摄像头OV5640的过程中发现,通过引脚读回来的寄存器的值始终有问题,所以我们用示波器去
    发表于 10-28 07:36

    mcu200t配置OV5640寄存器

    OV5640介绍 OV5640 的寄存器配置是通过 FPGA 的 I2C(也称为 SCCB 接口)接口来配置,需要配置正确的寄存器值让 OV5640 输出我们需要的图像格式
    发表于 10-23 06:01

    OV5640通信协议解读

    V5640是一款1/4英寸单芯片图像传感器,使用的是两线式SCCB接口总线。 OV5640的写时序: SCCB的写传输协议如下图所示: 上图中的ID ADDRESS是由7位器件地址和1位读写控制位
    发表于 10-21 15:07

    OV5640传输协议介绍

    V5640是一款1/4英寸单芯片图像传感器,使用的是两线式SCCB接口总线。 OV5640的写时序: SCCB的写传输协议如下图所示: 上图中的ID ADDRESS是由7位器件地址和1位读写控制位
    发表于 10-21 12:11

    k210调试OV5640摄像头参数无效怎么处理?

    结果和实际结果 0V2640摄像头在曝光和增益调节上,变化明显;而OV5640没有任何变化,请问该如何调节0V5640的成像效果
    发表于 08-14 08:17

    #LCD显示屏 #HDMI #智能显示 #驱动方案

    lcd
    jf_65742179
    发布于 :2025年06月18日 10:07:54

    K230 V3.0使用Mipi显示屏无法显示图像怎么解决?

    1.创乐博的K230 V3.0版本 烧录了官网上的最新固件,使用sdcard里面的例程,分别是display里面的lcd 和sensor的single_lcd,商家配套的mipi显示屏上 都没有
    发表于 06-04 07:17

    正点原子Z20 ZYNQ 开发板发布!板载FMC LPC、LVDS LCD和WIFI&蓝牙等接口,资料丰富!

    正点原子Z20 ZYNQ 开发板发布!板载FMC LPC、LVDS LCD和WIFI&蓝牙等接口,资料丰富! 正点原子新品Z20 ZYNQ开发板来啦!核心板全工业级设计,主控
    发表于 05-30 16:55

    参考cycx3_uvc_ov5640例程,想进行按键触发拍照,使用方法一,请问怎么实现的?

    参考cycx3_uvc_ov5640例程,想进行按键触发拍照,使用方法一,请问怎么实现的?现在硬件按键触发没有问题,上位机软件拍照也没有问题。 glStatusBuffer[0] = 0x02
    发表于 05-21 07:24