免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
幾種最常用的串行數(shù)據(jù)傳輸總線(2)-I2C

我第一次知道I2C總線是1995年,項目中用到電視機高頻頭(也叫調諧器、Tuner),能夠方便買到的高頻頭要么是飛利浦(Philips)的,要么是日系廠商的,但日系廠商聯(lián)系起來比較費勁。Tuner其實就是通過I2C總線送控制字來改變其本振頻率(LO)選擇你需要的頻段,當時知道I2C的鼻祖就是飛利浦半導體(NXP-恩智浦半導體的前身),也是第一次使用MC34063這顆后來如同555一樣撲街的開關穩(wěn)壓芯片,用來產生高頻頭所需要的12V DC。

典型的電視機調諧器,采用I2C來進行調諧

板子上的器件之間也需要Talk

器件和器件之間的也需要溝通信息,尤其是需要MCU/DSP等對其它外設進行控制的時候。工程界的大神們基于MCU/DSP開發(fā)了一系列的協(xié)議比如UART、USART、SPI、I2C、CAN等. . . .每種協(xié)議都有各自擅長的地方,也有其局限性,因此要做系統(tǒng)設計的硬件工程師就應該對每種接口協(xié)議有大概的認識(即便沒有機會吃豬肉,也要知道各種豬是如何跑的),這樣才能夠幫助你在做方案選擇的時候能夠選用最合適的協(xié)議接口方式,這也是你需要閱讀我寫的文章的原因。

在同一個PCB板子上的不同器件之間進行通信最常用的有三種形式 - SPI、I2C和UART,上篇文章我們簡單介紹了SPI,今天就來看看I2C,我們先看一下I2C最基本的一些特性,然后再跟其它的通信協(xié)議方式進行一下比較。 

兩條通過上拉電阻吊在電源的線,上面可以掛多個器件進行通信

簡約而不簡單的I2C總線

I2C來自于英文inter–integrated circuit,有時也寫為IIC,字面意思也可以理解為IC之間進行交流用的,跟SPI對比,I2C沒有天生的主、從之分,也就是說掛在兩根線(數(shù)據(jù)線SDA和時鐘線SCL)上的所有器件都是生而平等的。這個協(xié)議最早由飛利浦半導體推出來,幾年后Intel又弄了一個SMBus(系統(tǒng)管理總線)協(xié)議,其實基本跟I2C一模一樣,算是其擴展吧,一丟丟的差別而已。 

I2C總線傳輸時序

有哲學家說 - 越是看起來簡單的東西,背后處理的問題越復雜。I2C其實也是如此,雖然我們看到的是2根線能掛起一大串的器件,但就像一個沒有了老師的課堂,沒有一個好的管理機制一定會出現(xiàn)亂哄哄的局面,要讓任何兩個同學之間進行有序地交流,沒有明確的協(xié)議是肯定會亂掉的。

最簡單的情況就是在這個系統(tǒng)中有1主1仆,但如果有多個仆(從設備)呢?如果多個“從設備”不知道哪個是“主設備”呢?如果出現(xiàn)了多個“主設備”呢?如果一個“主設備”正由“從設備”獲取數(shù)據(jù),中途由于種種原因突然掛了怎么辦呢?一個“從設備”正發(fā)著數(shù)據(jù)掛掉了怎么辦呢?一個“主設備”獲取了總線使用權用以數(shù)據(jù)的發(fā)送,在釋放使用權之前崩潰了怎么辦呢? 

這種看似非常簡單的結構其實會遭遇各種可能

在實際的運行環(huán)境中會有各種意外導致系統(tǒng)出現(xiàn)問題,我們在學習使用I2C的時候一定要做到心中有數(shù) - 簡單的架構背后有著復雜的結構來保證這個協(xié)議的順利執(zhí)行,才能讓其成為靈活、可擴展、魯棒、極少管腳的串行通信方案。

示波器上捕捉到的I2C總線上的數(shù)據(jù)讀取

I2C協(xié)議概要

