历史上的今天

今天是:2024年11月12日(星期二)

2019年11月12日 | 基于OV7670摄像头的SCCB总线的实现

发布者:HeavenlyJoy444 来源: 51hei关键字:OV7670  摄像头  SCCB总线 手机看文章 扫描二维码
随时随地手机看文章

OV7670的SCCB总线这个让我日夜思念的问题今天终于解决了,我在他身上付出了近5天的努力,工作的路上在想,吃饭的时候在想,上厕所在想,晚上睡不着在想,除了晚上DOTA的时候不想外,几乎总在想这个问题,SCCB很想IIC总线,IIC总线我早在去年的时候就做过了,不是很难,就是主机发送数据包,从机应答就好了,于是我搭起来电路板,问题来了,我的MCU是5V而摄像头要求电源电压和IO不能超过3V,怎么办呢?找手册,手册里写的是最低工作电压是3.7V,不行,电压太高,会烧掉他的,一筹莫展,怎么办?正好我手头还有几片AVR的高速单片机,于是开始用他们,终于电源电压的问题解决了,自以为问题不大,他的工作电压可以达到2.8V,于是接上,就开始向里面写程序,怎么调也不行,任凭我怎样调试,始终读不回数据,数据是标志和OV7670的握手是否成功的关键,我使用模拟的办法来写的程序,因为那是不需要很大硬件开销的,但是占了很多的CPU时间,于是我就考虑是不是时序在高速状态下错误或者超过400KHZ呢?有可能啊,于是就加了很多延时,结果不仅失望,还是扯,没有回应,愁死了,于是就向卖家要技术资料,那孙子说只能给数据手册,另外还要加钱,我不干,有上网上找资料,他妈的都是用ARM做的,人家多是基于LINUX的代码根本不通用,我这水平也看不懂,转了一大圈有回到了自己的代码上,究竟是什么问题导致的,没有示波器,逻辑分析仪,只有一块万用表,还是单位的,很郁闷,也不知道程序究竟是个什么波形,用软件模拟后,时序肯定没问题,但就是读出数据,而且数据老是错,我的第一个转折开始考虑供电电压,我发现一个规律:每当我不接0V7670时在PC上显示的数据始终是正确的,一接上就出现乱码,或者错误吗,是干扰吗?没有高频的干扰源,我用的还是内部晶振,电源加了两个滤波器,这信息让我测量了一下MCU的VCC电压,结果出现了惊人的巧合,当我不接7670时电源电压是2,8V,此时数据发送正常,一旦接上后就变成了2,6V,已经达到了MCU的低电压器检测的门槛,MCU要复位了,呵呵问题找到了,凶手是电源电压,但是我没有专用的稳压芯片所以不敢吧3.3V的电压接到VCC,昨天终于鼓起勇气拿起烙铁,VCC=3.4V,MCU正常工作,至于7670我那时候不知道他什么状态,因为的IO和VCC电压都大于他手册上的电压,硬着头皮向里面写程序,每一次的实验我都揪心啊,结果还是不行,我那个郁闷啊!怎么这么操蛋呢?第二个转折点:既然模拟不行我用硬件,开始用硬件做,昨天用了一上午时间看手册,学会了寄存的设置和编程,昨天下午调试,今天上午实验成功,数据被读出来了,看来7670对握手是很苛刻的!!!!


下面上程序


#include
#define uchar unsigned char 
#define uint unsigned int 
#define set_bit(a,b)  a|=(1<#define clr_bit(a,b)  a&=(1<#define get_bit(a,b)  a&(1<#pragma interrupt_handler TX_end:14
uchar TXEND;
void TX_end()
{
TXEND=0;//发送完毕标志
}
void USART_INT()//初始化串口
{
//UCSRA默认
UCSRB=0x48;//使能发送完毕中断,禁能数据寄存器空中断,使能发送模式,关闭接收,关闭接收中断
UCSRC=0x86;//禁止奇偶效验,数据位8,停止位1,工作在异步模式
UBRRH=0x00;//
UBRRL=51;//波特率9600,8MHZ,
SREG=0x80;//开启全局中断
}

void send_byte(uchar buffer)//向PC发送数据
{
   while(0==get_bit(UCSRA,5));//数据寄存器里的数据是不是为空如果是就写数据
  
    UDR=buffer;


while(TXEND);//是否发送完毕?
TXEND=1;//上一帧已经发送准备下一帧的发送
}
/*void ov7670_int()//7670初始化函数
{

}*/


