久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12969|回復: 1
打印 上一主題 下一主題
收起左側

基于OV7670攝像頭的SCCB總線的實現

[復制鏈接]
跳轉到指定樓層
樓主
ID:26188 發表于 2015-6-23 14:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
     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<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b)  a|=(1<<b)
#define clr_bit(a,b)  a&=(1<<b)
#define get_bit(a,b)  a&(1<<b)
#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);


}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:177825 發表于 2017-3-22 15:12 | 只看該作者
我也想用iic寫ov的程序,我看資料上面可以用但是就只提了一句。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re6在线| 欧美三级久久久 | 国产黄a一级 | jav成人av免费播放 | 亚洲精品国产综合区久久久久久久 | 伊人网综合在线 | 精品一区免费 | 在线成人| 亚洲国产欧美一区 | 日韩福利在线观看 | 国产免费视频 | 婷婷丁香在线视频 | 亚洲毛片一区二区 | 久久激情视频 | 久久国产区 | 天天色影视综合 | 99免费在线| 99精品久久久国产一区二区三 | 日本三级播放 | 国产午夜精品一区二区三区嫩草 | 日韩精品专区在线影院重磅 | 欧洲亚洲视频 | 日韩在线电影 | 国产精品美女一区二区三区 | 69电影网 | 美女爽到呻吟久久久久 | 欧美日韩在线精品 | 欧美一区在线视频 | 国产福利在线视频 | 国产午夜亚洲精品不卡 | 日韩有码一区二区三区 | 亚洲精品一二三区 | 日本粉嫩一区二区三区视频 | 日本超碰 | 成人亚洲综合 | 99精品视频免费在线观看 | 成人性视频免费网站 | 女同videos另类 | 日韩精品一区二区三区老鸭窝 | 91看片视频 | 91视频大全 |