《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于FPGA的多路I2C總線設(shè)計與實現(xiàn)
基于FPGA的多路I2C總線設(shè)計與實現(xiàn)
來源:電子技術(shù)應(yīng)用2011年第4期
陳志列 (研祥智能科技股份有限公司,,廣東 深圳518057)
(研祥智能科技股份有限公司,,廣東 深圳518057)
摘要: 介紹了一種基于FPGA的多路I2C總線設(shè)計與實現(xiàn),。主要包括系統(tǒng)處理器,、局部總線,、FPGA邏輯模塊,、負(fù)載設(shè)備幾部分,,實現(xiàn)了從處理器局部總線到I2C協(xié)議的轉(zhuǎn)換及其多路擴(kuò)展,,使系統(tǒng)具有多個I2C總線通道,且每一路I2C總線上能掛載多個不同的主設(shè)備或從設(shè)備,。該系統(tǒng)中各路I2C總線相互獨(dú)立工作,,沒有干擾和影響,。
Abstract:
Key words :

摘  要: 介紹了一種基于FPGA的多路I2C總線設(shè)計與實現(xiàn),。主要包括系統(tǒng)處理器,、局部總線、FPGA邏輯模塊,、負(fù)載設(shè)備幾部分,實現(xiàn)了從處理器局部總線到I2C協(xié)議的轉(zhuǎn)換及其多路擴(kuò)展,,使系統(tǒng)具有多個I2C總線通道,,且每一路I2C總線上能掛載多個不同的主設(shè)備或從設(shè)備。該系統(tǒng)中各路I2C總線相互獨(dú)立工作,,沒有干擾和影響,。
關(guān)鍵詞: I2C;可編程邏輯門陣列,;狀態(tài)機(jī)

 I2C(Inter-Integrated Circuit)總線是由Philips公司開發(fā)的用于IC器件之間連接的二線制總線,,其為雙向、兩線,、串行,、多主控接口標(biāo)準(zhǔn),具有總線仲裁機(jī)制,,非常適合器件之間近距離,、非經(jīng)常性的數(shù)據(jù)通信。由于其具有接口線少,、控制方式簡化,、器件封裝形式小、通信速率較高等優(yōu)點(diǎn),,I2C總線的應(yīng)用非常廣泛[1],。
    在工業(yè)監(jiān)控系統(tǒng)中需要有多路I2C總線控制器來完成溫度,、電壓、濕度等各個方面的監(jiān)控功能,。但是,,目前很多系統(tǒng)沒有或者只有很少通道的I2C總線接口,使其應(yīng)用受到了限制,。
    基于上述技術(shù)現(xiàn)狀,,本文通過現(xiàn)場可編程門陣列FPGA(Field Programmable Gate Array)實現(xiàn)一種多路I2C總線的系統(tǒng)控制設(shè)計。
系統(tǒng)硬件設(shè)計
    FPGA作為ASIC專用集成電路領(lǐng)域中的一種半定制電路,,可以解決定制電路的不足,,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn),具有設(shè)計周期短,、開發(fā)費(fèi)用低,、保密性強(qiáng)、體積小,、重量輕,、可靠性高等特點(diǎn)[2]。
  本系統(tǒng)主要由系統(tǒng)處理器,、局部總線,、FPGA邏輯模塊、負(fù)載設(shè)備幾部分組成,。其中系統(tǒng)處理器采用Freescale公司的MPC8245[3],。
    具有多路I2C總線的系統(tǒng)硬件設(shè)計框圖如圖1所示。

    處理器利用局部總線,,通過地址線,、數(shù)據(jù)線、讀寫信號線和片選信號線與FPGA邏輯模塊進(jìn)行通信,,在FPGA內(nèi)部完成I2C總線控制器的功能,,實現(xiàn)從處理器局部總線到I2C協(xié)議的轉(zhuǎn)換和多路擴(kuò)展,其中每個I2C總線控制器掛載多個不同的設(shè)備,,可以是主設(shè)備或從設(shè)備,。
