I2C裝置調試及波形分析

來源:互聯網
上載者:User

i2c spec :

The Acknowledge signal is defined as follows: the transmitter releases the SDA line (Wei: put SDA at 1 state) 
during the acknowledge clock pulse so the receiver can pull the SDA line LOW and it 
remains stable LOW during the HIGH period of this clock pulse  (Wei: if the high of clock is hold on, SDA is kept at LOW!! )(see Figure 4). Set-up and 
hold times (specified in Section 6) must also be taken into account.
When SDA remains HIGH during this ninth clock pulse, this is defined as the Not 
Acknowledge signal.

我的波形:
80C51,NAK波形。
When SDA remains HIGH during this ninth clock pulse, this is defined as the Not 
Acknowledge signal.


http://blog.csdn.net/smallmuou/article/details/7183656

I2C裝置調試及波形分析

最新在開發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裝置相關

裝置地址:有7位和10位兩種,具體見I2C裝置晶片的DataSheet,由於目前用到的是7位,因此下面主要針對7位講述;在講I2C裝置地址是有可能有兩種說法,主要是用8位表示還是用7為表示,比如對於我的OLED來說,當用8位表示時則為0x78地址,當用7位時則為0x3c(即0x78右移1為),在驅動中用0x78還是用0x3c要看具體平台的I2C匯流排驅動,我在AMLOGIC平台上用的是0x78,而在MV平台上用的是0x3c;

寄存器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裝置,已更好地確定是軟體問題還是硬體問題;

http://blog.csdn.net/huzgd/article/details/6187056

用示波器對單片機I2C時序進行圖形波形分析的實驗小結

I2C的概念原理網上都有就不說了,這裡只把我把兩個開發板通過I2C通訊的調試經驗記錄分享一下。

 

I2C要求要有一個主裝置,負責發起請求和控制時鐘;其它為從裝置,通過裝置ID地址來識別並響應主裝置請求。主從裝置要輪流量控制SDA。一開始我沒搞明白這一點,直接加了寫I2C資料代碼,然後用示波器在SDA和SCL腳測量,卻只能找到些淩亂的波形,沒有預期的效果。後來把從裝置接上,兩邊寫好代碼,互相有了響應,這才在示波器上看到波形。

 

這裡我找了一個主裝置往從裝置寫資料的例子,代碼如下:

 

char buf[128];int len;strcpy(buf,"..huz_hello_i2c/n");len=strlen(buf); //deviceid: 0x3cwrite_i2c(0x3c, buf , len); 

接收端的代碼比較簡單,就不貼了。

 

將示波器的X和Y分別接到SDA和SCL,得到波形並分析

 

可知時序如下:

  1. 由主機發起,在SCL為高電平時,SDA由高到低切變,形成開始訊號;
  2. 接著是7位地址和一位讀寫標誌,這裡7位地址為0111100,即0x3c,正是我們代碼中設定的地址ID;最後一位為0表示寫操作;
  3. 接著在下一個時鐘,主機以高電平狀態釋放SDA,這時從機響應,將SDA拉低了;
  4. 接著是兩個8位元據00101110與響應,即0x2E,正是“.”號的ASCII碼,符合預期輸出;
  5. 還有其它資料和最後的停止位,圖中被截掉了。

可知,縱向一格是200mV,則SDA和SCL的電平大概就是350mV;由於訊號筆上設定了訊號x10,因此實際電平應該大概是3.5V(理論上應該是3.3V)。橫向一格是25us,10個刻度大概用了4格,即4x25us=100us,平均每個刻度是10us,可算出傳輸頻率為1/10us=100,000/s,即100k bps。

 

另外,對於讀從裝置內容,基本流程是主裝置先往從裝置寫一個命令,然後再輸出讀取命令,然後才由從裝置發送資料。過程類似,不再具體分析了。

 

樣本中,主機先向從機寫了一個地址命令,然後重新開始並進入讀取周期。

 

最新在開發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裝置相關

裝置地址:有7位和10位兩種,具體見I2C裝置晶片的DataSheet,由於目前用到的是7位,因此下面主要針對7位講述;在講I2C裝置地址是有可能有兩種說法,主要是用8位表示還是用7為表示,比如對於我的OLED來說,當用8位表示時則為0x78地址,當用7位時則為0x3c(即0x78右移1為),在驅動中用0x78還是用0x3c要看具體平台的I2C匯流排驅動,我在AMLOGIC平台上用的是0x78,而在MV平台上用的是0x3c;

寄存器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的概念原理網上都有就不說了,這裡只把我把兩個開發板通過I2C通訊的調試經驗記錄分享一下。

 

I2C要求要有一個主裝置,負責發起請求和控制時鐘;其它為從裝置,通過裝置ID地址來識別並響應主裝置請求。主從裝置要輪流量控制SDA。一開始我沒搞明白這一點,直接加了寫I2C資料代碼,然後用示波器在SDA和SCL腳測量,卻只能找到些淩亂的波形,沒有預期的效果。後來把從裝置接上,兩邊寫好代碼,互相有了響應,這才在示波器上看到波形。

 

這裡我找了一個主裝置往從裝置寫資料的例子,代碼如下:

 

char buf[128];int len;strcpy(buf,"..huz_hello_i2c/n");len=strlen(buf); //deviceid: 0x3cwrite_i2c(0x3c, buf , len); 

接收端的代碼比較簡單,就不貼了。

 

將示波器的X和Y分別接到SDA和SCL,得到波形並分析

 

可知時序如下:

  1. 由主機發起,在SCL為高電平時,SDA由高到低切變,形成開始訊號;
  2. 接著是7位地址和一位讀寫標誌,這裡7位地址為0111100,即0x3c,正是我們代碼中設定的地址ID;最後一位為0表示寫操作;
  3. 接著在下一個時鐘,主機以高電平狀態釋放SDA,這時從機響應,將SDA拉低了;
  4. 接著是兩個8位元據00101110與響應,即0x2E,正是“.”號的ASCII碼,符合預期輸出;
  5. 還有其它資料和最後的停止位,圖中被截掉了。

可知,縱向一格是200mV,則SDA和SCL的電平大概就是350mV;由於訊號筆上設定了訊號x10,因此實際電平應該大概是3.5V(理論上應該是3.3V)。橫向一格是25us,10個刻度大概用了4格,即4x25us=100us,平均每個刻度是10us,可算出傳輸頻率為1/10us=100,000/s,即100k bps。

 

另外,對於讀從裝置內容,基本流程是主裝置先往從裝置寫一個命令,然後再輸出讀取命令,然後才由從裝置發送資料。過程類似,不再具體分析了。

 

樣本中,主機先向從機寫了一個地址命令,然後重新開始並進入讀取周期。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.