簡要講解OV7725攝像頭

本文主要包含以下幾部分內容:

??1. 通過OV7725分析模塊原理圖。

??2. 講解部分寄存器的含義、RGB565格式圖像輸出時序、幀率計算。

??3. 講解SCCB協議與I2C協議的區別。

1、OV7725功能

??OV7725是一款1/4英寸單芯片圖像傳感器,其感光陣列達到640*480,能實現最快 60fps 分辨率的圖像采集。傳感器內部集成了圖像處理功能,包括自動曝光控制(AEC)、自動增益控制(AGC)和自動白平衡(AWB)等。同時傳感器具有較高的感光靈敏度,適合低照度的應用,下圖為OV7725的功能框圖。

在這里插入圖片描述

圖1 OV7725 功能框圖

??感光陣列(image array)在XCLK時鐘的驅動下進行圖像采樣,輸出640*480陣列的模擬數據;接著模擬信號處理器在時序發生器(video timing generator)的控制下對模擬數據進行算法處理(analog processing)。

??模擬數據處理完成后分成 G(綠色)、 R(紅色)、B(藍色)三路通道經過AD轉換器后轉換成數字信號,并且通過DSP進行相關圖像處理,最終輸出所配置格式的10位視頻數據流,如果需要使用RGB565格式輸出,那么只有高8位的數據有效。

??其中測試模塊(test pattern generator)是用來進行彩條測試之類的,可以通過配置寄存器來啟用這個模式,測試數據通路。

??模擬信號處理以及DSP等都可以通過寄存器(registers)來配置,配置寄存器的接口就是SCCB接口,該接口協議是閹割版的I2C協議。

??下表是OV7725的管腳含義的介紹,沒有列出電源和接地相關引腳。

表1 OV7725引腳含義
管腳I/O含義
PWDNI掉電模式,0:正常模式,1:掉電模式。
RSTBI系統復位,低電平有效。
VREFHI參考電壓,通過0.1uF電容接地。
VREFNI參考電壓,通過0.1uF電容接地。
FSINI幀同步輸入。
VSYNCO場同步輸出。
HREFO像素有效指示信號。
XCLKI系統時鐘輸入。
PCLKO像素時鐘輸出。
SCLISCCB接口時鐘輸入。
SDAI/OSCCB接口雙向數據線。
D0~D9O十位像素數據輸出,D[9:2]用于8位YUV或RGB 565/RGB 555格式。

??下圖是OV7725模塊的原理圖,其中RESET引腳通過4.3K電阻上拉到VCC,并且通過一個0.1uF電容降低抖動。而PWDN引腳通過4.3K電阻下拉到地。也就是說該模塊沒有掉電模式和復位操作。

??其余的XCLK、PCLK、VSYNC、HREF、D9~D0均引出,XCLK是需要外部提供給OV7725的系統時鐘,該時鐘輸入OV7725之后,可以經過內部鎖相環和寄存器配置生成PCLK,然后像素數據D9~D0在PCLK的下降沿輸出數據,FPGA就可以在PCLK上升沿采集D9~D0的數據。場同步VSYNC的高電平表示傳輸一幀數據,HREF位高電平時表示D9~D0的數據有效。

??而OV7725內部鎖相環的倍頻系數、輸出像素的大小、自動曝光、自動增益等都可以通過SCCB接口進行配置。

在這里插入圖片描述

圖2 OV7725原理圖

??最終多數模塊引出的引腳如下所示,由于大多使用RGB565格式輸出數據,因此像素信號只需要輸出D9~D28位即可。CMOS_CTL這些保留信號暫時不考慮。

在這里插入圖片描述

圖3 OV7725引出引腳

2、寄存器

??OV7725內部包含171個寄存器,每個寄存器有8位數據,寄存器的數目還是比較多的。而且很多寄存器與圖像有關,對于我們不是專業研究圖像的人來說,并不能很好的理解這些參數。本文只簡單分析幾個會經常用到的寄存器,如果需要其余寄存器可以通過數據手冊自己查看。

??地址為0x12寄存器,該寄存器的bit7為1時,復位所有寄存器,發出該命令后,需要至少延遲1ms才能配置其余寄存器。

在這里插入圖片描述

圖4 復位寄存器

??而bit1~0用于選擇圖像輸出格式,為2’b00時輸出YUV格式,為2’b01時輸出Processed Bayer RAW格式,為2’b10時輸出RGB格式,為2’b11時輸出Bayer RAW格式。

??當輸出RGB格式時,需要通過bit3~2確定具體的RGB格式,2’b00輸出RGB422,2‘b01輸出RGB565,2’b10輸出RGB555,2’b11輸出RGB444格式的圖像數據。

??OV7725的XCLK生成PCLK的頻率公式為:finternal clock = finput clock × PLL multiplier / [(CLKRC[5:0] + 1) × 2]。其中finternal clock為PCLK頻率,finput clock為XCLK的頻率。

在這里插入圖片描述

圖5 鎖相環倍頻設置

??PLL multiplier由地址為0x0D寄存器的bit7和bit6決定。如果為2’b00則PLL multiplier為1,如果為2’b01則PLL multiplier為4,如果為2’b10則PLL multiplier為6,如果為2’b11則PLL multiplier為8。

??CLKRC[5:0]是地址為0x11寄存器的低6位數據,如果輸入XCLK為12MHz,PLL 倍頻設為4倍,CLKRC[5:0]設置為0,則可以得到PCLK為24MHz。

在這里插入圖片描述

圖6 分頻系數設置

??如何設置輸出圖像尺寸呢?

??首先可以通過地址為0x18的bit7~0和0x32的bit1~0設置輸出圖像數據的水平像素個數。由于OV7725水平像素最大支持640,所以需要10位二進制數據才能表示,一個寄存器只有8位數據,需要兩個寄存器才能存儲10位數據。

在這里插入圖片描述

圖7 輸出圖像分辨率設置

??地址為0x1A的bit7~0和0x32的bit2設置輸出圖像數據的垂直像素點個數,OV7725垂直像素最大支持480,需要9位二進制數據才能表示,因此需要兩個寄存器進行存儲。

??其余寄存器還有很多,這里就簡要介紹這幾個重要的,其余的可以通過官方通過的初始化參數進行設置。

3、RGB565格式

??OV7725輸出RGB565格式的圖像數據時序如下圖所示,由于數據線只有8位,而每個像素點包含16位數據,因此需要兩個PCLK時鐘才能輸出1個像素數據。

??第一PCLK時鐘下降沿輸出5位紅色像素和3位綠色像素數據,第二個PCLK時鐘下降沿輸出3位綠色像素和5位藍色像素數據,兩個時鐘傳輸的數據拼接為一個像素點的數據。

??由于OV7725在PCLK下降沿輸出數據,那么FPGA就可以在PCLK的上升沿采集數據線D[9:2]上的數據。

在這里插入圖片描述

圖8 RGB565時序

??下圖是VGA輸出640*480像素的時序圖,本次使用的是HREF信號,沒有使用HSYNC信號。注意下圖中tp表示傳輸1個像素數據的時鐘,經過上述分析可知,在傳輸RGB565格式的數據時tp=2*PCLK。

在這里插入圖片描述

圖9 VGA格式

??HREF信號為高電平表示D[9:2]傳輸的數據是有效的,每次連續輸出1行像素數據,因此上圖中HREF信號每次拉高時間為640tp。由于顯示前沿、后沿等東西的存在,每次傳輸完一行圖像數據之后,需要拉低144tp才能在次傳輸下一行圖像數據。因此傳輸一行數據的時間為640tp+144tp=784tp,將傳輸一行數據消耗的時間稱為tLINE,因此tLINE=784tp。

??場同步信號VSYNC拉高表示一幀數據傳輸的開始,因為顯示前沿、后沿這些東西的存在,需要等一段時間HREF才會拉高輸出有效像素數據。傳輸一幀圖像數據需要510tLINE。

因此可以計算出傳輸一幀圖像數據所需要的時鐘個數為510tLINE=510*784tp=510*784*2*tpclk=799680*tpclk。

??當PCLK時鐘頻率為24MHz時,則幀率為24M/799680≈30.012Hz,所以說當PCLK為24MHz時,每秒可以輸出30張圖片。PCLK為48MHz時,可以輸出60幀的圖像數據。

??下圖是時鐘和復位的一些說明,PCLK最小為10MHz,最大為48MHz,即最大支持60幀640*480的圖像輸出。當復位后,需要等待1ms,配置寄存器之后,需要等待10幀數據輸出的時間,輸出的圖像數據才會穩定。

在這里插入圖片描述

圖10 頻率限制

??一般最常用的就是RGB565格式,關于RGB565格式本文就介紹這么多,該接口常被稱為DVP接口,后文直接使用FPGA實現數據采集。

4、SCCB時序

??最后在講解一下SCCB(Serial Camera Control Bus)協議的相關內容,該協議是OmniVision公司參考I2C協議為自家的圖像傳感器提出的接口協議。可以通過百度直接獲取手冊,據說廠家這么做是為了規避 I2C 總線的版權,手冊里關于協議的描述采用三相寫、兩相寫來對讀寫時序進行描述,搞得反而不好理解。

??一般有三線和兩線的兩種連接方式,一般的傳感器為了節省引腳,都將SCCB_E直接拉高處理了,只引出了SIO_C和SIO_D兩個引腳。

在這里插入圖片描述

圖11 三線制應用模式

在這里插入圖片描述

圖12 兩線制應用模式

??下面是SCCB的寫時序,與I2C的寫時序基本一致,首先發送器件地址,然后發送寄存器地址,最后發送寫入數據,OV7725的器件地址為7’h21

??需要注意SCCB的應答位為X,表示不應答,含義就是從機可能不會對主機的指令做出應答,但是這段時間主機依舊要釋放總線。即主機不需要檢測從機是否應答,只需要傳輸對應的數據即可。

在這里插入圖片描述

圖13 SCCB寫時序

??因此SCCB的寫時序可以直接使用I2C的寫時序,不用關心輸出的應答信號即可。

??下圖是SCCB的讀時序,區別在于虛寫完成時,由于SCCB沒有重復起始位的功能,必須先發送停止位,之后才能發送起始位進行讀操作。

在這里插入圖片描述

圖14 SCCB讀時序

??因此I2C和SCCB協議有兩個區別,第一SCCB的從機可能不會應答主機,主機也不需要去檢測從機的應答位。第二就是SCCB在讀操作時,發送完虛寫之后,需要發送停止位,才能發送起始位讀出數據。第三SCCB不支持連續地址讀、寫操作。

??對于OV7725來說,一般只會通過寫操作來配置其寄存器,不會使用讀操作。因此在初始化OV7725寄存器時,完全可以使用I2C協議代替SCCB協議,因為不會使用讀操作,所以不需要修改I2C讀時序。

??其余起始位、停止位均與I2C時序一致,可以查看前文I2C協議的詳解。

??最后注意有的原理圖上SDA數據線上可能會串接電阻,這是為了在主機和從機爭奪總線時,減小總線電流。

??如下圖所示,當主機輸出高電平,從機輸出低電平時,電流會從主機的VCC通過電阻直接到從機的GND,如果沒有電阻,由于MOS管導通電阻一般很小,可能導致電流很大,燒毀器件吧。

在這里插入圖片描述

圖15 串接電阻

??下圖是SCCB接口時序,為了了解相關時序參數,需要查看該圖。

在這里插入圖片描述

圖16 SCCB時序

??上圖配合下表即可得知OV7725對SCCB協議相關要求,首先得知SCL最大頻率為400KHz,沒有最低頻率的要求。

??由于SCL頻率較低,且數據均在SCL低電平的時候傳輸,所以數據相關的建立時間和保持時間一般是不會出現問題的。

??由于使用FPGA,兩次讀、寫操作的間隔時間可以達到系統時鐘周期的(10ns)級別,所以需要關注一些OV7725對于兩次SCCB操作的間隔時間要求。tBUF在上圖可以看出是停止位和起始位之間的間隔,下表規定該時間必須大于1.3us。

在這里插入圖片描述

圖17 SCCB時序參數

??前文寫I2C時序代碼時,起始位和停止位間隔時間大致是半個SCL周期,如果SCL為200KHz,那么半個SCL周期時間為2.5us,大于1.3us,不需要額外增加延時,當模塊空閑即可開始下一次讀寫操作。

