王芬芬,馮海英,丁 柯
(中科芯集成電路股份有限公司,江蘇無錫 214072)
I2C總線[1]是Philips公司開發(fā)的一種簡單、雙向二線制同步串行總線[1]。通過串行時鐘線SCL和串行數(shù)據(jù)線SDA即可在連接于總線上的器件之間傳送信息,因而廣泛應用于微控制器、EEPROM、A/D轉換器及電子通信領域[2]。
SMBus 2.0協(xié)議是在I2C協(xié)議基礎上研發(fā)出來的系統(tǒng)管理總線協(xié)議[3],它基于I2C操作原理,繼承了I2C總線的特點和優(yōu)點,起初是為智能電池、充電電池和與其他系統(tǒng)通信的微控制器之間的通信鏈路而定義的,后來也被用來連接各種設備,包括電源相關設備、系統(tǒng)傳感器、EEPROM通信設備等,目前已成為在智能電池及低速率管理設備上被廣泛采用的協(xié)議標準[4]。
實現(xiàn)I2C總線協(xié)議時主要有兩種方法:第一種是利用SOC芯片的兩個引腳去模擬SDA和SCL,并利用軟件模擬控制器的接口功能,這種方法通用可行但移植性差,占用資源多,軟件規(guī)模大,不易于維護;第二種方法是利用I2C總線控制器IP,在SOC芯片中嵌入I2C總線接口,利用硬件設計I2C總線控制器,然后集成到SOC系統(tǒng)中,這種方法移植性好,但要求I2C總線控制器功能完善且占用較低的硬件資源。
王炳文等[5]基于可編程邏輯設計了一種I2C總線主機控制器,通過FPGA狀態(tài)機的組合擴展出I2C總線,相比完全用軟件模擬I2C時序的方法減小了軟件的工作量,但擴展出的I2C總線僅支持部分傳輸方式。張文梅等[6]設計了一種功能可擴展的I2C控制器,但該控制器只能作為從機控制器,且只能進行寫操作,不可進行讀操作。宋杰等[7]的設計中采用了異步先進先出來同步APB總線和I2C總線之間的數(shù)據(jù)交換,且設計滿足通信的100 kHz和400 kHz兩種數(shù)據(jù)傳輸速率要求,但不支持從機的10位地址模式,也不支持主機的時鐘同步和總線仲裁功能。胡春媚等[8]設計了一種I2C主從控制器,實現(xiàn)了I2C總線協(xié)議規(guī)范的基本功能。陳濤[9]設計了一種SMBus接口的控制器用于智能電池系統(tǒng),實現(xiàn)了SMBus總線協(xié)議規(guī)范的基本功能。在芯片管腳資源受限的系統(tǒng)中,單獨設計一種既能覆蓋I2C總線也能覆蓋SMBus總線的控制器具有重要的意義。
本文設計了一種兼容SMBus 2.0協(xié)議的I2C總線控制器,既保證各自的功能和協(xié)議規(guī)范,又極大地節(jié)省了硬件資源。該控制器連接串行I2C/SMBus總線,可配置為主機或從機模式,且有多主機功能;而且該控制器由狀態(tài)機控制,同時滿足I2C/SMBus的通信模式和通信時序。此外,本文基于APB總線設計,采用Verilog HDL語言實現(xiàn),使得該控制器很容易集成到基于AMBA總線的SOC系統(tǒng),從而得到更廣泛的應用。
本文首先簡要介紹了I2C總線的基本原理,分析了I2C總線和SMBus總線的相同點和不同點;然后對整個I2C總線控制器進行了層次分明的模塊化設計,并深入闡述了各個模塊的功能及I2C和SMBus兼容性的實現(xiàn);最后,通過仿真驗證了該I2C總線控制器的兼容性。
I2C串行總線包含2根信號線:串行數(shù)據(jù)線SDA和串行時鐘線SCL,這2根線都是雙向的,并通過一個電流源或上拉電阻連接到正的電源電壓[1]。當總線空閑時,這兩根線均處于高電平狀態(tài)。此外,連接到總線的器件輸出級必須是漏極開路或集電極開路,這樣就可將多個I2C設備的串行數(shù)據(jù)線SDA和串行時鐘線SCL分別進行線與的功能,同時連接到一個通信網(wǎng)絡中。該總線結構圖如圖1所示。每個連接到I2C總線的設備都有一個唯一的設備地址,而且都可作為一個主機或從機用于發(fā)送或接收數(shù)據(jù)。
圖1 I2C總線結構圖
在I2C總線上,執(zhí)行數(shù)據(jù)傳輸時主機和從機的關系不是恒定的。主機用于啟動總線傳輸數(shù)據(jù),產(chǎn)生START起始條件和STOP結束條件,發(fā)送設備地址并產(chǎn)生時鐘信號,此時任何被尋址的器件均被認為是從機。而此時數(shù)據(jù)傳送的方向決定了I2C器件是發(fā)送器還是接收器,I2C總線的數(shù)據(jù)傳輸時序如圖2所示。
圖2 I2C總線協(xié)議
SMBus系統(tǒng)管理總線也是一種同步串行總線,包括數(shù)據(jù)線 SMBDAT(本文記做 SDA)、時鐘線SMBCLK(本文記做SCL),還有一個可選信號為SMBALERT。它基于I2C總線協(xié)議規(guī)范,與I2C的數(shù)據(jù)有效性是一致的,數(shù)據(jù)傳輸格式也相同;但二者之間存在很多差異,在規(guī)范[10]中的多個協(xié)議層都有詳細說明,本文從二者設計兼容的角度將必須考慮和實現(xiàn)的差異總結為3個方面:
(1)SMBus與I2C在時序方面有較多差異,見表1,要做到I2C與SMBus設計兼容,必須正確地把二者的時序可靠地組合起來使用,使得二者都要滿足各自的協(xié)議規(guī)范。
表1 SMBus與I2C時序的不同點
(2)SMBus為了提高數(shù)據(jù)傳輸?shù)目煽啃?,增加?shù)據(jù)包錯誤校驗(Packet Error Checking,PEC)功能,主要用來檢測或校驗數(shù)據(jù)傳輸中出現(xiàn)的錯誤,I2C未作類似說明。
(3)SMBus設備地址類型可劃分為很多種,如保留地址、目的性分配地址、動態(tài)分配地址等。這些地址的劃分運用于不同協(xié)議層的特定場合或特定目的。
本文設計的片上I2C總線控制器基于APB總線設計,且兼容SMBus總線協(xié)議。APB總線是由ARM公司開發(fā)的一種簡單SOC總線,它由一個APB Bridge和多個APB Slave組成,主要用來連接一些低速外圍設備,因此該I2C總線控制器兼容性強,可以方便地集成到任何基于APB總線的SOC系統(tǒng)。
該I2C總線控制器支持主機或從機模式,能夠控制所有I2C和SMBus總線特定的時序、協(xié)議、仲裁,支持7位和10位地址模式,支持通信速率標準模式高達100 kHz和快速模式高達400 kHz,同時滿足SMBus的超時檢測功能和PEC檢測功能。
I2C總線控制器設計結構圖如圖3所示,包括4個子模塊:APB總線接口模塊、SDA控制單元、SCL控制單元和狀態(tài)機控制單元。
圖3 I2C總線控制器結構圖
APB總線接口模塊是整個I2C總線控制器接口的控制部分,使I2C總線控制器的硬件行為與APB總線協(xié)調(diào)一致,負責實現(xiàn)與片上APB總線的互聯(lián)及數(shù)據(jù)交換,所以設計了基于APB總線的接口寄存器,該寄存器的功能描述見表2。MCU可通過APB總線對I2C總線控制器的寄存器進行配置、數(shù)據(jù)讀寫和中斷處理等操作,從而控制I2C總線控制器的工作模式及工作流程,實現(xiàn)I2C總線的數(shù)據(jù)通信。
表2 寄存器描述
SCL控制單元是對I2C總線控制器SCL總線的控制,主要作用是通過主機時鐘產(chǎn)生、從機時鐘拉伸和SMBus超時檢測子模塊結合時鐘控制邏輯,產(chǎn)生SCL總線的時序,使其既滿足I2C的SCL總線時序,又滿足SMBus的SCL總線時序。
3.3.1 主機時鐘產(chǎn)生
當該控制器配置為I2C主機,配置CCR的通信模式,確定為I2C的標準模式、快速模式或SMBus模式;配置CCR的時鐘分頻系數(shù),產(chǎn)生特定的SCL時鐘頻率;其中I2C的標準模式和SMBus模式的SCL占空比采用1∶1,CCR的時鐘分頻系數(shù)配置見公式(1),I2C快速模式的SCL占空比采用2∶1,CCR的時鐘分頻系數(shù)配置見公式(2),式中fPCLK表示主時鐘PCLK的時鐘頻率,fSCL表示I2C/SMBus的總線通信速度;在時鐘分頻時必須實施時鐘同步機制,以支持多主機環(huán)境和從機時鐘拉伸。為了時鐘同步,從SCL下降沿開始計數(shù)時鐘低電平的個數(shù),一旦計數(shù)到CCR的時鐘分頻系數(shù),就釋放SCL到高電平;從SCL上升沿開始計數(shù)時鐘高電平的個數(shù),一旦計數(shù)到CCR的時鐘分頻系數(shù),就將SCL拉低到低電平。
為保證兼容性,還必須同時保證I2C時序和SMBus時序的正確性,為了滿足數(shù)據(jù)保持時間和建立時間以及時鐘上升時間和下降時間,從SCL下降沿開始計數(shù)數(shù)據(jù)保持時間的個數(shù),然后再計數(shù)數(shù)據(jù)建立時間的個數(shù)??紤]到硬件設計簡單化且減少硬件面積,設計時充分結合I2C和SMBus兩者時序的共同點和差異,將數(shù)據(jù)建立時間和保持時間根據(jù)主時鐘進行了分類和歸納,見表3,對比I2C規(guī)范協(xié)議中的時序參數(shù)說明及SMBus 2.0規(guī)范協(xié)議中的時序參數(shù)說明,表3的時序設計可同時滿足I2C和SMBus的時序要求。
表3 I2C/SMBus時序參數(shù)
3.3.2 時鐘拉伸
在總線傳輸期間,主機或從機可以選擇在字節(jié)傳輸之間拉伸時鐘低電平周期,用以處理已接收的數(shù)據(jù)或準備發(fā)送的數(shù)據(jù)或執(zhí)行實時任務,在這種情況下,I2C和SMBus總線控制器就需要支持時鐘拉伸功能。
3.3.3 SMBus超時檢測
主機或從機根據(jù)需要可以實時拉伸時鐘總線,但SMBus 2.0總線規(guī)范對在總線傳輸期間的時鐘拉伸的累積值有嚴格限制,而I2C沒有這個限制。當配置為SMBus設備時,設計了3種超時檢測:第一種,時鐘低電平超時檢測,不論是主機或從機,一旦檢測到SCL下降沿就開始計數(shù),35 ms內(nèi)出現(xiàn)SCL上升沿,則計數(shù)器清零;一旦超過設置的超時閾值,見公式(3),那么所有的控制寄存器和狀態(tài)寄存器及狀態(tài)機都進行復位操作,同時主機在SCL和SDA總線上產(chǎn)生STOP條件,從機釋放SCL和SDA總線為高電平;第二種,對從機的時鐘低電平擴展累計時間tLOW:SEXT進行檢測,在25 ms內(nèi)總線從START開始的一次傳輸期間,一旦檢測到從機在字節(jié)傳輸之間或一個字節(jié)傳輸完畢后拉伸時鐘低電平,就開始計數(shù),該計數(shù)器一直累計,一旦超過設置的超時閾值,見公式(4),或檢測到STOP條件,則計數(shù)器清零,同時所有的控制寄存器和狀態(tài)寄存器及狀態(tài)機都進行復位操作,且釋放SCL和SDA總線為高電平;第三種,對主機的時鐘低電平擴展累計時間tLOW:MEXT進行檢測,在10 ms內(nèi)總線從START到ACK階段、ACK階段到下一個ACK階段、ACK階段到STOP的傳輸期間,一旦檢測到主機在這3個階段有字節(jié)傳輸之間或一個字節(jié)傳輸完畢后拉伸時鐘低電平,就開始計數(shù),該計數(shù)器一直累計,直到下一個階段計數(shù)器清零,重新開始計數(shù),一旦超過設置的超時閾值,見公式(5),則計數(shù)器清零,同時所有的控制寄存器和狀態(tài)寄存器及狀態(tài)機都進行復位操作,且在SCL和SDA總線上產(chǎn)生STOP條件。
SDA控制單元控制I2C總線控制器的SDA總線。SDA控制單元設計時兼容了SMBus的設備地址分配識別和SMBus的PEC校驗功能。
3.4.1 SMBus的設備地址
SMBus設備地址類型可劃分為很多種,如保留地址、目的性分配地址、動態(tài)分配地址等。這些地址的劃分運用于不同協(xié)議層的特定場合或特定目的,詳細說明參見SMBus協(xié)議規(guī)范及相關文獻。當配置為SMBus設備時,在地址階段通過地址匹配比較,識別SMBus的設備缺省地址0x1100001x;當配置為SMBus主機時,在地址階段通過地址匹配比較,識別SMBus的Host地址 0x0001100x。
3.4.2 SMBus PEC的產(chǎn)生和校驗
SMBus協(xié)議規(guī)范引進了數(shù)據(jù)包錯誤檢測PEC機制來提高數(shù)據(jù)傳輸?shù)目煽啃?,這個計算使用CRC-8多項式C(x)=x8+x2+x+1,對每一位串行數(shù)據(jù)進行計算得到。PEC是一個計算所有信息字節(jié)(包括地址以及讀寫位和數(shù)據(jù)字節(jié))之后得到的CRC-8錯誤校驗字節(jié),該字節(jié)作為最后一個信息字節(jié)。
當配置為SMBus發(fā)送設備,將地址字節(jié)以及讀寫位和數(shù)據(jù)字節(jié)的每一位進行串行CRC計算得到PEC字節(jié),然后發(fā)送該字節(jié);在PEC字節(jié)后接收到ACK響應表示這次寫數(shù)據(jù)在從器件接收端被成功執(zhí)行,否則收到NACK響應。當配置為SMBus接收設備,將地址字節(jié)以及讀寫位和數(shù)據(jù)字節(jié)的每一位進行串行CRC計算得到PEC字節(jié),然后將接收的最后一個字節(jié)與該PEC字節(jié)進行比較,如果匹配則發(fā)送ACK響應,否則發(fā)送NACK響應。
由于該控制器可以作為主機也可以作為從機,可作為發(fā)送器也可作為接收器,可作為I2C設備也可作為SMBus設備,為了兼容工作模式的多樣性設計了狀態(tài)機控制單元,該單元是I2C總線控制器的核心控制部分,主要負責實現(xiàn)I2C和SMBus的總線協(xié)議,控制I2C和SMBus工作模式選擇及工作流程,產(chǎn)生讀寫時序及各狀態(tài)標志。該單元由一個狀態(tài)機控制實現(xiàn),如圖4所示,該狀態(tài)機共有15個狀態(tài),具體描述見表4;狀態(tài)之間的跳轉及其跳轉條件在表5中簡要地進行了闡述。
為確保該I2C總線控制器功能和時序的正確性、通信的穩(wěn)定性以及與SMBus的兼容性,將該I2C控制器與I2C外設模型或SMBus外設模型連接[11],對該控制器進行了全面的仿真,使用的仿真器為Cadence公司的NC-Verilog。
表4 狀態(tài)機狀態(tài)描述
圖4 I2C總線控制器狀態(tài)機
本文設計的I2C總線控制器支持I2C協(xié)議和SMBus協(xié)議,二者都有4種工作模式,分別為主機發(fā)送模式、主機接收模式、從機發(fā)送模式和從機接收模式;且都支持7位地址傳輸模式和標準模式;此外,作為I2C設備還支持10位地址傳輸模式和快速模式,作為SMBus設備還支持PEC傳輸和超時檢測。針對I2C和SMBus的兼容性,同時結合不同的工作模式和時序分別仿真驗證。
表5 狀態(tài)機跳轉條件
圖5是對I2C總線控制器與I2C外設模型進行仿真,驗證I2C總線控制器的快速400 kHz模式和7位地址模式。將其配置為I2C主機發(fā)送模式,主時鐘為36 MHz,那么相應的I2C外設就工作在從機接收模式。從仿真圖中看到,發(fā)送器DR的第一個數(shù)據(jù)是從機的7位設備地址和1位寫標志,第二個和第三個數(shù)據(jù)是發(fā)送到從機的數(shù)據(jù)。此外,當DR為空且在下一個字節(jié)的ACK階段MCU仍然沒有寫數(shù)據(jù)到DR,則此時SR也為空,即圖中i2c_txe與i2c_btf同時為高時,SCL總線會持續(xù)保持低電平,直到MCU寫數(shù)據(jù)到DR,同時SCL總線被釋放為高電平,且SCL與SDA必須滿足數(shù)據(jù)建立時間;仿真結果表明主機的發(fā)送數(shù)據(jù)與從機的接收數(shù)據(jù)一致。
圖5 I2C快速模式、7位地址模式的仿真波形
圖6 是對I2C總線控制器與I2C外設模型進行仿真,驗證I2C總線控制器的標準100 kHz模式和10位地址模式。將其配置為主機接收模式,主時鐘為20MHz,主機DR的第一個數(shù)據(jù)是從機的10位設備地址的Header地址和1位寫標志(11110100),第二個數(shù)據(jù)是從機的10位設備地址的Address地址(10010010),所以發(fā)送的從機10位設備地址是0x292;因為配置為接收模式,重新發(fā)送START和Header,同時改變傳輸方向為讀標志(11110101),工作流程見圖4;此外,i2c_rxne標志為高時表示一個字節(jié)接收完畢,等待MCU讀取數(shù)據(jù),一旦MCU完成讀DR操作,該標志就硬件自動清除。
圖6 I2C標準模式、10位地址模式的仿真波形
圖7 是對I2C總線控制器與SMBus外設模型進行仿真,驗證SMBus的PEC功能。將其配置為SMBus工作速度10 kHz,7位地址模式,主時鐘為8 MHz;仿真中主機和從機都使能了PEC功能,從地址字節(jié)以及讀寫位開始進行串行CRC計算,計算得到的字節(jié)就是本字節(jié)的校驗結果,將其存入PECR,再接著對數(shù)據(jù)字節(jié)的每一位進行串行CRC計算,計算得到的字節(jié)就是前面所有信息字節(jié)的校驗結果,將其更新到PECR,依次計算得到最后的校驗結果,存入PECR,同時發(fā)送器將PECR作為最后一個字節(jié)發(fā)送到SDA總線,而接收器將最后一個字節(jié)接收存入DR,同時與接收器的PECR進行比較,從仿真結果判斷二者的數(shù)據(jù)是一致的。
圖7 SMBus工作速度10 kHz、7位地址模式、帶PEC校驗的仿真波形
圖8 是對I2C總線控制器與SMBus外設模型進行仿真,驗證SMBus的超時檢測功能。將其配置為SMBus工作速度100 kHz,7位地址模式,主時鐘為8 MHz,根據(jù)公式(5)配置 I2C_timeoutr為 0x13880;從仿真圖中看到,主機在地址響應階段,MCU沒有寫入數(shù)據(jù)到DR,硬件一直保持SCL低電平,發(fā)生時鐘拉伸現(xiàn)象,當累積時鐘拉伸超時計數(shù)器計數(shù)到0x13880時,主機發(fā)生時鐘低電平擴展累計時間超時,那么I2C_timeout標志置高,同時硬件自動產(chǎn)生一個STOP條件,傳輸結束。
圖8 SMBus工作速度100 kHz、7位地址模式、超時檢測的仿真波形
本設計在功能仿真正確之后,進一步確定其可實現(xiàn)性和時序滿足性。利用Synopsys公司的綜合工具Design Compiler,在0.11 μm eFlash工藝下對本設計進行綜合,得到如下性能:門數(shù)約4571,動態(tài)功耗為0.0137mW/MHz,同時對綜合網(wǎng)表也進行了全面的驗證。
本文實現(xiàn)了一種片上兼容SMBus協(xié)議的I2C總線控制器的設計,該設計基于APB總線,采用模塊化設計,層次分明,編寫的Verilog HDL代碼是可綜合的,且與目前SOC系統(tǒng)中廣泛使用的AMBA總線系統(tǒng)具有良好的兼容性;該控制器有多種工作模式,同時支持I2C和SMBus的通信格式和通信時序,在節(jié)省硬件資源的同時還節(jié)省了芯片管腳資源;最后,通過仿真驗證了該控制器的總線通信穩(wěn)定性。