I2C與OV9650的問題


轉:http://www.likeint.com/news_show.asp?id=1319&SonID=139

 

之前做攝像頭方面的測試,現在寫一些總結:

原計划使用I2C接OV9650的SCCB接口,SDA接SIO_D,CLK接SIO_C口,由於SCCB和I2C標准協議類似,就可以用標准的I2C協議中的函數直接對OV9650中的寄存器進行配置,比較簡單。就沒有考慮其他的內容,后來發現這個思路行不通。

把攝像頭接到I2C總線上后,就使用Iprobe命令探測I2C設備,結果沒有發現攝像頭,然后用示波器檢測各個引腳的電壓,發現電壓均正常,但是沒有時鍾輸入信號,后來查閱手冊,發現攝像頭的時鍾由CSI控制,在CSI的寄存器中,有一位專門負責打開與關閉輸出時鍾,默認情況下,設置為關閉,將這一位設置為打開。然后用Iprobe命令探測,結果出現了攝像頭的設備號,為30。

然后用I2C的讀寫命令操作攝像頭的寄存器,結果失敗,經過幾天的網上搜索,原來是SCCB與I2C標准協議有微小的差別,就是這個微小的差別,導致不能用標准的I2C協議讀寫OV9650的寄存器。

差別如下:

OV79650控制采用SCCB(SeriaI Camera ControlBus)協議。SCCB是簡化I2C協議,SIO-l是串行時鍾輸入線,SIO-O是串行雙向數據線,分別相當於I2C協議SCL和SDA。SCCB總線時序與I2C基本相同,它響應信號ACK被稱為一個傳輸單元第9位,分為Don’t care和NA。Don’t care位由從機產生;NA位由主機產生,由於SCCB不支持多字節讀寫,NA位必須為高電平。另外,SCCB沒有重復起始概念,因此在SCCB讀周期中,當主機發送完片內寄存器地址后,必須發送總線停止條件。不然在發送讀命令時,從機將不能產生Don’t care響應信號。 
由於I2C和SCCB一些細微差別,所以采用GPIO模擬SCCB總線方式。SCL所連接引腳始終設為輸出方式,而SDA所連接引腳在數據傳輸過程中,通過設置IODIR值,動態改變引腳輸入/輸出方式。SCCB寫周期直接使用I2C總線協議寫周期時序;而SC-CB讀周期,則增加一個。

另外,SCCB的地址位為8位,即第60,61分別為讀寫位,但I2C協議地址為7位,所以檢索到的地址是30。

網上大部分采用GPIO模擬I2C協議,由於使用標准的I2C協議行不通,只好換用GPIO模擬I2C協議。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM