Zynq开发-使用PYNQ快速入门摄像头MIPI驱动(OV5640)-overlay设计

本文主要是介绍Zynq开发-使用PYNQ快速入门摄像头MIPI驱动(OV5640)-overlay设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 简介

2. Overlay 设计

2.1 总体设计

2.2 MIPI 子系统

2.3 去马赛克

2.4 AXI_IIC

3. 注意事项

4. 总结


1. 简介

本文是关于《Zynq开发-使用PYNQ快速入门摄像头MIPI驱动(OV5640)-CSDN博客》的博客文章,涉及了overlay设计的Vivado工程细节。在使用PYNQ调试MIPI驱动之前,需要搭建一些基本的IP核。这个过程并不复杂,因为Xilinx已经提供了相当完善的IP核体系。

Vivado 对应版本:2022.1

摄像头型号:Digilent Pcam 5C

开发板型号:KV260

2. Overlay 设计

2.1 总体设计

本文提供了附带PDF文件,请参阅附件资源。文章通过一个简单的工程示例,演示了如何成功运行MIPI驱动的完整链路。

构建完整的工程需要将bit文件和hwh文件一并拷贝至PYNQ环境中,并使用overlay进行加载。

加载过程同样非常简单:

from pynq import Overlay
ol = Overlay("your.bit")

关于HWH的解释:
HWH(Hardware Handoff)是硬件托管文件,是一种包含硬件设计详细信息的文件。它由Vivado在生成比特流文件时自动生成。HWH文件采用XML格式,包含设计中使用的IP核、接口、层次结构、时钟、中断等相关信息。

2.2 MIPI 子系统

从 Block Design 中IP接口来看,mipi子系统的连接方式非常简单,其实 MIPI CSI-2 Rx Subsystem 是包含三个主要的 IP Core:

  • MIPI PHY,物理层,负责处理物理层面的MIPI接口,将MIPI协议中的电信号转换为逻辑信号,并将其传递给接收端。
  • MIPI CSI-2 Rx Controller,CSI-2 接收控制器,是MIPI CSI-2接收子系统的核心部分。它接收来自MIPI PHY的数据流,并解析其中的CSI-2协议,提取出图像数据和控制信息。
  • Video Format Bridge,视频格式桥接器,将从MIPI CSI-2 Rx Controller接收到的图像数据流转换为特定的视频格式,以便后续的处理或显示。

创建该 IP 的 TCL 命令如下:

  # Create instance: mipi_csi2_rx_subsyst_0, and set propertiesset mipi_csi2_rx_subsyst_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:mipi_csi2_rx_subsystem:5.1 mipi_csi2_rx_subsyst_0 ]set_property -dict [ list \CONFIG.CLK_LANE_IO_LOC {D7} \CONFIG.CLK_LANE_IO_LOC_NAME {IO_L13P_T2L_N0_GC_QBC_66} \CONFIG.CMN_NUM_LANES {2} \CONFIG.CMN_PXL_FORMAT {RAW10} \CONFIG.CSI_EMB_NON_IMG {false} \CONFIG.C_CLK_LANE_IO_POSITION {26} \CONFIG.C_CSI_EN_ACTIVELANES {true} \CONFIG.C_CSI_FILTER_USERDATATYPE {false} \CONFIG.C_DATA_LANE0_IO_POSITION {28} \CONFIG.C_DATA_LANE1_IO_POSITION {30} \CONFIG.C_DPHY_LANES {2} \CONFIG.C_EN_BG0_PIN0 {false} \CONFIG.C_EN_BG1_PIN0 {false} \CONFIG.C_EN_CSI_V2_0 {true} \CONFIG.C_EN_TIMEOUT_REGS {false} \CONFIG.C_HS_LINE_RATE {672} \CONFIG.C_HS_SETTLE_NS {149} \CONFIG.DATA_LANE0_IO_LOC {E5} \CONFIG.DATA_LANE0_IO_LOC_NAME {IO_L14P_T2L_N2_GC_66} \CONFIG.DATA_LANE1_IO_LOC {G6} \CONFIG.DATA_LANE1_IO_LOC_NAME {IO_L15P_T2L_N4_AD11P_66} \CONFIG.DPHYRX_BOARD_INTERFACE {som240_1_connector_mipi_csi_raspi} \CONFIG.DPY_EN_REG_IF {true} \CONFIG.DPY_LINE_RATE {672} \CONFIG.HP_IO_BANK_SELECTION {66} \CONFIG.SupportLevel {1} \CONFIG.VFB_TU_WIDTH {96} \] $mipi_csi2_rx_subsyst_0

2.3 去马赛克

去马赛克模块的驱动如下:

WIDTH = 1280
HEIGHT = 720demo = ol.v_demosaic_0
demo.write(0x10,WIDTH)
demo.write(0x18,HEIGHT)
demo.write(0x28,0x03)
demo.write(0x00,0x81)

OV5640摄像头是包含去马赛克功能的,本文并没有使用,因为后续文中会在此基础上,添加图像处理 IP Cores。本文的重点也是放在 MIPI 驱动上。

2.4 AXI_IIC

  # Create instance: axi_iic_0, and set propertiesset axi_iic_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_iic:2.1 axi_iic_0 ]set_property -dict [ list \CONFIG.IIC_BOARD_INTERFACE {som240_1_connector_hda_iic_switch} \CONFIG.IIC_FREQ_KHZ {400} \] $axi_iic_0

按照 TCL 代码调用 AXI IIC IP Core 即可,需要设置的参数很少。

3. 注意事项

  • IIC接口速度需要设置为 400 kHz,如果使用默认 100 kHz,会出现操作IIC接口卡死的情况。
  • 在摄像头原理图中《pcam_5c_sch.pdf》,提到传感器的地址为0x78,但实际中使用IIC扫描硬件设备时发现地址是0x3C。这似乎存在一些混淆,但实际上并不矛盾。0x78是一个包含读写位的地址,而0x3C则是去除了读写位后的地址。因此,0v5640的地址应当是0x78/0x79,其中0x78是写入地址,而0x79是读取地址。

  •  中断控制器的连接方式很重要,即使没有用到中断,不然 PYNQ 会报告无法找到中断。通常的做法使用 Concat 将几个中断合并,然后使用 AXI Interrupt Controller 将其连接到 Zynq 的中断输入。

 

4. 总结

本文分享了如何利用PYNQ快速入门摄像头MIPI驱动(OV5640)的过程。通过Vivado设计的overlay,演示了MIPI驱动的完整链路。文章着重介绍了MIPI子系统的构建,包括MIPI PHY、MIPI CSI-2 Rx Controller和Video Format Bridge的设置。另外,还介绍了去马赛克模块的驱动和AXI_IIC的配置。文章指出了一些注意事项,如IIC接口速度的设置、传感器地址的解释以及中断控制器的连接方式。

这篇关于Zynq开发-使用PYNQ快速入门摄像头MIPI驱动(OV5640)-overlay设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986086

相关文章

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