OV7670寄存器读出0x00或0xFF

news2024/9/24 7:23:26

文章目录

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


问题描述

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)begin
    if(!rst_n)begin
        scl_reg <= 1'b1;
        sda_reg <= 1'b1;
        dout <= 1'b0;
    end
    else begin
        // 写寄存器
        if(mode == 1'b1)begin
            case(cnt_step)
                // 开始标志    
                0 :begin scl_reg <= 1'b1; sda_reg <= 1'b1; end
                1 :begin scl_reg <= 1'b1; sda_reg <= 1'b0; end
                2 :begin scl_reg <= 1'b0; sda_reg <= 1'b0; end
                // ID地址
                3 :begin scl_reg <= scl_high; sda_reg <= data[23]; end
                4 :begin scl_reg <= scl_high; sda_reg <= data[22]; end
                5 :begin scl_reg <= scl_high; sda_reg <= data[21]; end
                6 :begin scl_reg <= scl_high; sda_reg <= data[20]; end
                7 :begin scl_reg <= scl_high; sda_reg <= data[19]; end
                8 :begin scl_reg <= scl_high; sda_reg <= data[18]; end
                9 :begin scl_reg <= scl_high; sda_reg <= data[17]; end
                10:begin scl_reg <= scl_high; sda_reg <= data[16]; end
                11:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                12:begin scl_reg <= scl_high; sda_reg <= 1'bz; end
                13:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end
                // 子地址
                14:begin scl_reg <= scl_high; sda_reg <= data[15]; end
                15:begin scl_reg <= scl_high; sda_reg <= data[14]; end
                16:begin scl_reg <= scl_high; sda_reg <= data[13]; end
                17:begin scl_reg <= scl_high; sda_reg <= data[12]; end
                18:begin scl_reg <= scl_high; sda_reg <= data[11]; end
                19:begin scl_reg <= scl_high; sda_reg <= data[10]; end
                20:begin scl_reg <= scl_high; sda_reg <= data[9]; end
                21:begin scl_reg <= scl_high; sda_reg <= data[8]; end
                22:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                23:begin scl_reg <= scl_high; sda_reg <= 1'bz; end
                24:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end
                // 写入数据
                25:begin scl_reg <= scl_high; sda_reg <= data[7]; end
                26:begin scl_reg <= scl_high; sda_reg <= data[6]; end
                27:begin scl_reg <= scl_high; sda_reg <= data[5]; end
                28:begin scl_reg <= scl_high; sda_reg <= data[4]; end
                29:begin scl_reg <= scl_high; sda_reg <= data[3]; end
                30:begin scl_reg <= scl_high; sda_reg <= data[2]; end
                31:begin scl_reg <= scl_high; sda_reg <= data[1]; end
                32:begin scl_reg <= scl_high; sda_reg <= data[0]; end
                33:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                34:begin scl_reg <= scl_high; sda_reg <= 1'bz; end
                35:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end                   
                // 结束标志
                36:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end
                37:begin scl_reg <= 1'b1; sda_reg <= 1'b1; end
            endcase
        end
        // 读寄存器
        else if(mode == 1'b0)begin
            case(cnt_step)
                // 开始标志    
                0 :begin scl_reg <= 1'b1; sda_reg <= 1'b1; end
                1 :begin scl_reg <= 1'b1; sda_reg <= 1'b0; end
                2 :begin scl_reg <= 1'b0; sda_reg <= 1'b0; end
                // ID地址
                3 :begin scl_reg <= scl_high; sda_reg <= data[23]; end
                4 :begin scl_reg <= scl_high; sda_reg <= data[22]; end
                5 :begin scl_reg <= scl_high; sda_reg <= data[21]; end
                6 :begin scl_reg <= scl_high; sda_reg <= data[20]; end
                7 :begin scl_reg <= scl_high; sda_reg <= data[19]; end
                8 :begin scl_reg <= scl_high; sda_reg <= data[18]; end
                9 :begin scl_reg <= scl_high; sda_reg <= data[17]; end
                10:begin scl_reg <= scl_high; sda_reg <= data[16]; end
                11:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                12:begin scl_reg <= scl_high; sda_reg <= 1'bz; end
                13:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end
                // 子地址
                14:begin scl_reg <= scl_high; sda_reg <= data[15]; end
                15:begin scl_reg <= scl_high; sda_reg <= data[14]; end
                16:begin scl_reg <= scl_high; sda_reg <= data[13]; end
                17:begin scl_reg <= scl_high; sda_reg <= data[12]; end
                18:begin scl_reg <= scl_high; sda_reg <= data[11]; end
                19:begin scl_reg <= scl_high; sda_reg <= data[10]; end
                20:begin scl_reg <= scl_high; sda_reg <= data[9]; end
                21:begin scl_reg <= scl_high; sda_reg <= data[8]; end
                22:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                23:begin scl_reg <= scl_high; sda_reg <= 1'bz; end
                24:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end
                // 结束标志
                25:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end
                26:begin scl_reg <= 1'b1; sda_reg <= 1'b1; end
                // 开始标志
                27:begin scl_reg <= 1'b1; sda_reg <= 1'b1; end
                28:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end
                29:begin scl_reg <= 1'b0; sda_reg <= 1'b0; end                    
                // ID地址
                30:begin scl_reg <= scl_high; sda_reg <= data[23]; end
                31:begin scl_reg <= scl_high; sda_reg <= data[22]; end
                32:begin scl_reg <= scl_high; sda_reg <= data[21]; end
                33:begin scl_reg <= scl_high; sda_reg <= data[20]; end
                34:begin scl_reg <= scl_high; sda_reg <= data[19]; end
                35:begin scl_reg <= scl_high; sda_reg <= data[18]; end
                36:begin scl_reg <= scl_high; sda_reg <= data[17]; end
                37:begin scl_reg <= scl_high; sda_reg <= 1'b1; end
                38:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                39:begin scl_reg <= scl_high; sda_reg <= 1'bz; end
                40:begin scl_reg <= 1'b0; sda_reg <= 1'bz; end
                // 读出数据
                41:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[7] <= sdat; end
                42:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[6] <= sdat; end
                43:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[5] <= sdat; end
                44:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[4] <= sdat; end
                45:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[3] <= sdat; end
                46:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[2] <= sdat; end
                47:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[1] <= sdat; end
                48:begin scl_reg <= scl_high; sda_reg <= 1'bz; dout[0] <= sdat; end
                49:begin scl_reg <= scl_high; sda_reg <= 1'b1; end
                // 结束标志
                50:begin scl_reg <= 1'b1; sda_reg <= 1'b0; end
                51:begin scl_reg <= 1'b1; sda_reg <= 1'b1; end
            endcase
        end
    end
end

assign sclk = scl_reg;
assign sdat = idle ? 1'bz : sda_reg;

简单粗暴的穷举~

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

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

相关文章

mysql的索引、事务和存储引擎

目录 索引 索引的概念 索引的作用 作用 索引的副作用 创建索引 创建索引的原则和依据 索引的类型 创建索引 查看索引 删除索引 drop 主键索引 普通索引 添加普通索引 唯一索引 添加唯一索引 组合索引 添加组合索引 查询组合索引 全文索引 添加全文索引 …

K12智慧校园智能化解决方案

1. 项目背景 “十三五”期间&#xff0c;教育信息化工作旨在为教育改革发展提供动力与手段&#xff0c;目标是到2020年建成与国家教育现代化发展目标相适应的教育信息化体系。 2. 建设需求 智慧校园系统框架解析与建设目标分析&#xff0c;旨在实现教育信息化目标任务。 3.…

利用双端队列 实现二叉树的非递归的中序遍历

双端队列&#xff1a;双向队列&#xff1a;支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈&#xff08;stack&#xff09;。 pop(): 弹出栈中元素&#xff0c;也就是返回并移除队头元素&#xff0c;等价于removeFirst()&#xff0c;如果队列无元素&#xff0c;则…

QDockWidget

详细描述 QDockWidget 类提供了一个小部件&#xff0c;它可以停靠在QMainWindow内部&#xff0c;也可以作为桌面上的顶级窗口浮动。 QDockWidget 提供了停靠部件的概念&#xff0c;也称为工具调色板或实用窗口。停靠窗口是放置在 中央部件 周围的停靠部件区域中的辅助窗口&am…

多商户商城系统源码解析及直播电商APP开发指南

本篇文章&#xff0c;笔者将详细解析多商户商城系统的源码结构&#xff0c;并提供开发直播电商APP的指南。 一、多商户商城系统源码解析 系统架构设计 多商户商城系统的架构设计通常分为前端、后端和数据库三个部分&#xff1a; 前端 后端 数据库 核心模块分析 多商户商…

SpringMVC源码深度解析(上)

今天&#xff0c;聊聊SpringMVC框架的原理。SpringMVC属于Web框架&#xff0c;它不能单独存在&#xff0c;需要依赖Servlet容器&#xff0c;常用的Servlet容器有Tomcat、Jetty等&#xff0c;这里以Tomcat为例进行讲解。老规矩&#xff0c;先看看本项目的层级结构&#xff1a; 需…

ETAS RTM配置及使用-CPU Load测量/task时间测量/Isr时间测量

文章目录 前言RTM配置RtmControlRtmGeneralRtmMonitorOS配置RTE配置集成与测试初始化主函数函数执行测量测试CPU LoadTask MonitorISR Monitor函数监控总结前言 一般对CPU Load的测量,task及runnable的监控等有两种方案: 1.需要使用带trace功能的调试器,且硬件也需要支持对…

鸿蒙开发 01 实现骰子布局

鸿蒙开发 01 鸿蒙开发 01 实现骰子布局 1、效果2、代码 1、效果 2、代码 Entry Component struct Index {State message: string Hello Worldbuild() {Column() {Row() {Radio({ value: Radio1, group: radioGroup }).checked(false).height(100)Radio({ value: Radio1, grou…

【Linux线程】线程的认识

目录 线程的概念及一些基本理论 线程异常 线程与进程的关系 线程ID、线程控制块 线程的概念及一些基本理论 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 。 Linux没有真正意义上的线…

【每日刷题】Day83

【每日刷题】Day83 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 192. 把字符串转换成整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 2. 415. 字符串相加…

ubuntu安装显卡驱动,anaconda,cuda,cudnn,pytorch

安装显卡驱动&#xff1a;主要参考第一篇。 Ubuntu22.04安装显卡驱动(高速、避错版)-CSDN博客 [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[2]安装Anaconda与CUDA_ubuntu22.04配置cuda环境变量-CSDN博客 安装anaconda和cuda [超级详细系列]ubun…

从0开始的informer代码解读

股价预测源码原版来源 github https://github.com/zhouhaoyi/Informer2020 数据 工欲善其事必先利其器&#xff0c;这是我经常说的。所以了解我们的数据处理很重要&#xff0c;毕竟要的就是地地地地地地道。 源码中的date数据很重要。但是我们要知道我们下载的代码具有可拓…

python-NLP:1中文分词

文章目录 规则分词正向最大匹配法逆向最大匹配法双向最大匹配法 统计分词语言模型HMM模型 jieba分词分词关键词提取词性标注 规则分词 基于规则的分词是一种机械分词方法&#xff0c;主要是通过维护词典&#xff0c;在切分语句时&#xff0c;将语句的每个字符串与词表中的词进行…

pytorch学习(十二)c++调用minist训练的onnx模型

在实际使用过程中&#xff0c;使用python速度不够快&#xff0c;并且不太好嵌入到c程序中&#xff0c;因此可以把pytorch训练的模型转成onnx模型&#xff0c;然后使用opencv进行调用。 所需要用到的库有&#xff1a; opencv 1.完整的程序如下 import torch from torch impo…

06. 截断文本 选择任何链接 :root 和 html 有什么区别

截断文本 对超过一行的文本进行截断,在末尾添加省略号(…)。 使用 overflow: hidden 防止文本超出其尺寸。使用 white-space: nowrap 防止文本超过一行高度。使用 text-overflow: ellipsis 使得如果文本超出其尺寸,将以省略号结尾。为元素指定固定的 width,以确定何时显示省略…

韩顺平0基础学Java——第35天

p689-714 格式化语句 gpt说的&#xff1a; System.out.println 方法不支持像 printf 一样的格式化字符串。要使用格式化字符串&#xff0c;你可以使用 System.out.printf 方法或将格式化后的字符串传递给 System.out.println。下面是两种修正的方法&#xff1a; ### 方法一…

科研绘图系列:R语言circos图(circos plot)

介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…

昇思25天学习打卡营第25天|MindNLP ChatGLM-6B StreamChat

配置环节 %%capture captured_output !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 !pip install mindnlp !pip install mdtex2html配置国内镜像 !export HF_ENDPOINThttps://hf-mirror.com下载与加载模型 from m…

【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决

在safari浏览器中&#xff0c;可能会遇到异步时间差的问题&#xff0c;导致状态没有及时更新到state&#xff0c;引起传参错误。 PS&#xff1a;由于useState是一个普通的函数&#xff0c; 定义为() > void;因此此处不能用await/async替代setTimeout&#xff0c;只能用在返…

Vue3 composition api计算属性活学活用(作业题1 - 计算扁平化树树节点的索引)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。在学习了tree组件实现折叠与展开功能&#xff08;方式2 - visible计算属性&#xff09;后&#xff0c;给读者朋友留的一道编程作业题。 作业要求 合理的设计和实现树节点的计…