FPGA邏輯模塊設(shè)計
    多路I2C總線的系統(tǒng)控制中,F(xiàn)PGA邏輯模塊的設(shè)計是核心,。該模塊主要由三部分組成:頂層控制模塊,、處理器接口模塊、多路I2C總線控制器模塊,。模塊化的設(shè)計便于移植和軟件重用,。其中FPGA芯片采用XILINX公司的SPARTAN3A系列的芯片,開發(fā)平臺為ISE10.1,。
頂層控制模塊
    頂層控制模塊主要實現(xiàn)處理器接口模塊與多路I2C總線控制器模塊之間的連接與通信,,實現(xiàn)整個輸入輸出接口到各個功能模塊之間的映射,。三者之間的邏輯關(guān)系如圖2所示。

處理器接口模塊
    MPC8245處理器接口模塊主要完成MPC8245處理器與FPGA的接口功能,,并實現(xiàn)與FPGA內(nèi)部的多路I2C總線控制器數(shù)據(jù)傳輸?shù)奈帐謪f(xié)議和數(shù)據(jù)交換,。在MPC8245處理器接口模塊中,每個I2C控制器對應(yīng)有4個8位的寄存器,,即數(shù)據(jù)寄存器,、地址寄存器、控制寄存器和狀態(tài)寄存器,。
    (1)數(shù)據(jù)寄存器根據(jù)讀/寫信號區(qū)分,,分為發(fā)送數(shù)據(jù)緩沖寄存器和接收數(shù)據(jù)緩沖寄存器,共享一個地址,,數(shù)據(jù)長度為8位,。
    (2)地址寄存器用來保存當(dāng)前地址。當(dāng)該路I2C控制器作為從節(jié)點(diǎn)通信時,,地址寄存器中保存的是自己的地址,,這個地址在總線上是唯一的。從節(jié)點(diǎn)接收到包頭后,,將其中的地址與自己的地址比較,,如果一致,則響應(yīng)主節(jié)點(diǎn),,開始傳輸,。
    (3)控制寄存器用來控制I2C總線控制器的數(shù)據(jù)傳輸,按照設(shè)置產(chǎn)生各個協(xié)議命令,、響應(yīng)動作及工作模式。
    (4)狀態(tài)寄存器顯示當(dāng)前總線的狀態(tài),。通過狀態(tài)寄存器中不同的狀態(tài)指示,,實現(xiàn)與MPC8245處理器的握手協(xié)議。
    MPC8245處理器利用地址線,、數(shù)據(jù)線,、片選信號和讀寫信號來與MPC8245處理器接口模塊N路I2C總線控制器相關(guān)的N×4個寄存器交換數(shù)據(jù)、讀取狀態(tài),、作為從設(shè)備時響應(yīng)的地址和控制各路I2C總線的控制器,。
I2C總線控制器模塊
    I2C總線控制器模塊主要實現(xiàn)并行的I2C通信控制,每一路I2C總線控制器通過FPGA的I/O管腳連接到外部實現(xiàn)各自獨(dú)立的I2C總線,,具有主工作模式和從工作模式兩種工作狀態(tài),。
    I2C總線控制器主要有兩個狀態(tài)機(jī):主控制狀態(tài)機(jī)和時鐘生成狀態(tài)機(jī)。
    主控制狀態(tài)機(jī)是整個I2C總線控制器的核心,。時鐘生成狀態(tài)機(jī)只在I2C總線控制器作為主設(shè)備時的模式下工作,,是I2C總線通信時的時鐘,。當(dāng)I2C總線控制器作為從設(shè)備通信時,主控制狀態(tài)機(jī)時鐘由FPGA所實現(xiàn)的I2C總線上所掛載的I2C主設(shè)備提供,,整個I2C總線通信時的時鐘為外部主設(shè)備提供的時鐘,。
