本文主要包含以下幾部分內容:
??1. 通過OV7725分析模塊原理圖。
??2. 講解部分寄存器的含義、RGB565格式圖像輸出時序、幀率計算。
??3. 講解SCCB協議與I2C協議的區別。
1、OV7725功能
??OV7725是一款1/4英寸單芯片圖像傳感器,其感光陣列達到640*480,能實現最快 60fps 分辨率的圖像采集。傳感器內部集成了圖像處理功能,包括自動曝光控制(AEC)、自動增益控制(AGC)和自動白平衡(AWB)等。同時傳感器具有較高的感光靈敏度,適合低照度的應用,下圖為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的管腳含義的介紹,沒有列出電源和接地相關引腳。
管腳 | I/O | 含義 |
---|---|---|
PWDN | I | 掉電模式,0:正常模式,1:掉電模式。 |
RSTB | I | 系統復位,低電平有效。 |
VREFH | I | 參考電壓,通過0.1uF電容接地。 |
VREFN | I | 參考電壓,通過0.1uF電容接地。 |
FSIN | I | 幀同步輸入。 |
VSYNC | O | 場同步輸出。 |
HREF | O | 像素有效指示信號。 |
XCLK | I | 系統時鐘輸入。 |
PCLK | O | 像素時鐘輸出。 |
SCL | I | SCCB接口時鐘輸入。 |
SDA | I/O | SCCB接口雙向數據線。 |
D0~D9 | O | 十位像素數據輸出,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接口進行配置。
??最終多數模塊引出的引腳如下所示,由于大多使用RGB565格式輸出數據,因此像素信號只需要輸出D9~D28位即可。CMOS_CTL這些保留信號暫時不考慮。
2、寄存器
??OV7725內部包含171個寄存器,每個寄存器有8位數據,寄存器的數目還是比較多的。而且很多寄存器與圖像有關,對于我們不是專業研究圖像的人來說,并不能很好的理解這些參數。本文只簡單分析幾個會經常用到的寄存器,如果需要其余寄存器可以通過數據手冊自己查看。
??地址為0x12寄存器,該寄存器的bit7為1時,復位所有寄存器,發出該命令后,需要至少延遲1ms才能配置其余寄存器。
??而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的頻率。
??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。
??如何設置輸出圖像尺寸呢?
??首先可以通過地址為0x18的bit7~0和0x32的bit1~0設置輸出圖像數據的水平像素個數。由于OV7725水平像素最大支持640,所以需要10位二進制數據才能表示,一個寄存器只有8位數據,需要兩個寄存器才能存儲10位數據。
??地址為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]上的數據。
??下圖是VGA輸出640*480像素的時序圖,本次使用的是HREF信號,沒有使用HSYNC信號。注意下圖中tp表示傳輸1個像素數據的時鐘,經過上述分析可知,在傳輸RGB565格式的數據時tp=2*PCLK。
??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幀數據輸出的時間,輸出的圖像數據才會穩定。
??一般最常用的就是RGB565格式,關于RGB565格式本文就介紹這么多,該接口常被稱為DVP接口,后文直接使用FPGA實現數據采集。
4、SCCB時序
??最后在講解一下SCCB(Serial Camera Control Bus)協議的相關內容,該協議是OmniVision公司參考I2C協議為自家的圖像傳感器提出的接口協議。可以通過百度直接獲取手冊,據說廠家這么做是為了規避 I2C 總線的版權,手冊里關于協議的描述采用三相寫、兩相寫來對讀寫時序進行描述,搞得反而不好理解。
??一般有三線和兩線的兩種連接方式,一般的傳感器為了節省引腳,都將SCCB_E直接拉高處理了,只引出了SIO_C和SIO_D兩個引腳。
??下面是SCCB的寫時序,與I2C的寫時序基本一致,首先發送器件地址,然后發送寄存器地址,最后發送寫入數據,OV7725的器件地址為7’h21。
??需要注意SCCB的應答位為X,表示不應答,含義就是從機可能不會對主機的指令做出應答,但是這段時間主機依舊要釋放總線。即主機不需要檢測從機是否應答,只需要傳輸對應的數據即可。
??因此SCCB的寫時序可以直接使用I2C的寫時序,不用關心輸出的應答信號即可。
??下圖是SCCB的讀時序,區別在于虛寫完成時,由于SCCB沒有重復起始位的功能,必須先發送停止位,之后才能發送起始位進行讀操作。
??因此I2C和SCCB協議有兩個區別,第一SCCB的從機可能不會應答主機,主機也不需要去檢測從機的應答位。第二就是SCCB在讀操作時,發送完虛寫之后,需要發送停止位,才能發送起始位讀出數據。第三SCCB不支持連續地址讀、寫操作。
??對于OV7725來說,一般只會通過寫操作來配置其寄存器,不會使用讀操作。因此在初始化OV7725寄存器時,完全可以使用I2C協議代替SCCB協議,因為不會使用讀操作,所以不需要修改I2C讀時序。
??其余起始位、停止位均與I2C時序一致,可以查看前文I2C協議的詳解。
??最后注意有的原理圖上SDA數據線上可能會串接電阻,這是為了在主機和從機爭奪總線時,減小總線電流。
??如下圖所示,當主機輸出高電平,從機輸出低電平時,電流會從主機的VCC通過電阻直接到從機的GND,如果沒有電阻,由于MOS管導通電阻一般很小,可能導致電流很大,燒毀器件吧。
??下圖是SCCB接口時序,為了了解相關時序參數,需要查看該圖。
??上圖配合下表即可得知OV7725對SCCB協議相關要求,首先得知SCL最大頻率為400KHz,沒有最低頻率的要求。
??由于SCL頻率較低,且數據均在SCL低電平的時候傳輸,所以數據相關的建立時間和保持時間一般是不會出現問題的。
??由于使用FPGA,兩次讀、寫操作的間隔時間可以達到系統時鐘周期的(10ns)級別,所以需要關注一些OV7725對于兩次SCCB操作的間隔時間要求。tBUF在上圖可以看出是停止位和起始位之間的間隔,下表規定該時間必須大于1.3us。
??前文寫I2C時序代碼時,起始位和停止位間隔時間大致是半個SCL周期,如果SCL為200KHz,那么半個SCL周期時間為2.5us,大于1.3us,不需要額外增加延時,當模塊空閑即可開始下一次讀寫操作。
??如果SCL頻率為400KHz,半個SCL周期時間為1.25us,小于1.3us,可能需要增加額外延時。此處是針對我前文寫的I2C模塊進行分析的,如果不使用該模塊可以忽略。
??本文相關內容到此結束了,需要SCCB手冊或者OV7725手冊的在后臺恢復“OV7725手冊“(不包括引號)即可。建議看I2C手冊,描述比SCCB簡單多了,SCCB手冊繞了一大圈,還是講的相同問題。
??如果對文章內容理解有疑惑或者對代碼不理解,可以在評論區或者后臺留言,看到后均會回復!
??如果本文對您有幫助,還請多多點贊👍、評論💬和收藏?!您的支持是我更新的最大動力!將持續更新工程!