历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-12 来源:51hei

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);

}

推荐阅读

史海拾趣

Diconex公司的发展小趣事

在电子行业中,Diconex公司始终坚持以客户需求为导向的市场定位策略。公司深入调研市场需求,针对不同客户群体推出定制化解决方案。这种精准的市场定位使得Diconex的产品能够更好地满足客户需求,赢得了客户的信任和忠诚。同时,公司还积极拓展国际市场,与全球知名企业建立了长期稳定的合作关系。

鑫雁公司的发展小趣事

随着技术的不断积累和市场需求的扩大,聚洵半导体在产品研发上取得了显著突破。公司不仅继续深化在运算放大器领域的研发,还成功扩展了产品线,涵盖了模拟开关、电压基准、线性稳压器、电平转换器等多种产品。这些产品广泛应用于通讯网络、消费电子、工业控制等多个领域,满足了市场多样化的需求。同时,聚洵还获得了多项技术专利和荣誉,如集成电路布图设计专利和发明专利等,进一步巩固了其在行业中的地位。

CYANLITE公司的发展小趣事

CYANLITE公司一直秉持着绿色环保的理念,致力于推广节能减排的照明产品。他们不仅在产品设计上注重节能和环保,还积极参与各种环保公益活动,向公众普及LED照明的优势。这种积极的环保态度使得CYANLITE公司在市场上树立了良好的形象,也吸引了越来越多的消费者选择他们的产品。同时,公司还积极与政府部门合作,推动LED照明在公共领域的普及和应用。

Advanced Technology Corp公司的发展小趣事

ATC公司深知质量管理对于企业发展的重要性。因此,公司建立了严格的质量管理体系,从原材料的采购到产品的生产、检测、包装等环节都进行严格控制。此外,ATC公司还注重员工的培训和教育,提升员工的质量意识和技能水平。这些措施确保了ATC公司产品的稳定性和可靠性,赢得了客户的信任和好评。

Fractus公司的发展小趣事

Fractus公司的创新之路可以追溯到上世纪八十年代后期,在加泰罗尼亚理工大学(UPC)的研究实验室中,关于天线技术的早期研究拉开了序幕。这一时期的学术研究为后来Fractus的技术创新奠定了坚实的基础。随着研究的深入,Fractus逐渐掌握了几何结构天线设计的核心技术,并开始探索其在无线通信领域的应用潜力。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

AE&ST公司自创立之初,就深知技术创新是电子行业的核心竞争力。公司投入大量资源进行研发,不断探索新的半导体材料和生产工艺。在一次偶然的实验中,AE&ST的研发团队发现了一种新型半导体材料,这种材料在能效和稳定性方面表现出色。公司迅速将这一发现转化为产品,并推向市场。新产品一经推出,便因其卓越的性能获得了市场的广泛认可,AE&ST公司因此获得了巨大的商业成功。

问答坊 | AI 解惑

全国大学生电子设计竞赛历年题目(1994-2003)

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 好东西,可以参考一下。  …

查看全部问答>

想找个熟悉LPC1000系列的朋友帮忙~~

正在做LPC1111+显卡的开发板,想找个熟悉LPC1000系列的朋友帮忙。 希望会SPI的兄弟可以帮忙。…

查看全部问答>

LPC1114的Flash读写操作问题及解决办法

使用LPC1114的Flash时遇到些问题,特向各位请教。   (1)LPC1114的Flash是不是每次读写最少得256字节,而不可以一个字节一个字节的进行读写操作? (2)我现在想把一个数组(比较小)的数据随时存储到片内Flash中,并且可以随时读取,是 ...…

查看全部问答>

文件输出,输入的问题

用CreateFile创建文件,并用WriteFile向文件中写入TCHAR字符,但为什么用ReadFile读取内容并显示到listbox中无法实现。…

查看全部问答>

如何在编程实现ip与mac绑定

如题,板子上不支持arp -s命令,可否编一个程序转成2进制烧写进板子里运行~px255的板子~怎么实现呢,拜求各位走过路过的大侠~~…

查看全部问答>

请教一个zigbee的问题?

我刚接触zigbee,正研究协议栈程序(cc2430)。我发现这样的一个问题:      当一个rfd节点申请加入corde节点时,应该在corder节点处有判断PANID(网络号)是否相同,如果相同就可以加入,但是在协议栈corer源程序里不论nwk层,ma ...…

查看全部问答>

单片机※工控,QQ群号:23207776

单片机※工控,QQ群号:23207776…

查看全部问答>

如何在WINDOWS平台下仿潜入式环境?

大家好!    由于金钱的问题,没有条件买ARM处理器及相应的环境,看书而不练习,导致我看了就忘了,请问有没有在windows下模拟arm环境及编程的,让我能够熟悉一下ARM的命令及编程?还有我想学windows ce,但是还是只有一台PC机,其他什 ...…

查看全部问答>

学3G,不知道大家能给点建议不?我在上海,交大昂立3G学院如何?

大家好,我是今年刚毕业的一名学生,现在已经处于失业状态了,对找工作已经失去信心了,在校的时候就了解了一点3G的东西,所以现在想要去学个3G开发技术。我在各大网站上了解下来说交大昂立3G学院的老师还有就业方面都比较不错,不知道有在里面学习 ...…

查看全部问答>