以下是I2C的主要特征:

  • 不論總線上掛多少個設備,只需要兩根信號線(時鐘SCL和數(shù)據(jù)SDA)就搞定;

  • 兩根信號線都通過合適阻值(這個值的正確選取很重要)的上拉電阻連接到正電源上;

  • 每個設備的接口都是通過漏極開路(或集電極開路)的輸出驅動連接到時鐘和數(shù)據(jù)信號線上;

  • 每個從設備都有一個7位的地址,可供尋址用。主設備必須知道這些從設備的地址以便同指定的一個從設備進行通信。

  • 所有傳輸均由“主設備”發(fā)起和終止; “主設備”可以將數(shù)據(jù)寫入一個或多個“從設備”或從“從設備”請求數(shù)據(jù)。

  • 在系統(tǒng)中“主”和“從”不是固定的,任何一個設備都可以作為“主”或“從”,只要它配置了適當?shù)挠布蚬碳瑢嶋H上在嵌入式系統(tǒng)中最常采用的架構就是一個“主設備”向多個“從設備”發(fā)送命令或由多個“從設備”采集數(shù)據(jù)。

  • 數(shù)據(jù)信號在時鐘的下降沿更新,并在上升沿被采樣,如下圖。

 I2C協(xié)議中數(shù)據(jù)和時鐘的時序關系

  • 數(shù)據(jù)是以一個字節(jié)進行傳輸?shù)?,每一個字節(jié)跟著1位的握手信號,作為ACK/NACK(應答/無應答)位.

同UART和SPI相比,I2C有何優(yōu)勢?

I2C的主要優(yōu)勢如下:

  • 管腳/信號數(shù)量少,即便掛了很多的設備,也只用兩根線;

  • 可以適應不同的從設備的要求;

  • 可以支持多個主設備;

  • 引入了ACK/NACK功能以提升應對錯誤的能力

當然也有一些劣勢的地方:

  • 增加了固件和底層硬件的復雜度

  • 增加了協(xié)議的負荷,降低了數(shù)據(jù)傳輸?shù)耐掏侣?/p>

  • 需要上拉電阻,會導致如下的后果

    • 限制了時鐘的速度

    • 增加了功耗

由此可以看到I2C比較適合復雜、多樣化、需要通信設備靈活擴展的場景;UART比較適合單點對單點的連接,因為UART沒有標準的方式來尋址不同的設備或共享管腳。SPI比較適合系統(tǒng)中有一個主設備和少量的從設備,而且每一個從設備都有一個單獨的“從設備選擇”信號,當總線上有多個設備的時候會需要更多的管腳,布線的難度也會增加,當你需要支持多個主設備的時候,SPI用起來也會非常尷尬。

如果你需要較高的傳輸速率,使用I2C就不太合適,SPI能夠支持更高的時鐘頻率,數(shù)據(jù)負載開銷也最小。如果你想使用FPGA從頭設計串行數(shù)據(jù)傳輸,SPI和UART的底層硬件設計要簡單得多,迫不得已再用I2C。

I2C硬件電路特色

I2C的一個特性是總線上的每個器件都必須通過漏極開路(或集電極開路)輸出驅動器連接時鐘信號(縮寫為SCL)和數(shù)據(jù)信號(縮寫為SDA)。這也就意味著:

  • 信號缺省始終為邏輯高電平,如果I2C主設備嘗試與已失效的從設備通信,則數(shù)據(jù)信號永遠不會進入未定義狀態(tài),如果從設備沒有驅動信號,它將被讀為邏輯高電平。 同樣,如果主設備在傳輸過程中斷電,SCL和SDA將返回邏輯高電平,其它設備可以通過觀察SCL和SDA在一定時間內邏輯高電平來確定總線是否可用于新的傳輸。

  • 即使另一個設備試圖將它們驅動為高電平,總線上的任何設備都可以安全地將信號驅動為邏輯低電平,這是I2C“時鐘同步”或“時鐘延長”功能的基礎:主器件產生串行時鐘,但如果需要,從器件可以將SCL保持為低電平,從而降低時鐘頻率。

  • 具有不同電源電壓的器件可以共存于同一總線上,只要較低電壓的器件不會被較高的電壓損壞即可。 例如,如果SCL和SDA上拉至5V,3.3V的器件就可以與5V的器件進行通信 - 即使3.3V的器件無法驅動來自典型的推挽輸出級的5V,漏極開路的配置可以讓邏輯高電壓達到5V。

有電阻R,就會有RC

由于漏極開路輸出驅動器存在著明顯的缺點,并不是數(shù)字IC的標準配置。電壓的變化會受到與特定節(jié)點相關的電容充電或放電所需的時間的限制。 SCL和SDA上的上拉電阻限制了充電的電流量 - 也就是說,我們在RC時間常數(shù)中可以更多地通過R來控制從邏輯低到邏輯高的轉換。

 輸出從低到高時向電容充電

輸出從高到低時由電容放電

從這個圖可以看出從低到高的轉換比從高到低的轉換要慢很多,導致出現(xiàn)常見的I2C鋸齒波形:

由I2C信號線上的上拉電阻以及節(jié)點電容引起的上升沿變緩

下圖為示波器上捕捉到的實際的時鐘信號波形 - 采用1k?的電阻做上拉,即便最小的電容效應(總線上只有兩個器件,且很短的PCB走線)的時候I2C時鐘信號的低到高以及高到低的變化。

上拉電阻的值如何選擇?

可見,上拉電阻限制了數(shù)據(jù)傳輸?shù)淖畲髸r鐘速率。實際上,電阻和電容都有影響,我們無法控制電容,因為它主要取決于總線上有多少器件以及這些器件之間互連的方式。那問題來了,考慮到所需的數(shù)據(jù)傳輸速率要求以及可能帶來的功耗,使用多少值的上拉電阻才最合適?較低的電阻RC時間常數(shù)也比較低,但會通過上拉電阻增加從VDD流向地的電流(只要SCL或SDA為邏輯低電平)。

官方I2C規(guī)范(第9頁)規(guī)定,在達到VDD的70%之前,電壓不被視為“邏輯高”。 RC時間常數(shù)告訴我們電壓達到最終電壓的約63%需要多長時間。 因此,為簡單起見,我們假設R×C告訴我們信號從接地電壓附近上升到邏輯高電壓需要多長時間。

如何計算電容呢? 比較可行的方法是查找總線上每個器件的引腳電容進行粗略估計,然后再添加每英寸PCB走線3pF和每英尺同軸電纜30pF。

假設我們有50pF的總線電容,按照I2C“標準模式”規(guī)范規(guī)定 - 最大上升時間為1000ns。

也就是說上拉電阻可以定為20kΩ,這個值的功耗也比較低,速度如何呢?假設你希望時鐘高的時間至少是上升時間的三倍。

如果167 kHz不夠快,您可以降低電阻(以增加功耗為代價),直到達到所需的時鐘速度。 (實際上,“標準模式”將時鐘速度限制為100 kHz,但可以根據(jù)系統(tǒng)需要調整這些規(guī)格。)

當然,這只是粗略的計算,具體的應用中要根據(jù)掛在總線上的器件的數(shù)量以及電路設計來進行估算,還可以配合示波器上實際的測量進行調整,以滿足系統(tǒng)的綜合要求。

典型的數(shù)據(jù)傳輸

下面的時序圖為一個典型的I2C傳輸時序。