////***********SCCB-----OX7670************************//////////
void delay1ms(uint z)
{
uint j,k; 
    for(k=z;k;k--)
                       {                           
                      for(j=2666;j;j--) ;  //此处j不得小于27否则读不出数据
        }
                
}

void int_twi_sccb()
{
TWBR=50;//设置SCL的时钟频率在19。230khz
}
void send_model_sccb()//主发送模式程序
{
    TWCR=0xa4;//插入开始新号使能总线,使能START
send_byte(0xf4);
send_byte(0xcc);
send_byte(0xf4);
while(0==get_bit(TWCR,7));//检测起始信号是否发送?
while((TWSR&0xf8)!=0x08)
{send_byte(0xf4);
     send_byte(0x01);
     send_byte(0xf4);//出错
}
send_byte(0xf4);
send_byte(0x10);
send_byte(0xf4);//START信号的正确响应码


TWDR=0x42;//写操作SCCB的器件写地址0X42
TWCR=0x84;//重启启动数据的发送
send_byte(0xf4);
send_byte(0xcc);
send_byte(0xf4);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
while((TWSR&0XF8)!=0x18)
{send_byte(0xf4);
send_byte(0x02);
send_byte(0xf4);
     }

send_byte(0xf4);
send_byte(0x20);
send_byte(0xf4);//发送完毕有ACK应答响应码


TWDR=0x0b;//写操作SCCB的寄存器地址0x0a
TWCR=0x84;//重启启动数据的发送
send_byte(0xf4);
send_byte(0xcc);
send_byte(0xf4);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
while((TWSR&0XF8)!=0x28)
{
send_byte(0xf4);
send_byte(0x03);//出错
send_byte(0xf4);
     }

send_byte(0xf4);
send_byte(0x30);
send_byte(0xf4);//发送完毕有ACK应答响应码


TWCR=0x94;//STOP信号





}
uchar incept_model_sccb()//主接收模式程序
{
     uchar date;
TWCR=0xa4;//插入开始新号使能总线,使能START
send_byte(0xf4);
send_byte(0xcc);
send_byte(0xf4);
while(0==get_bit(TWCR,7));//检测起始信号是否发送?
while((TWSR&0XF8)!=0x08)
{send_byte(0xf4);
send_byte(0x04);//出错
send_byte(0xf4);
     }

send_byte(0xf4);
send_byte(0x40);
send_byte(0xf4);//START信号的正确响应码

TWDR=0x43;//写操作SCCB的器件写地址0X43
TWCR=0x84;//重启启动数据的发送
send_byte(0xf4);
send_byte(0xcc);
send_byte(0xf4);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
while((TWSR&0XF8)!=0x40)
{send_byte(0xf4);
send_byte(0x05);//出错
send_byte(0xf4);
     }

send_byte(0xf4);
send_byte(0x50);
send_byte(0xf4);//发送完毕有ACK应答响应码


TWCR=0x84;//启动数据的接收
send_byte(0xf4);
send_byte(0xcc);
send_byte(0xf4);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
date=TWDR;
while((TWSR&0XF8)!=0x58)
{send_byte(0xf4);
send_byte(0x06);
send_byte(0xf4);}//出错

send_byte(0xf4);
send_byte(0x60);
send_byte(0xf4);//发送完毕有NACK应答响应码


TWCR=0x94;//STOP信号

return(date);
}

void main()
{
uchar inceptdate;
DDRC=0xff;
PORTC=0xff;
USART_INT();
int_twi_sccb();

send_model_sccb();
delay1ms(2);
inceptdate=incept_model_sccb();
send_byte(0xf4);
send_byte(inceptdate);
send_byte(0xf4);
while(1);

}

关键字:OV7670  摄像头  SCCB总线 引用地址:基于OV7670摄像头的SCCB总线的实现

上一篇:8位共阳数码管74HC595芯片AVR单片机控制 proteus仿真及源码
下一篇:avr单片机流水灯和按键抗干扰

推荐阅读

近年来各手机厂商为了能做出100%的全面屏手机都费了不少心思,例如滑盖,弹出式镜头都是为了全面屏手机做出的过渡方案,主要是为了放置听筒和前置摄像头。但日前有媒体报道,华为申请了新的全面屏听筒方案。 据了解,USPTO在11月6日公布了华为这项专利稿,显示华为将会在屏幕内挖槽,用来放置听筒,并且还显示该款手机将会采用背部...
前些时间,根据路透社报道丰田将采购 5 万套松下的圆柱电池来做 PHEV,主要是卡罗拉(Corolla)和雷凌(Levin)的 PHEV 上。由于这款车的信息不多,现在网上有比较细节的信息发布出来,我做一些整理。这款电池系统确实是基于 18650 的电芯来做的,15 个电芯并联,然后 4 组串联形成一个模组。一共分成了 20 个模组,分成四个区块分总成。 60...
前段时间,型号为PEGT00和PEGM00的OPPO手机出现在工信部网站,通过了入网许可,有消息显示这就是全新的OPPO Reno5系列。11月12日,微博博主@数码闲聊站 发文称,一款可能是OPPO Rena5 Pro手机的OPPO新机跑分出炉。OPPO新机跑分数据据介绍,这款手机的型号是OPPO PDSM00,与此前出现在工信部的机型型号吻合,应该是Rena5系列的机型。这款手机在Geekbenc...
1、使用方法: 以HP8594为例分析其使用方法。面板如图所示:根据测试的信号的功率大小,选择是否需要增加外置衰减器。然后依 次设定工作频率(FREQUENCY)、扫描带宽(SPAN)、频谱仪射频口输入最大信号电平(RF LEVEL )、分析带宽(RB)、视频带宽(VB)、扫描时间(SWEEPTIME)等。FREQUENCY 为被测设备的工作带宽内的中心频率,或者是分频段测试...

史海拾趣

问答坊 | AI 解惑

电路设计常用(部分)软件介绍

导航:老古开发网首页→文章分类→电路板→第4页→[电路设计常用(部分)软件介绍] | -文章搜索 - 最新文章 - | 第831篇:电路设计常用(部分)软件介绍 发布时间:2005年8月22日 点击次数:6324 详细内容:电路设计常用(部分)软件介绍随着 ...…

查看全部问答∨

tdb格式的文件转为GDS格式的

如题 ,就是怎样在L-EDIT里把tdb格式的文件转为GDS格式的,谢谢…

查看全部问答∨

半导体行业(微电子/IC设计)职业指导(转)(下)

技能储备      技能储备对于提高效率很有好处。工欲善其事,必先利其器。对于电路或者逻辑设计工程师而言,技能方面的储备主要涉及基本技能,专业技能,和职业技能几个方面。 基本技能和一些基础知识有时很难分清,但都是是 ...…

查看全部问答∨

GPRS设备如何和接入公网的具有静态IP的计算机进行数据通讯?

请有经验的大侠们说一说,车载GPRS设备如何与监控中心的计算机进行数据通讯,还有,如果在火车上,这个供电问题怎么解决呢…

查看全部问答∨

100 分求一个 Windows CE 6.0 正式版下载…

今天收到了开发板,老板给的光盘里 CE 6.0 居然是 120 天试用的,而不是正式版…100 分求一个正式版下载,非常感激!…

查看全部问答∨

100分求助串口驱动问题

小弟在看串口驱动的PDD层时,有以下问题不清楚,请高手帮助解决一下 先谢谢啦 1.LOOKUP_TBL  是否结构体,具体定义是什么 2.PHYSICAL_ADDRESS    是否结构体,具体定义是什么 3.HalTranslateBusAddress   4.为 ...…

查看全部问答∨

关于串口控制台波特率的设置问题?

在板子的初始化中 找到了这个代码  我现在想该动串口控制台的波特率,但发现这个代码 始终没有找到这个波特率的设置 我现在控制台波特率是38400 请教大家 我如何在内核中修改啊 我想改成115200 还有 我查找资料 getty可以改 linux下报错无 ...…

查看全部问答∨

学习的话S3C2440和S3C6410该如何选择?

感觉S3C6410是将来的趋势,毕竟是ARM11,比ARM9要高端一些。今年上大四,打算暑假学学嵌入式技术 ,到时好找工作。在论坛看了好久,好多都是说S3C2440的,S3C6410的资料好少。不知道明年哪个会对 找工作更有用?请前辈们指教。刚开始学习是先买本 ...…

查看全部问答∨

医疗影像应用领域的嵌入式处理器

  过去几年来,技术进步推动医疗影像领域取得了众多成就。如今,诊断速度更快、准确度更高,而且为患者提供护理的成本也相应更低,患者自我护理逐渐成为现实,毋需再花时间坐车到医院看病。 德州仪器 (TI) 嵌入式处理器在推动上述技术进步过 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved