sccb
(seriai camera controlbus)
是簡化的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是和i2c相同的乙個協議。 sio_c和sio_d分別為sccb匯流排的時鐘線和資料線。目前,sccb匯流排通訊協議只支援100kb/s或400kb/s的傳輸速度,並且支援兩種位址形式:①從裝置位址(id address,8bit),分為讀位址和寫位址,高7位用於選中晶元, 第0位是讀/寫控制位(r/w),決定是對該晶元進行讀或寫操作;②內部暫存器單元位址(sub_ address,8bit),用於決定對內部的哪個暫存器單元進行操作,通常還支援位址單元連續的多位元組順序讀寫操作。sccb控制匯流排功能的實現完全是依靠sio_c、sio_d兩條匯流排上電平的狀態以及兩者之間的相互配合實現的。sccb匯流排傳輸的啟動和停止條件如圖
過程:採用簡單的三相(phase)寫資料的方式,即在寫暫存器的過程中先傳送ov7649的id位址(id address),然後傳送寫資料的目地暫存器位址(sub_address),最後傳送要寫入的資料(write data),見圖3。如果給連續的暫存器寫資料,寫完乙個暫存器後,ov7649會自動把暫存器位址加1,程式可繼續向下寫,而不需要再次輸入id位址,從而三相寫資料變為了兩相寫資料,由於本系統只需對有限個不連續暫存器進行配置,如果採用對全部暫存器都加以配置這一方法的話,會浪費很多時間和資源,所以我們只對需要更改資料的暫存器進行寫資料。對於每乙個需更改的暫存器,都採用三相寫資料的方法。
/**********************************/
之前做攝像頭方面的測試,現在寫一些總結:
原計畫使用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協議。
i2c匯流排時序
一心想踏入linux device driver的世界,想著i2c匯流排相對於usb等其他匯流排較為簡單,就以i2c作為切入點,希望可以逐步理解ldd的設計思想,並能理解其裝置模型的概念。在此對近期於i2c匯流排及驅動原始碼的理解做備忘,以免徒勞。平台友善之臂s70 tiny6410 cpusams...
I2C匯流排死鎖
原文 現象 最近發現訪問i2c裝置時,主裝置復位可能會引起i2c死鎖,表現為scl為高,sda一直為低,後發現是從裝置拉死i2c匯流排,從裝置斷電之後,sda變高,上電後通訊正常。後來通過拉低scl訊號線,sda就會自動變成高電平,i2c匯流排恢復。原因 在正常情況下,i2c匯流排協議能夠保證匯流排...
I 2C匯流排簡介
總共有五種工作狀態 a 匯流排非忙狀態 該狀態時資料線 sda 和時鐘線 scl 都保持高電平。b 啟動狀態 當時鐘線 scl 為高電平狀態時,資料線 sda 由高電平變為低電平的下降沿被認為是 啟動 訊號。c 停止狀態 當時鐘線 scl 為高電平狀態時,資料線 sda 由低電平變為高電平的下降沿被...