可以看到以下幾點:

  • 對應于時鐘邏輯高電平部分的虛線提醒我們邏輯高電平(對于SCL和SDA)都是“隱性”狀態(tài) - 換句話說,信號通過上拉電阻自然浮動到邏輯高電平。 “主導”狀態(tài)是邏輯低,因為只有當設備實際將其驅動為低時,信號才會變低。

  • 每一次的傳輸都是以“起始位”開始,該起始位定義為在SCL為邏輯高電平的時候SDA的下降沿。

  • 傳輸以“停止位”結束 - 定義為當SCL為邏輯高電平的時候SDA的上升沿。 I2C傳輸必須以停止位結束,但在生成停止位之前可能會出現(xiàn)多個起始位。

  • 數(shù)據(jù)在時鐘為高時有效,在時鐘為低時改變狀態(tài); 數(shù)字通信系統(tǒng)通常都是邊沿驅動的,因此實際上數(shù)據(jù)在時鐘的上升沿被讀取,在時鐘的下降沿時進行更新。

  • 信息一次一個字節(jié)地交換,從最高有效位開始,每個字節(jié)后跟一個ACK或NACK。

  • 你可能期望ACK由邏輯高指示,NACK由邏輯低指示,但事實并非如此。 ACK為邏輯低,NACK為邏輯高。 這是必要的,因為高是隱性狀態(tài) - 如果“從設備”不工作,信號自然浮動到NACK,同樣只有當設備正在運行并準備繼續(xù)進行傳輸時,才會發(fā)送ACK。

以下為I2C數(shù)據(jù)傳輸?shù)捻樞颍?/p>

  1. 主機生成一個起始位以啟動傳輸。

  2. 主設備發(fā)送與其想要通信的從設備相對應的7位地址。

  3. 第一個單字節(jié)段中的最后一位是讀/寫指示符。如果想要從“從設備”讀取數(shù)據(jù),則“主設備”將該位設置為邏輯高電平; 如果要將數(shù)據(jù)寫入“從設備”,則將其設置為邏輯低電平。

  4. 下一個字節(jié)是第一個數(shù)據(jù)字節(jié),它來自主設備或從設備,具體取決于讀/寫位的狀態(tài)。像往常一樣,我們有8位數(shù)據(jù),從最重要的位開始。

  5. 數(shù)據(jù)字節(jié)之后是ACK或NACK,如果這是讀數(shù)據(jù)傳輸則由“主設備”生成,如果是寫數(shù)據(jù)傳輸,則由“從設備”生成。 ACK和NACK可能意味著不同的東西,具體取決于通信設備的固件以及底層的硬件設計。例如,主設備可以使用NACK來表示“這是最后一個數(shù)據(jù)字節(jié)”,或者如果“從設備”知道要發(fā)送多少數(shù)據(jù),它可以使用ACK來確認數(shù)據(jù)是否已成功接收。

  6. 傳輸以“主設備”生成的停止位終止。

傳輸多少字節(jié)?

每次傳輸都是以同樣的方式開始:起始位、地址、讀/寫、ACK/NACK。 之后,任何數(shù)量的字節(jié)都可以從“主設備”發(fā)送到“從設備”或從“從設備”發(fā)送到”主設備“,每個字節(jié)后跟ACK或NACK。 NACK可以用來表示“停止發(fā)送數(shù)據(jù)!”。例如,“主設備”可能希望從“從設備”(例如溫度傳感器)接收連續(xù)的數(shù)據(jù)流,每個字節(jié)后面都會有ACK,如果“主設備”需要處理其它事情,它可以用NACK告知”從設備“并在它準備就緒時再開始新的傳輸。

由于篇幅限制,在此我們不做更詳細的介紹,有興趣的朋友可以閱讀Wikipedia中關于I2C的介紹以及該詞條下面的參考文章。對該總線的使用以及技術細節(jié)有一定程度的了解會幫助我們在實際的設計中更加有效地完成數(shù)據(jù)的傳輸設計以及有可能的問題定位。

一個應用舉例 - 下面是我們用小腳丫FPGA做的計算器,我們通過FPGA邏輯實現(xiàn)了I2C的主控制功能,來操作掛在I2C總線上的觸摸按鍵控制器、掛在SPI總線上的LCD顯示屏。

小腳丫FPGA做成的計算器

計算器的功能框圖,3顆觸摸控制器掛在I2C總線上

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
i2c- sda掛死分析
I2C
周末充電 / 硬件基礎 / I2C 要點總結
IIC總線知多少?
I2C總線串行接口應用設計
I2C總線概述及時序總結
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服