OV7670寄存器读出0x00或0xFF

文章目录

  • 问题描述
  • 原因分析
  • 解决方案


问题描述

OV7670的输出图像异常,怀疑寄存器没有正确配置,在SignalTap中观察到SIO_D在读出阶段一直为高或低

寄存器读出0x00

寄存器读出0xFF


原因分析

在确保电源、时钟和读写时序没有问题的情况下,有可能是OV7670模块中SIO_C与SIO_D的引脚没有接上拉电阻,导致寄存器无法正常读写


解决方案

在FPGA对应引脚上开启上拉电阻,具体过程见 Altera FPGA 开启引脚片上上拉电阻功能

问题解决,寄存器读出0x17

标红的地方需要把SIO_D设置为高阻状态

这里附上SIO_C与SIO_D的时序,可以根据序列号1C7F & 1DA2进行验证

// 配置SCL与SDA
reg scl_reg;
reg sda_reg;
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginscl_reg <= 1'b1;sda_reg <= 1'b1;dout <= 1'b0;endelse begin// 写寄存器if(mode == 1'b1)begincase(cnt_step)// 开始标志    0 :begin scl_reg <= 1'b1; sda_reg <= 1'b1; end1 :begin scl_reg <= 1'b1; sda_reg <= 1'b0; end2 :begin scl_reg <= 1'b0; sda_reg <= 1'b0; end// ID地址3 :begin scl_reg <= scl_high; sda_reg <= data[23]; end4 :begin scl_reg <= scl_high; sda_reg <= data[22]; end5 :begin scl_reg <= scl_high; sda_reg <= data[21]; end6 :begin scl_reg <= scl_high; sda_reg <= data[20]; end7 :begin scl_reg <= scl_high; sda_reg <= data[19]; end8 :begin scl_reg <= scl_high; sda_reg <= data[18]; end9 :begin scl_reg <= scl_high; sda_reg <= data[17]; end10:begin scl_reg <= scl_high; sda_reg <= data[16]; end11:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end12:begin scl_reg <= scl_high; sda_reg <= 1'bz; end13:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end// 子地址14:begin scl_reg <= scl_high; sda_reg <= data[15]; end15:begin scl_reg <= scl_high; sda_reg <= data[14]; end16:begin scl_reg <= scl_high; sda_reg <= data[13]; end17:begin scl_reg <= scl_high; sda_reg <= data[12]; end18:begin scl_reg <= scl_high; sda_reg <= data[11]; end19:begin scl_reg <= scl_high; sda_reg <= data[10]; end20:begin scl_reg <= scl_high; sda_reg <= data[9]; end21:begin scl_reg <= scl_high; sda_reg <= data[8]; end22:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end23:begin scl_reg <= scl_high; sda_reg <= 1'bz; end24:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end// 写入数据25:begin scl_reg <= scl_high; sda_reg <= data[7]; end26:begin scl_reg <= scl_high; sda_reg <= data[6]; end27:begin scl_reg <= scl_high; sda_reg <= data[5]; end28:begin scl_reg <= scl_high; sda_reg <= data[4]; end29:begin scl_reg <= scl_high; sda_reg <= data[3]; end30:begin scl_reg <= scl_high; sda_reg <= data[2]; end31:begin scl_reg <= scl_high; sda_reg <= data[1]; end32:begin scl_reg <= scl_high; sda_reg <= data[0]; end33:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end34:begin scl_reg <= scl_high; sda_reg <= 1'bz; end35:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end                   // 结束标志36:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end37:begin scl_reg <= 1'b1; sda_reg <= 1'b1; endendcaseend// 读寄存器else if(mode == 1'b0)begincase(cnt_step)// 开始标志    0 :begin scl_reg <= 1'b1; sda_reg <= 1'b1; end1 :begin scl_reg <= 1'b1; sda_reg <= 1'b0; end2 :begin scl_reg <= 1'b0; sda_reg <= 1'b0; end// ID地址3 :begin scl_reg <= scl_high; sda_reg <= data[23]; end4 :begin scl_reg <= scl_high; sda_reg <= data[22]; end5 :begin scl_reg <= scl_high; sda_reg <= data[21]; end6 :begin scl_reg <= scl_high; sda_reg <= data[20]; end7 :begin scl_reg <= scl_high; sda_reg <= data[19]; end8 :begin scl_reg <= scl_high; sda_reg <= data[18]; end9 :begin scl_reg <= scl_high; sda_reg <= data[17]; end10:begin scl_reg <= scl_high; sda_reg <= data[16]; end11:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end12:begin scl_reg <= scl_high; sda_reg <= 1'bz; end13:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end// 子地址14:begin scl_reg <= scl_high; sda_reg <= data[15]; end15:begin scl_reg <= scl_high; sda_reg <= data[14]; end16:begin scl_reg <= scl_high; sda_reg <= data[13]; end17:begin scl_reg <= scl_high; sda_reg <= data[12]; end18:begin scl_reg <= scl_high; sda_reg <= data[11]; end19:begin scl_reg <= scl_high; sda_reg <= data[10]; end20:begin scl_reg <= scl_high; sda_reg <= data[9]; end21:begin scl_reg <= scl_high; sda_reg <= data[8]; end22:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end23:begin scl_reg <= scl_high; sda_reg <= 1'bz; end24:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end// 结束标志25:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end26:begin scl_reg <= 1'b1; sda_reg <= 1'b1; end// 开始标志27:begin scl_reg <= 1'b1; sda_reg <= 1'b1; end28:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end29:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end                    // ID地址30:begin scl_reg <= scl_high; sda_reg <= data[23]; end31:begin scl_reg <= scl_high; sda_reg <= data[22]; end32:begin scl_reg <= scl_high; sda_reg <= data[21]; end33:begin scl_reg <= scl_high; sda_reg <= data[20]; end34:begin scl_reg <= scl_high; sda_reg <= data[19]; end35:begin scl_reg <= scl_high; sda_reg <= data[18]; end36:begin scl_reg <= scl_high; sda_reg <= data[17]; end37:begin scl_reg <= scl_high; sda_reg <= 1'b1; end38:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end39:begin scl_reg <= scl_high; sda_reg <= 1'bz; end40:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end// 读出数据41:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[7] <= sdat; end42:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[6] <= sdat; end43:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[5] <= sdat; end44:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[4] <= sdat; end45:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[3] <= sdat; end46:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[2] <= sdat; end47:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[1] <= sdat; end48:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[0] <= sdat; end49:begin scl_reg <= scl_high; sda_reg <= 1'b1; end// 结束标志50:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end51:begin scl_reg <= 1'b1; sda_reg <= 1'b1; endendcaseendend
endassign sclk = scl_reg;
assign sdat = idle ? 1'bz : sda_reg;