??如果SCL頻率為400KHz,半個SCL周期時間為1.25us,小于1.3us,可能需要增加額外延時。此處是針對我前文寫的I2C模塊進行分析的,如果不使用該模塊可以忽略。

??本文相關內容到此結束了,需要SCCB手冊或者OV7725手冊的在后臺恢復“OV7725手冊“(不包括引號)即可。建議看I2C手冊,描述比SCCB簡單多了,SCCB手冊繞了一大圈,還是講的相同問題。


??如果對文章內容理解有疑惑或者對代碼不理解,可以在評論區或者后臺留言,看到后均會回復!

??如果本文對您有幫助,還請多多點贊👍、評論💬和收藏?!您的支持是我更新的最大動力!將持續更新工程!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LibreOJ 137. 最小瓶頸路(加強版) 題解 Kruscal重構樹 ST表

聲明:本題目是LibreOJ 136. 最小瓶頸路 題解 最小生成樹 倍增加強版,建議先學習簡單版的做法。 題目鏈接:LibreOJ 137. 最小瓶頸路(加強版) 題目描述: 給定一張無向圖,詢問兩個結點之間的最小瓶…

【MySQL 系列】在 Windows 上安裝 MySQL

在 Windows 平臺上安裝 MySQL 很簡單,并不需要太復雜的步驟。按照本文的步驟操練起來就可以了。 文章目錄 1、下載 MySQL 安裝程序2、安裝 MySQL 數據庫2.1、選擇安裝類型2.2、檢查所需組件2.3、安裝所選產品組件2.4、產品配置2.5、配置高可用性2.6、配置服務器類型…

【leetcode】 劍指 Offer學習計劃(java版本含注釋)(下)

目錄 前言第十六天(排序)劍指 Offer 45. 把數組排成最小的數(中等)劍指 Offer 61. 撲克牌中的順子(簡單) 第十七天(排序)劍指 Offer 40. 最小的k個數(簡單) 第…

c++11多線程:call_once

文章目錄 call_once示例一示例二 call_once std::call_once是 C11 標準庫中的一個函數,用于確保某個函數只會被調用一次。 單例設計模式是一種常見的設計模式,用于確保某個類只能創建一個實例。由于單例實例是全局唯一的,因此在多線程環境中…

YOLO系列中的“data.yaml”詳解!

專欄介紹:YOLOv9改進系列 | 包含深度學習最新創新,主力高效漲點!!! 一、data.yaml介紹 YOLO系列中的data.yaml文件包含了YOLO系列模型運行所需要的數據集路徑、數據集中的類別數及標簽。數據集路徑可以用絕對路徑也可以…

Python實現股票信息查詢

目前兩個常用的股票信息CPI: 騰訊行情CTPAPI接口源碼 新浪行情CTPAPI 使用requests模塊爬取股票信息,這里以查詢股票市值為例。 一、根據股票名稱查詢股票代碼 在python文件夾下設置兩個表格GPLIST.xlsx,其中是A股全部代碼和股票名稱&#…

如何在飛書接入ChatGPT并結合內網穿透實現公網遠程訪問智能AI助手

文章目錄 前言環境列表1.飛書設置2.克隆feishu-chatgpt項目3.配置config.yaml文件4.運行feishu-chatgpt項目5.安裝cpolar內網穿透6.固定公網地址7.機器人權限配置8.創建版本9.創建測試企業10. 機器人測試 前言 在飛書中創建chatGPT機器人并且對話,在下面操作步驟中…

MySQL 高可用解決方案(雙主雙從)

1.環境說明 操作系統:centos7.7 主服務器:node2(192.168.1.102) 從服務器:node3(192.168.1.103) keepalived中虛擬ip(VIP):192.168.1.100 2.準備事項 主庫和從庫數據庫的版本一致把主庫的數據同步給從庫一份 #對主庫進行全局讀鎖定 FLUSH…

GEE代碼條帶問題——sentinel-1接縫處理的問題

問題 我有興趣確定 NDVI 損失最大的年份。我創建了一個函數來收集所有陸地衛星圖像并應用預處理。當我導出結果以識別 NDVI 損失最大年份時,生成的數據產品與陸地衛星場景足跡有可怕的接縫線。造成這種情況的原因是什么以及如何調整代碼? sentinel1數據…