I2C總線控制器狀態(tài)機(jī)設(shè)計
      (1)主控制狀態(tài)機(jī)
      主控制狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移圖如圖3所示。

      IDLE狀態(tài):當(dāng)I2C上電或者復(fù)位后,,主控制狀態(tài)機(jī)就處于此狀態(tài),。
      HEADER狀態(tài):在此狀態(tài),系統(tǒng)根據(jù)控制寄存器位MSTA值,,發(fā)送或者接收包頭,,滿足條件后,轉(zhuǎn)移到ACK_HEADER狀態(tài),;I2C總線控制器中的HEADER移位寄存器與地址寄存器中存放的I2C總線控制器作為從設(shè)備時響應(yīng)的地址進(jìn)行比較,,如果匹配,則表明該路I2C總線控制器為被主設(shè)備尋址的從設(shè)備,,模式立刻切換到從設(shè)備模式,,同時狀態(tài)寄存器中的MAAS位被置位,數(shù)據(jù)線SDA將會按照TXAK中的設(shè)置應(yīng)答當(dāng)前主設(shè)備,。
    ACK_HEADER狀態(tài):當(dāng)該路I2C總線控制器作為主設(shè)備時,,如果沒有收到從設(shè)備發(fā)送的ACK,則發(fā)送結(jié)束信號,,返回到IDLE狀態(tài),;如果收到ACK,則確定仲裁沒有丟失,,根據(jù)控制寄存器位TX值轉(zhuǎn)到XMIT_DATA或者RCV_DATA狀態(tài),;當(dāng)該路I2C總線控制器作為從設(shè)備時,如果地址匹配,,則發(fā)送ACK,,根據(jù)主設(shè)備發(fā)送的第一個字節(jié)中的最后一位的值轉(zhuǎn)到XMIT_DATA或者RCV_DATA狀態(tài)。
    XMIT_DATA狀態(tài):在此狀態(tài)時,,移位寄存器將數(shù)據(jù)移到SDA線上,。發(fā)送一個字節(jié)完成后,轉(zhuǎn)移到WAIT_ACK狀態(tài),。
    WAIT_ACK狀態(tài):在此狀態(tài)時,,如果收到ACK,則返回到XMIT_DATA狀態(tài),;如果仲裁丟失,,則轉(zhuǎn)到IDLE狀態(tài);如果沒有收到ACK,則發(fā)送結(jié)束信號,,轉(zhuǎn)移到IDLE狀態(tài),。
    RCV_DATA狀態(tài):在此狀態(tài)時,如果檢測到重新啟動信號,,則返回HEADER狀態(tài),;否則,移位寄存器從SDA線上移入數(shù)據(jù),,以供MPC8245處理器的驅(qū)動程序讀取,,移入一個字節(jié)后,轉(zhuǎn)到ACK_DATA狀態(tài),,控制寄存器中的TXAK位被輸出到數(shù)據(jù)線SDA,。
    ACK_DATA狀態(tài):I2C控制器發(fā)送ACK,返回到RCV_DATA狀態(tài),。
    (2)時鐘狀態(tài)機(jī)
    整個狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換如圖4所示,。

    SCL_IDLE狀態(tài):當(dāng)上電復(fù)位后,狀態(tài)機(jī)就處于該狀態(tài),。當(dāng)I2C控制器為主節(jié)點(diǎn)并且總線空閑時,,收到開始標(biāo)志后,轉(zhuǎn)移到START狀態(tài),。
    START狀態(tài):當(dāng)在此狀態(tài)時,,根據(jù)I2C協(xié)議,需要保持一定的時間,,當(dāng)持續(xù)時間滿足要求時,,轉(zhuǎn)移到SCL_LOW_EDGE狀態(tài),否則保持在START狀態(tài),。
    SCL_LOW_EDGE狀態(tài):當(dāng)在此狀態(tài)時,,在下一個系統(tǒng)時鐘時,轉(zhuǎn)移到SCL_LOW狀態(tài),。
    SCL_LOW狀態(tài):在此狀態(tài)時,,根據(jù)控制信號,設(shè)置SDA的輸出,,根據(jù)I2C協(xié)議,需要保持一定的時間,,當(dāng)保持時間滿足要求時,,轉(zhuǎn)移到SCL_HIGH_EDGE狀態(tài),否則保持在該狀態(tài),;如果仲裁丟失且已經(jīng)傳輸了7個字節(jié),,則轉(zhuǎn)移到SCL_IDLE狀態(tài)。
    SCL_HIGH_EDGE狀態(tài):在此狀態(tài)時,完成一定的操作,,持續(xù)一個時鐘周期后,,轉(zhuǎn)移到SCL_HIGH狀態(tài)。如果SCL輸入為0或者狀態(tài)寄存器中的位MCF=1,,則一直停留在該狀態(tài),。
    SCL_HIGH狀態(tài):在此狀態(tài)時,如果有重復(fù)起始信號,,則SCL高電平持續(xù)一半時間,,轉(zhuǎn)移到START狀態(tài);如果有結(jié)束信號,,則SCL高電平持續(xù)一半時間,,轉(zhuǎn)移到STOP_WAIT狀態(tài);根據(jù)I2C協(xié)議,,需要保持一定的時間,,當(dāng)持續(xù)時間滿足要求時,轉(zhuǎn)移到SCL_LOW_EDGE狀態(tài),,否則保持在當(dāng)前狀態(tài),。
    STOP_WAIT狀態(tài):在此狀態(tài)時,根據(jù)I2C協(xié)議,,需要保持一定的時間,,當(dāng)持續(xù)時間滿足要求時,轉(zhuǎn)移到SCL_IDLE狀態(tài),。