简单粗暴的穷举~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCB系统学习(1)--PCB印制电路板

PCB印制电路板 1.1PCB的定义1.2PCB的层叠结构1.2.1PCB单层板1.2.2PCB双层板1.2.3PCB四层板 1.3PCB的通孔&#xff0c;盲孔&#xff0c;埋孔1.4元器件的符号与封装1.5PCB的生产过程 1.1PCB的定义 PCB(PrintedCircuitBoard)&#xff0c;中文即印制电路板&#xff0c;或印刷线路板…

Linux--多线程

今日内容 线程的结束机制&#xff1a; 1.不同与进程没有孤儿线程和僵尸线程。 2.主进程结束&#xff0c;任意生成的次线程都会结束。(因为共享的进程空间被回收了)。 3.次线程的正常结束不会影响主线程的运行。 子线程的回收策略&a…

分布式ID是什么?有哪些解决方案?

在开发中&#xff0c;我们通常会需要一个唯一ID来标识数据&#xff0c;如果是单体架构我们可以通过数据库的主键&#xff0c;或直接在内存中维护一个自增数字来作为ID都是可以的&#xff0c;但对于一个分布式系统&#xff0c;就会有可能会出现ID冲突&#xff0c;此时有以下解决…

vue3大事件管理系统 === 首页 layout 文章分类页面 -

目录 首页 layout 架子 [element-plus 菜单] 基本架子拆解 登录访问拦截 用户基本信息获取&渲染 退出功能 [element-plus 确认框] 文章分类页面 - [element-plus 表格] 基本架子 - PageContainer 文章分类渲染 封装API - 请求获取表格数据 el-table 表格动态渲染 …

CDM大全

CMD&#xff08;Command Prompt&#xff09;是Windows操作系统中的命令行解释器&#xff0c;它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其功能说明&#xff1a; 文件和目录管理 dir&#xff1a;显示当前目录中的文件和子目录列表。cd&#xff1a;更改…

《0基础》学习Python——第十八讲__爬虫\<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序&#xff08;通常使用Python&#xff09;&#xff0c;爬虫可以自动化地访问网页&#xff0c;解析网页内容并提取出所需的数据。爬虫可以用于各种用途&#xff0c;如搜索引擎的索引&#xff0c;数据分析和挖掘&#x…

