原子的OV5640_LCD例程,纯寄存器点亮 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

用ILA抓寄存器序列

  • 由于原子的例程,有用GPIO读屏的ID的函数,因此抓到的AXI读写要多一些。一共有58个。用Capture模式抓
  • 输出结果导出为csv表,注意其中有的Wdata的数据是0x1e0,这种导入到csv后,被识别成浮点的1E0,也就是1,导致我们的寄存器配置错误。需要手动把它改过来。这个错误很隐蔽,不容易发现。
  • 例程:disp_25_ov5640_lcd image image

c代码如下,结果正确

//****************************************Copyright (c)***********************************//
//原子哥在线教学平台:www.yuanzige.com
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取ZYNQ & FPGA & STM32 & LINUX资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name:           main.c
// Last modified Date:  2019/07/01 15:59:46
// Last Version:        V1.0
// Descriptions:        OV5640摄像头驱动LCD示例
//----------------------------------------------------------------------------------------
// Created by:          正点原子
// Created date:        2019/07/01 15:59:52
// Version:             V1.0
// Descriptions:        The original version
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//

/***************************** Include Files *********************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xgpio.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "display_ctrl/display_ctrl.h"
#include "vdma_api/vdma_api.h"
#include "emio_sccb_cfg/emio_sccb_cfg.h"
#include "ov5640/ov5640_init.h"

//宏定义
#define BYTES_PIXEL        3                           //像素字节数,RGB888占3个字节
#define FRAME_BUFFER_NUM   3                           //帧缓存个数3
#define DYNCLK_BASEADDR    XPAR_AXI_DYNCLK_0_BASEADDR  //动态时钟基地址
#define VDMA_ID            XPAR_AXIVDMA_0_DEVICE_ID    //VDMA器件ID
#define DISP_VTC_ID        XPAR_VTC_0_DEVICE_ID        //VTC器件ID
//PL端  AXI GPIO 0(lcd_id)器件 ID
#define AXI_GPIO_0_ID      XPAR_AXI_GPIO_0_DEVICE_ID   
//使用AXI GPIO(lcd_id)通道1
#define AXI_GPIO_0_CHANEL  1                           

//全局变量
//frame buffer的起始地址
unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR
										+ 0x1000000);
XAxiVdma     vdma;
DisplayCtrl  dispCtrl;
XGpio        axi_gpio_inst;   //PL端 AXI GPIO 驱动实例
VideoMode    vd_mode;
unsigned int lcd_id;


void init()
{
	//GPIO
	Xil_Out32(0x41200004,0x7);
	Xil_Out32(0x41200004,0x0);

	//VDMA
	Xil_Out32(0x43000000,0x4);
	Xil_Out32(0x43000030,0x4);
	Xil_Out32(0x43000030,0x0001008a);
	Xil_Out32(0x430000a4,0x960);
	Xil_Out32(0x430000a8,0x960);
	Xil_Out32(0x430000ac,0x1100000);
	Xil_Out32(0x430000b0,0x1219400);
	Xil_Out32(0x430000b4,0x1332800);
	Xil_Out32(0x43000000,0x0001008a);
	Xil_Out32(0x43000054,0x960);
	Xil_Out32(0x43000058,0x960);
	Xil_Out32(0x4300005c,0x1100000);
	Xil_Out32(0x43000060,0x1219400);
	Xil_Out32(0x43000064,0x1332800);
	Xil_Out32(0x43000030,0x0001408a);
	Xil_Out32(0x43000000,0x0001408a);
	Xil_Out32(0x43000030,0x0001408b);
	Xil_Out32(0x430000a0,0x1e0);
	Xil_Out32(0x43000000,0x0001408b);
	Xil_Out32(0x43000050,0x1e0);

	//dynClk
	Xil_Out32(0x43c10008,0x800083);
	Xil_Out32(0x43c1000c,0x800411);
	Xil_Out32(0x43c10010,0x0);
	Xil_Out32(0x43c10014,0x82);
	Xil_Out32(0x43c10018,0xd2cfa401);
	Xil_Out32(0x43c1001c,0x006300ff);
	Xil_Out32(0x43c10000,0x1);
	usleep(1000);
	Xil_Out32(0x43c10008,0x800083);
	Xil_Out32(0x43c1000c,0x800411);
	Xil_Out32(0x43c10010,0x0);
	Xil_Out32(0x43c10014,0x82);
	Xil_Out32(0x43c10018,0xd2cfa401);
	Xil_Out32(0x43c1001c,0x006300ff);
	Xil_Out32(0x43c10000,0x0);
	Xil_Out32(0x43c10000,0x1);
	usleep(1000);

	//v_tc
	Xil_Out32(0x43c00000,0x2);
	Xil_Out32(0x43c0006c,0x70);
	Xil_Out32(0x43c00070,0x421);
	Xil_Out32(0x43c00074,0x01fa01fa);
	Xil_Out32(0x43c00060,0x01e00320);
	Xil_Out32(0x43c00094,0x1e0);
	Xil_Out32(0x43c00078,0x03c80348);
	Xil_Out32(0x43c00080,0x01e301e0);
	Xil_Out32(0x43c0008c,0x01e301e0);
	Xil_Out32(0x43c00068,0x2);
	Xil_Out32(0x43c0007c,0x3200320);
	Xil_Out32(0x43c00084,0x3480348);
	Xil_Out32(0x43c00088,0x3200320);
	Xil_Out32(0x43c00090,0x3480348);
	Xil_Out32(0x43c0007c,0x3200320);
	Xil_Out32(0x43c00084,0x3480348);
	Xil_Out32(0x43c00088,0x3200320);
	Xil_Out32(0x43c00090,0x3480348);
	Xil_Out32(0x43c00000,0x03f7ef02);
	Xil_Out32(0x43c00000,0x03f7ef06);

}

int main(void)
{
	u32 status;
	u16 cmos_h_pixel;   //ov5640 DVP 输出水平像素点数
	u16 cmos_v_pixel;   //ov5640 DVP 输出垂直像素点数
	u16 total_h_pixel;  //ov5640 水平总像素大小
	u16 total_v_pixel;  //ov5640 垂直总像素大小

	XGpio_Initialize(&axi_gpio_inst,AXI_GPIO_0_ID);                //GPIO初始化
	XGpio_SetDataDirection(&axi_gpio_inst,AXI_GPIO_0_CHANEL,0x07); //设置AXI GPIO为输入
	lcd_id = LTDC_PanelID_Read(&axi_gpio_inst,AXI_GPIO_0_CHANEL);  //获取LCD的ID
	XGpio_SetDataDirection(&axi_gpio_inst,AXI_GPIO_0_CHANEL,0x00); //设置AXI GPIO为输出
	xil_printf("LCD ID: %x\r\n",lcd_id);

	//根据获取的LCD的ID号来进行ov5640显示分辨率参数的选择
	switch(lcd_id){
		case 0x4342 :  //4.3寸屏,480*272分辨率
			cmos_h_pixel = 480;
			cmos_v_pixel = 272;
			total_h_pixel = 1800;
			total_v_pixel = 1000;
			break;
		case 0x4384 :  //4.3寸屏,800*480分辨率
			cmos_h_pixel = 800;
			cmos_v_pixel = 480;
			total_h_pixel = 1800;
			total_v_pixel = 1000;
			break;
		case 0x7084 :  //7寸屏,800*480分辨率
			cmos_h_pixel = 800;
			cmos_v_pixel = 480;
			total_h_pixel = 1800;
			total_v_pixel = 1000;
			break;
		case 0x7016 :  //7寸屏,1024*600分辨率
			cmos_h_pixel = 1024;
			cmos_v_pixel = 600;
			total_h_pixel = 2200;
			total_v_pixel = 1000;
			break;
		case 0x1018 :  //10.1寸屏,1280*800分辨率
			cmos_h_pixel = 1280;
			cmos_v_pixel = 800;
			total_h_pixel = 2570;
			total_v_pixel = 980;
			break;
		default :
			cmos_h_pixel = 480;
			cmos_v_pixel = 272;
			total_h_pixel = 1800;
			total_v_pixel = 1000;
			break;
	}

	emio_init();                         //初始化EMIO
	status = ov5640_init( cmos_h_pixel,  //初始化ov5640
						  cmos_v_pixel,
						 total_h_pixel,
						 total_v_pixel);
	if(status == 0)
		xil_printf("OV5640 detected successful!\r\n");
	else
		xil_printf("OV5640 detected failed!\r\n");

	//根据获取的LCD的ID号来进行video参数的选择
	switch(lcd_id){
		case 0x4342 : vd_mode = VMODE_480x272;  break;  //4.3寸屏,480*272分辨率
		case 0x4384 : vd_mode = VMODE_800x480;  break;  //4.3寸屏,800*480分辨率
		case 0x7084 : vd_mode = VMODE_800x480;  break;  //7寸屏,800*480分辨率
		case 0x7016 : vd_mode = VMODE_1024x600; break;  //7寸屏,1024*600分辨率
		case 0x1018 : vd_mode = VMODE_1280x800; break;  //10.1寸屏,1280*800分辨率
		default : vd_mode = VMODE_800x480; break;
	}


	if(0){
		//配置VDMA
		run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
								frame_buffer_addr,0,0,BOTH);
		//初始化Display controller
		DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
		//设置VideoMode
		DisplaySetMode(&dispCtrl, &vd_mode);
		DisplayStart(&dispCtrl);
	}

	if(1){
		init();
	}

    return 0;
}

效果

3e20612804594b43736cf84fa52b8268 f981f20828d3c90096541f1e67466376

⚠️ **GitHub.com Fallback** ⚠️