IIC是飛利浦提出的一種通信總線結構,其硬件架構比較簡單,僅包含SCL和SDA兩條線。根據最新的IIC總線標準,IIC總線包含Standard-mode(100kbit/s)、Fast-mode(400kbit/s)、Fast-mode Plus(1Mbit/s)、High-speed mode(3.4Mbit/s)以及Ultra-Fast-mode(5Mbit/s)5種不同速率的模式,圖一給出了前三種模式的相關參數。
圖1 IIC總線幾種模式的相關參數
根據圖1,可以提出以下幾個問題:
1、幾種不同模式的硬件架構有何區別?
2、不同模式所定義的速率上限是怎么來的?大于規定速率的話會怎樣?
3、總線電容400pf的要求是怎么確定的,為什么Fast-mode Plus速率更快,
總線電容卻可以更大?
4、為什么會有上升、下降時間的限制?Fast-mode和Fast-mode Plus的下降
時間為什么還有最小值的限制?
5、建立、保持時間為什么需要限制?
另外,關于IIC總線,還有一些問題需要記錄:
- IIC總線的通信協議?
- 什么是時鐘延展?
- IIC總線的是怎么仲裁的?
本文將針對以上問題進行討論。
幾種不同模式的硬件架構有何區別?
IIC支持五種不同的模式,速率從100k到5M不等,其硬件結構必然有優化,才能支持更高的速率,這一點在IIC的標準中也可窺見一二。Standard-mode下,SCL和SDA是普通的OC門,其高電平的輸出依賴于外部上拉,這一架構能使多個IIC設備掛在同一條IIC總線上,但是這也限制了IIC總線的上升時間,從而限制了其通信速率。Fast-mode下,IIC的輸入結構中增加了施密特觸發器,使得輸入的邊沿可以變得更快,從而獲取更高的通信速率。相應在輸出結構中,雖然上升沿的速率依舊取決于外部上拉電阻和總線電容的大小,但在下降沿增加的斜率控制可以減小下降時間,通過對IO結構的改造,Fast-mode獲得了比Standard-mode更高的速率。圖2 給出了Fast-mode下IIC的IO結構及電平特性,Fast-mode Plus在IO結構上和Fast-mode并無二致,但從圖2可以看出,其驅動電流最大為20mA(Fast-mode下為3mA),這意味著Fast-mode Plus下可以有更快的下降沿和更小的上拉電阻(上升沿也可以更快),從而獲得更高的速率。需要注意的是,從IO結構上看,MOS管是有串接電阻的(標準里說該電阻可選),為的是抑制總線的尖峰和串擾,但是這個電阻的存在會讓低電平不為0,在Fast-mode Plus下,由于驅動電流更大,輸出的低電平的值也就更高,部分IIC電平轉換芯片輸出低電平可達到0.6V左右,此時需要注意輸出低電平是否超門限。相比于Fast-mode Plus,在Hs-mode下,主機設備具有一個用于SDAH信號的開漏輸出緩沖器(從機設備也有),并在SCLH輸出端集成了開漏下拉和電流源上拉電路,并且在傳輸期間不執行仲裁或時鐘同步,從而提高了數據傳輸速率。Ultra Fast-mode則采用了推挽的輸出結構,因此Ultra Fast-mode和其他模式不兼容,也不支持線與(由于推挽輸出結構,多設備并聯時,如果有不同設備同時輸出高電平和低電平,則會發生短路),但是推挽的結構進一步提升了通信速率。
圖2 Fast-mode下IIC的IO結構及電平特性
不同模式所定義的速率上限是怎么來的?大于規定速率的話會怎樣?
IIC的不同模式之間速率差異極大,且每種模式的速率提升都伴有硬件架構上的改進和升級。那么,各種模式所規定的速率上限是嚴謹計算而來的嗎?假設在Standard-mode下,VCC為3.3V(電壓越高,通信速率理論上限應該更低,因為在其他條件一定時,越高的電壓等級意味著越長的上升時間),灌電流為3mA,最大輸出電壓為0.4V,那么上拉電阻的最小值為:
在總線電容400pf的情況下,電壓從0上升到0.3VCC所需要的時間為:
電壓從0上升到0.7VCC所需要的時間為:
故上升時間為:
假設上升沿是線性的,那么,電平從0到Vcc所需的時間為:
IIC的下降時間遠小于上升時間,這里假設兩者相等,則上升下降時間總和為:
假設上升下降時間占整個周期的20%,則Standard-mode下,IIC的最大頻率為:
可見,即使在各項都放大的情況下,算出來的最大頻率都要比Standard-mode所規定的頻率最大值要大。所以,各種模式下所規定的的速率是否為硬性要求就值得考慮了。
圖3 IIC超推薦頻率使用實例
圖3給出了一個IIC超推薦頻率使用的實例,在《 High Resolution Thermal Camera with Raspberry Pi and MLX90640》 中,作者將IIC的速率提高到1Mbit/s(推薦為400kbit/s),而需要擔心的僅僅是散熱,當然,再高的速率可能導致誤碼。所以,IIC各種模式規定的速率只是一個推薦值,但超規格使用一般是不建議的。
總線電容400pf的要求是怎么確定的,為什么Fast-mode Plus速率更快,總線電容卻可以更大?
IIC的設備地址是7位,所以理論上IIC總線上可以掛127個設備(地址0x0不使用),但是IIC總線有400pf的限制,所以一般而言,IIC總線上的設備數是達不到127的。那么,400pf這個限制是怎么來的呢?要討論這個問題,首先要明確總線電容會影響什么參數。首先,電容的的大小會影響總線電壓的充放電速度,從而影響上升/下降沿的斜率,這對通信速率形成了限制;其次,總線電容和電阻形成了一個濾波器,當頻率高時,信號會產生衰減,當信號衰減幅度超過電平判決門限時,就會導致誤碼,因此其對通信頻率也是一個限制。這兩點在我的 《串口通信》 一文中已經展開討論過,在正常情況下,這兩點所確認的總線電容上限都比400pf要大得多,而且充放電速度的大小不僅取決于總線電容的大小,對IIC總線而言,還和上拉電阻的大小以及驅動電流的上限相關。根據IIC的標準,Fast-mode Plus的總線電容上限為550pf,相較于Fast-mode,其擁有更高的通信速率但卻可以容忍更大的總線電容,其原因就是因為Fast-mode plus的灌電流能力能達到20mA(實際看部分芯片的數據手冊,30mA的也有),所以無論是總線電容400pf的限制還是灌電流能力,這些我個人都傾向于認為是標準給出的一個建議值,而各半導體廠商在設計芯片時,首先會滿足標準的要求,保證各廠家芯片對接的通用性,這是標準存在的意義。當然,在滿足標準的前提下,如果成本上滿足要求或基于產品競爭力的考慮,廠家也可以將芯片設計得更強大(例如30mA的灌電流能力),這就是芯片手冊的參數和標準不盡一致的原因。
為什么會有上升、下降時間的限制?Fast-mode和Fast-mode Plus的下降
時間為什么還有最小值的限制?
圖1給出了幾種模式下上升、下降時間的要求,根據相關參數可以看出,上升/下降時間最大值占整個周期時間的12%左右,即使將標準放寬一倍,其時間占比也不足整個周期的50%。那么,緩慢的上升/下降時間到底會帶來什么不好的影響呢?
上升/下降時間所規定的都屬輸入端的要求,所以要討論這個問題,首先要弄清楚IIC輸入結構是什么樣子, 《Designing I/O Drivers for Integrated Circuit IIC Modules》 一文中給出了IIC模塊輸入結構的框圖,如圖3所示。
圖4 IIC的輸入結構框圖
由圖4可以看到,IIC輸入經過buffer緩沖,在移位寄存器處實現電平轉換,過濾毛刺后再輸出給后級的處理邏輯。緩沖器的結構示意圖如圖4所示,可以看做是兩個反相器的串聯,而反相器的則是由CMOS電路組成的,即IIC信號輸入首先到達的是一個CMOS反相器。
圖5 CMOS反相器
CMOS反相器由一個NMOS和一個PMOS組成,其電路結構如圖5所示。其原理也比較簡單,在輸入為高時,NMOS導通,輸出為0;輸入為低時,PMOS導通,輸出為1。在華科的 《電子技術基礎——數字部分》 一書中,還給出了其電壓、電流傳輸特性如圖5所示。從其電壓、電流的傳輸特性可以看出,CMOS電路的兩個MOS管可能存在直通的現象,雖然書中理想化地將該電壓標注為VDD/2,但從MOS管的工作原理上看,兩個MOS同時導通必然對應的是一個電壓范圍。也就是說,過長的上升/下降時間會使CMOS電路直通的時間變長,從而增加電路損耗甚至可能導致器件損壞。
圖6 CMOS電壓電流傳輸特性
但在圖1中,上升/下降時間不僅有最大值的限制,在Fast-mode和Fast-mode plus下,下降時間的最小值也存在限制。前述,相較于Standard-mode,Fast-mode的硬件結構在輸入端增加了施密特觸發器和尖峰抑制,輸出端增加了斜率控制電路,但是,查看施密特觸發器的datasheet(以SN74LVC1G17為參考),上升時間并沒有相關的規格要求。
圖7 SN74LVC1G17的參數要求
在NXP和TI的社區中,關于這個問題的解釋見圖8,NXP的解釋是可能和Fast-mode的輸入輸出結構相關,但并未給出具體的原因;TI給出的回答是在Fast-mode以及更高速率的模式下,上升/下降時間太快可能帶來EMI問題,但這一規定并不是強制要求的(根據經驗,下降時間一般都小于20ns,且我本人尚未碰到過應用問題)。
圖8 NXP和TI社區中關于上升時間最低值限制的問題
建立、保持時間的要求從何而來?
由圖3可知,從機接收到輸入信號后,會將其保存到寄存器中,在輸入到后級進行處理。寄存器由觸發器構成,以D觸發器為例,其結構如圖8所示。
圖9 D觸發器的電路結構
根據圖9可以看出,D觸發器實際是由兩個鎖存器串聯而成,當CLK為低電平時,傳輸門TG1、TG4打開,TG2、TG3關閉,觸發器的輸入信號經過G1輸出到Q1’,并經過Q1輸出到TG2的輸入端,當CLK變高瞬間,TG1、TG4關閉,TG2、TG3打開,主鎖存器的輸出通過TG3輸出,在這個過程中,需要確保TG2有關閉到打開時,傳輸門兩邊的電平一致,這樣Q1’才能輸出穩定的信號,建立時間指的便是TG1、G1、G2的延時,即:
保持時間要求的來源也類似,為保證輸出Q穩定,則在CLK變高時,Q1’的電平要保持穩定,而TG1的關閉需要時間,所以保持時間為:
IIC總線的通信協議
IIC的一幀數據包含9個bit,主要包括起始位、停止位、讀寫標志位、應答位、設備地址、寄存器地址以及數據幾項內容。其中, SCL為高時,SDA拉低為起始標志位;SCL為高時,SDA拉高為停止標志位;讀寫標志位只有一位,0表示寫,1表示讀;應答位低有效,應答位為高表示非應答。另外,IIC的讀寫幀格式不太一樣,下面分別描述。
- 寫操作
IIC寫操作時的幀格式如圖10所示,陰影部分為主機發出,空白部分則為從機發出。首先由主機發出起始位,由于IIC可能有多個設備,所以在起始位發出后,第一幀數據會發送設備地址對從機進行尋址(設備地址一般為7bit),第8位數據則是讀寫標志位,在寫操作時,該bit為0,第9位則為從機發出的應答位。完成尋址后,需要指定要寫入寄存器的地址,隨后寫入數據。完成以上步驟,主機發出停止位,即完成了一次讀操作。
圖10 IIC寫操作的幀格式
讀操作
讀操作稍微比較復雜,有讀當前地址數據和隨機讀兩種不同場景。讀當前地址數據的幀格式如圖11 所示。在主機選擇相應的從機設備后,從機會將數據發送給主機,數據傳輸完成后,主機發出NACK后發出停止位即完成一次數據傳輸。
圖11 IIC讀當前地址的幀格式
隨機讀模式較為復雜,其幀格式如圖12所示。由于要指定特定寄存器地址,所以IIC首先要進行一次寫操作(無需寫入數據,只是為了定位到需要讀取的寄存器地址),隨后再按讀當前地址的幀格式操作即可完成隨機地址寄存器信息的讀取。
圖12 IIC讀隨機地址的幀格式
關于IIC的幀格式這一塊,網上的資料眾多,相關芯片的數據手冊里對此也有很多描述,IIC的讀寫操作還有單次讀寫和頁讀寫的操作,其幀格式在此不再贅述。
關于時鐘延展
時鐘延展在IIC標準的High-speed mode的章節中有所提及,這一功能是為了解決系統中存在使用不同速率的IIC總線設備的通信問題,它允許從機在來不及處理數據的時候拉低SCL,從而有更多的時間處理接收到的數據。這一功能讓IIC變得更加靈活,因為從機可以控制SCL意味著給了從機設備發出中斷的能力,那么在通信或者其他功能的控制上就可以更加方便。這一功能在實際的應用中也比較常見。
關于仲裁
IIC總線允許在同一條主線上有多個主機和多個從機,那么在多個主機同時發起通信的時候,就會產生沖突,而解決這個沖突的過程就是仲裁。IIC的仲裁機制由其OC/OD門輸出結構實現,多個設備掛在同一條IIC總線上時時線與的關系,那么其時鐘速率必然由速率最低的主機決定(假設占空比為50%,由于線與的特性,SCL的波形決定于低電平最長的主機的SCL)。但是,SCL和SDA是同時發出的,且SCL和SDA互相感知不到對方是否正常,在多主機沖突的時候,即使SCL的波形已經由頻率最低的主機決定了,其他主機的SDA也依然在繼續發送數據。所以,在SCL為高時,每個主機會探測SDA上的數據是否與自己發送的數據一致,不一致則退出總線控制權的競爭,在這個過程當中,IIC數據不會丟失,且最后剩下的主機即使有超過一個,那么對應從機收到的數據也是正確的。通過以上描述可以知道,IIC總線控制權的競爭僅取決于SDA,多個主機無法排優先級。
評論
查看更多