NVIDIA 完全过渡到开源 GPU 内核模块

目录 支持的 GPU安装程序更改将包管理器与 CUDA 元包配合使用使用 runfile使用安装帮助程序脚本包管理器详细信息apt&#xff1a;基于 Ubuntu 和 Debian 的发行版dnf&#xff1a;Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypper&#xff1a;SUSE …

怎么关闭 Windows 安全中心,手动关闭 Windows Defender 教程

Windows 安全中心&#xff08;也称为 Windows Defender Security Center&#xff09;是微软 Windows 操作系统内置的安全管理工具&#xff0c;用于监控和控制病毒防护、防火墙、应用和浏览器保护等安全功能。然而&#xff0c;在某些情况下&#xff0c;用户可能需要关闭 Windows…

光电传感器的详细介绍,包括其原理、结构、分类、应用以及技术发展趋势

光电传感器是一种利用光电转换原理&#xff0c;将光信号转换为电信号的传感器。它在工业自动化、物流、医疗、安全等领域有着广泛的应用&#xff0c;是实现各种检测、测量和控制功能的重要元件。以下是对光电传感器的详细介绍&#xff0c;包括其原理、结构、分类、应用以及技术…

【分布式事务】怎么解决分布式场景下数据一致性问题

分布式事务的由来 拿充值订单举个栗子吧&#xff0c;假设&#xff1a;原本订单模块和账户模块是放在一起的&#xff0c;现在需要做服务拆分&#xff0c;拆分成订单服务&#xff0c;账户余额服务。原本收到充值回调后&#xff0c;可以将修改订单状态和扣减余额放在一个mysql事务…

C语言 | Leetcode C语言题解之第236题二叉树的最近公共祖先

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/typedef struct road_t {struct TreeNode *road_node; // 途径路径struct road_t *p_next; }…

IPD与CBB研发技术管理体系培训

获取下载完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取&#xff0c;请见下图

python—爬虫的初步了解

Python 爬虫&#xff08;Web Scraping&#xff09;是一种自动化从网站上提取数据的技术。Python 由于其简洁的语法、丰富的库和强大的社区支持&#xff0c;成为了实现网络爬虫的首选语言之一。下面是一些Python爬虫的基本概念和步骤&#xff1a; 1. 爬虫的基本概念 请求&…

深入理解Java线程的状态

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

8月长沙学术会议:经济金融发展国际会议(ICEFD 2024)

经济金融发展国际会议&#xff08;ICEFD 2024&#xff09;将于2024年8月20-22日在长沙盛大举行。本次会议汇聚了国内外众多高校、科研机构、企业界及其他相关领域的专家学者&#xff0c;共同探讨经济金融发展的新趋势、新挑战和新机遇。 长沙&#xff0c;这座历史悠久的文化名…

​前端Vue组件技术实践:打造自定义精美悬浮菜单按钮组件

随着前端技术的迅猛发展&#xff0c;复杂的应用场景和不断迭代的产品需求使得开发的复杂度日益提升。传统的整体式开发方式已经难以满足现代前端应用的灵活性和可维护性需求。在这样的背景下&#xff0c;组件化开发逐渐崭露头角&#xff0c;成为解决复杂前端应用问题的有效手段…

栈和队列的应用场景

栈的应用场景 1、程序调用栈 在大多数编程语言中&#xff0c;函数&#xff08;或方法&#xff09;调用时都会使用栈来保存执行上下文。例如&#xff0c;当一个函数调用另一个函数时&#xff0c;后者的执行上下文&#xff08;包括返回地址、参数、局部变量等&#xff09;会被推…

自学第十九天----深入探究数组下

3. 数组越界 数组的下标是有范围限制的。 数组的下规定是从0开始的&#xff0c;如果数组有n个元素&#xff0c;最后一个元素的下标就是n-1。 所以数组的下标如果小于0&#xff0c;或者大于n-1&#xff0c;就是数组越界访问了&#xff0c;超出了数组合法空间的访问。 C语言本身…

IDEA的常见代码模板的使用

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

Matlab学习笔记1

画点 x[-1, -1, 1, 1, -1, 0] y[-1, 1, 1, -1, -1, 0] % r是颜色&#xff0c; o是点的形状 plot(x, y, ro) % 画线 plot(x, y, r)求最大最小值 x[-1, -1, 1, 1, -1, 0] y[-1, 1, 1, -1, -1, 0] % -1 min(y) % 1 max(x)计算二维旋转矩阵 dcm angle2dcm(z_angle, y_angle, …