系統(tǒng)工作流程
    多路I2C總線的系統(tǒng)在系統(tǒng)上電后,,處理器通過FPGA與FPGA相連接的I2C設(shè)備通信。
    (1)當(dāng)處理器作為主設(shè)備與FPGA所實現(xiàn)的I2C總線上所掛的從設(shè)備進(jìn)行通信時,,處理器主體通過對FPGA內(nèi)部的該路I2C總線控制器對應(yīng)的寄存器進(jìn)行操作,,根據(jù)I2C總線通信協(xié)議,產(chǎn)生起始信號和時鐘信號,,并查詢狀態(tài)位,,對該路I2C總線上的從設(shè)備進(jìn)行發(fā)送或者接收數(shù)據(jù)的操作,在數(shù)據(jù)交換完成后,,產(chǎn)生停止信號,,完成整個通信。
    (2)當(dāng)處理器主體作為從設(shè)備與FPGA所實現(xiàn)的I2C總線上所掛的主設(shè)備進(jìn)行通信時,,F(xiàn)PGA所實現(xiàn)的I2C總線上所掛的主設(shè)備產(chǎn)生起始信號和時鐘信號,,處理器主體通過對FPGA內(nèi)的該路I2C總線控制器對應(yīng)的數(shù)據(jù)寄存器進(jìn)行操作,發(fā)送或者接收數(shù)據(jù),。當(dāng)通信完成后,,F(xiàn)PGA所實現(xiàn)的I2C總線上所掛的主設(shè)備產(chǎn)生停止信號,完成整個通信。
    通過可編程邏輯器件實現(xiàn)的多路I2C總線上每一路可以掛多個設(shè)備,,可以是從設(shè)備,,也可以是主設(shè)備,具體能掛的設(shè)備數(shù)量受總線電容的限制,。
    本設(shè)計利用可編程邏輯器件,,完成對處理器主體I2C總線的擴(kuò)展,使該處理器能夠有多個I2C總線通道,,每一路I2C總線上可以掛載多個不同的設(shè)備,,可以是主設(shè)備,也可以是從設(shè)備,,滿足不同應(yīng)用場合的要求,。在可編程邏輯器件內(nèi),每個I2C總線控制器僅使用4個寄存器,,大大降低了控制的復(fù)雜度,,無需占用較多的CPU資源,系統(tǒng)穩(wěn)定,,執(zhí)行效率高,。
參考文獻(xiàn)
[1] The I2C-Bus Specification Versiom 2.1. Philips Semiconductors,January 2000.
[2] CILETTI M D. Verilog-HDL 高級數(shù)字設(shè)計[M].北京:電子工業(yè)出版社,,2005.
[3] Freescale Semiconductor.MPC8245 Integrated Processor Reference Manual.http://www.freescale.com.cn/.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。