flutter之終極報錯

看到這個報錯頭都大了 一開始在網上各種搜搜,然后有人說是flutter版本的問題,改完版本之后還是不對,又是各種搜搜搜 有人說是環境變量的問題,后來改了環境變量,媽的,竟然還不行,想砸電腦的心都…

Xcode :Could not build module ‘WebKit‘ 已驗證解決

問題&#xff1a;Could not build module WebKit 具體報錯如下&#xff1a; error: type argument nw_proxy_config_t (aka struct nw_proxy_config *) is neither an Objective-C object nor a block type property (nullable, nonatomic, copy) NSArray<nw_proxy_config_…

C++學習筆記:set和map

set和map set什么是setset的使用 關聯式容器鍵值對 map什么是mapmap的使用map的插入方式常用功能map[] 的靈活使用 set 什么是set set是STL中一個底層為二叉搜索樹來實現的容器 若要使用set需要包含頭文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…

【java-面試題】start和run的區別

【java-面試題】start和run的區別 在run方法內部&#xff0c;只是單純的描述了該線程要執行的內容。run方法是線程的入口。 在start方法內部&#xff0c;會調用到系統api&#xff0c;從而在系統內核中創建出線程&#xff0c;創建線程后&#xff0c;再自動調用run方法。 在代碼…

掌握未來技術:一站式深度學習學習平臺體驗!

介紹&#xff1a;深度學習是機器學習的一個子領域&#xff0c;它模仿人腦的分析和學習能力&#xff0c;通過構建和訓練多層神經網絡來學習數據的內在規律和表示層次。 深度學習的核心在于能夠自動學習數據中的高層次特征&#xff0c;而無需人工進行復雜的特征工程。這種方法在圖…

大模型筆記:RAG(Retrieval Augmented Generation,檢索增強生成)

1 大模型知識更新的困境 大模型的知識更新是很困難的&#xff0c;主要原因在于&#xff1a; 訓練數據集固定,一旦訓練完成就很難再通過繼續訓練來更新其知識參數量巨大,隨時進行fine-tuning需要消耗大量的資源&#xff0c;并且需要相當長的時間LLM的知識是編碼在數百億個參數中…

格式規范性知識的探究式學習

對于格式規范性這種規定性的知識&#xff0c;可以采用“增刪改”的方式進行控究式學習。 #include<stdio.h>int main(){printf("%.1f\n", 8.0/5.0);return 0;} 這個printf語句分兩部分&#xff0c;本身的功能就是格式化輸出&#xff0c;因此參數完全是格式化…

一些C語言知識

C語言的內置類型&#xff1a; char short int long float double C99中引入了bool類型&#xff0c;用來表示真假的變量類型&#xff0c;包含true&#xff0c;false。 這個代碼的執行結果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

STM32(5) GPIO(2)輸出

1.點亮LED 1.1 推挽接法和開漏接法 要想點亮LED&#xff0c;有兩種接法 推挽接法&#xff1a; 向寄存器寫1&#xff0c;引腳輸出高電平&#xff0c;LED點亮&#xff1b;向寄存器寫0&#xff0c;引腳輸出低電平&#xff0c;LED熄滅。 開漏接法&#xff1a; 向寄存器寫0&…

Kubernetes operator 前置知識篇

云原生學習路線導航頁&#xff08;持續更新中&#xff09; 本文是 Kubernetes operator學習 系列的前置知識篇&#xff0c;幫助大家對 Operator 進行初步了解Kubernetes operator學習系列 快捷鏈接 Kubernetes operator 前置知識篇Kubernetes operator&#xff08;一&#xff0…

《精益DevOps》:填補IT服務交付的認知差距,實現高效可靠的客戶期望滿足

寫在前面 在當今的商業環境中&#xff0c;IT服務交付已經成為企業成功的關鍵因素之一。然而&#xff0c;實現高效、可靠、安全且符合客戶期望的IT服務交付卻是一項艱巨的任務。這要求服務提供商不僅具備先進的技術能力&#xff0c;還需要擁有出色的組織協作、流程管理和態勢感…