最新在開發oled屏驅動,需要用到i2c匯流排,下面大體上講解一下i2c裝置的除錯及波形分析,為大家做一些參考,由於剛涉及這部分內容,因此有什麼錯誤的,還請賜教~
一、概要
i2c匯流排只需要兩條線,一條sda資料線,一條scl時鐘線;根據這兩條線的高低電平、上公升沿、下降沿就可以實現主機與i2c裝置的通訊;其中有:
(1)i2c匯流排相關
傳輸開始條件:scl處於高電平,sda下降沿時;
傳輸接收條件:scl處於高電平,sda上公升沿時;
傳輸資料:開始傳輸後,scl處於高電平時,sda的資料為所傳輸的資料;
回應:當傳輸完乙個位元組後,i2c裝置需要回應乙個ack,這樣主機才繼續傳送;因此回應訊號是在傳輸完8bit後的下乙個資料位(sda值),當sda為0表示有回應,為1表示沒回應;
正常i2c匯流排的資料是:start + i2c devece id + r/w + ack + data(first byte)+ ack + ... + data(n)+ ack + stop
(2)i2c裝置相關
暫存器reg:一般的i2c裝置晶元都有帶reg,一般在傳輸正式的資料之前需要先傳輸reg位址,比如我的oled來說,在傳控制命令時需要先傳送0x00的reg位址,在傳輸資料時需要傳送0x40的reg位址;
二、除錯及波形分析
一般當我們拿到乙個i2c裝置時,就必須涉及到驅動的編寫,就比如對於oled來說,就要用編寫oled驅動,這樣我們才能控制它,對於oled屏來說,第一步也是最重要的一步就是點亮它;當我們做完這一步,那後面剩下的就只是細節問題了;」萬事開頭難「,這句話真的不假,對於oled來說,如何才能點亮,我們該怎麼除錯呢?當我們寫完oled驅動,但oled屏還是不亮,可能問題會出現在哪?是硬體問題還是軟體問題?;若為軟體問題,那會是i2c匯流排驅動問題,還是我們i2c裝置驅動有問題?那麼我們該如何判斷問題出現位置呢?這就需要我們對i2c匯流排上的資料進行分析;那麼下面我將詳細講述如何獲取和分析i2c匯流排上的資料;
(1)示波器
對於i2c匯流排的資料,我們要用到示波器,這樣我們才能抓取到訊號,而且必須同時採集sda和scl的資料;該如何抓取呢?我這邊的方式是將示波器調成邊下降沿觸發模式(因為開始訊號是sda下降沿),並且設定成單次模式(這樣抓取完一次就會stop,便於我們資料分析);
(2)波形
由於我的oled裝置的位址是0x78(8位),而第一次我必須將oled設定成off狀態,通過命令表可以查到,必須發生0xae,而剛剛有講到在傳送命令前必須先傳送暫存器reg位址,即0x00;於是我傳送的資料為0x78+0x00+0xae;下面是我用示波器抓取到的波形:
分析(其中黃色的為sda訊號,淺藍色為scl訊號):從上述波形中我們可以讀取到資料依次是:01111000 0 00000000 101011100;即:0111100(7位oled裝置位址) + 0( 讀寫為,0為寫,1為讀)+0(ack回應)+00000000(暫存器reg)+ 10101110(0xae oled off命令);(這裡還有一點我還沒弄明白就是reg後沒有回應,還望大家不吝賜教)
下面當我來隨便傳送乙個位址時,比如當我傳送0x56(8位位址),測到的波形如下:
分析:從波形可看出資料依次為:010101101 即0101011(裝置位址)+0(讀寫位)+1(nack無應答),由於沒有相應的i2c裝置因此無應答ack訊號,於是就停止傳輸;
三、總結
由以上可知,可以通過檢視i2c匯流排資料來確認跟蹤i2c裝置,已更好地確定是軟體問題還是硬體問題;
i2c裝置驅動
1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...
i2c除錯記錄
i2c簡單時序關係 平時clk sda都為高電平 當clk為高,sda發生一次下降沿,觸發開始訊號 然後由clk的高電平期間取樣 sda資料,在clk高時候需要保持sda 先傳送7位位址和一位讀寫標誌 所以i2c位址一般是7位的 然後接收端回乙個ack 然後傳送8位reg位址,回乙個ack 然後就是...
I2C裝置驅動流程
一 i2c裝置 驅動流程 1 i2c register board info 定義i2c 器件資訊 name,address,etc.static struct i2c board info initdata pi2c board info i2c register board info 1,arr...