基于FPGA的多路I2C總線(xiàn)設計與實(shí)現
摘 要: 介紹了一種基于FPGA的多路I2C總線(xiàn)設計與實(shí)現。主要包括系統處理器、局部總線(xiàn)、FPGA邏輯模塊、負載設備幾部分,實(shí)現了從處理器局部總線(xiàn)到I2C協(xié)議的轉換及其多路擴展,使系統具有多個(gè)I2C總線(xiàn)通道,且每一路I2C總線(xiàn)上能掛載多個(gè)不同的主設備或從設備。該系統中各路I2C總線(xiàn)相互獨立工作,沒(méi)有干擾和影響。
關(guān)鍵詞: I2C;可編程邏輯門(mén)陣列;狀態(tài)機
I2C(Inter-Integrated Circuit)總線(xiàn)是由Philips公司開(kāi)發(fā)的用于IC器件之間連接的二線(xiàn)制總線(xiàn),其為雙向、兩線(xiàn)、串行、多主控接口標準,具有總線(xiàn)仲裁機制,非常適合器件之間近距離、非經(jīng)常性的數據通信。由于其具有接口線(xiàn)少、控制方式簡(jiǎn)化、器件封裝形式小、通信速率較高等優(yōu)點(diǎn),I2C總線(xiàn)的應用非常廣泛[1]。
在工業(yè)監控系統中需要有多路I2C總線(xiàn)控制器來(lái)完成溫度、電壓、濕度等各個(gè)方面的監控功能。但是,目前很多系統沒(méi)有或者只有很少通道的I2C總線(xiàn)接口,使其應用受到了限制。
基于上述技術(shù)現狀,本文通過(guò)現場(chǎng)可編程門(mén)陣列FPGA(Field Programmable Gate Array)實(shí)現一種多路I2C總線(xiàn)的系統控制設計。
系統硬件設計
FPGA作為ASIC專(zhuān)用集成電路領(lǐng)域中的一種半定制電路,可以解決定制電路的不足,又克服了原有可編程器件門(mén)電路數有限的缺點(diǎn),具有設計周期短、開(kāi)發(fā)費用低、保密性強、體積小、重量輕、可靠性高等特點(diǎn)[2]。
本系統主要由系統處理器、局部總線(xiàn)、FPGA邏輯模塊、負載設備幾部分組成。其中系統處理器采用Freescale公司的MPC8245[3]。
具有多路I2C總線(xiàn)的系統硬件設計框圖如圖1所示。
處理器利用局部總線(xiàn),通過(guò)地址線(xiàn)、數據線(xiàn)、讀寫(xiě)信號線(xiàn)和片選信號線(xiàn)與FPGA邏輯模塊進(jìn)行通信,在FPGA內部完成I2C總線(xiàn)控制器的功能,實(shí)現從處理器局部總線(xiàn)到I2C協(xié)議的轉換和多路擴展,其中每個(gè)I2C總線(xiàn)控制器掛載多個(gè)不同的設備,可以是主設備或從設備。
FPGA邏輯模塊設計
多路I2C總線(xiàn)的系統控制中,FPGA邏輯模塊的設計是核心。該模塊主要由三部分組成:頂層控制模塊、處理器接口模塊、多路I2C總線(xiàn)控制器模塊。模塊化的設計便于移植和軟件重用。其中FPGA芯片采用XILINX公司的SPARTAN3A系列的芯片,開(kāi)發(fā)平臺為ISE10.1。
頂層控制模塊
頂層控制模塊主要實(shí)現處理器接口模塊與多路I2C總線(xiàn)控制器模塊之間的連接與通信,實(shí)現整個(gè)輸入輸出接口到各個(gè)功能模塊之間的映射。三者之間的邏輯關(guān)系如圖2所示。
處理器接口模塊
MPC8245處理器接口模塊主要完成MPC8245處理器與FPGA的接口功能,并實(shí)現與FPGA內部的多路I2C總線(xiàn)控制器數據傳輸的握手協(xié)議和數據交換。在MPC8245處理器接口模塊中,每個(gè)I2C控制器對應有4個(gè)8位的寄存器,即數據寄存器、地址寄存器、控制寄存器和狀態(tài)寄存器。
(1)數據寄存器根據讀/寫(xiě)信號區分,分為發(fā)送數據緩沖寄存器和接收數據緩沖寄存器,共享一個(gè)地址,數據長(cháng)度為8位。
(2)地址寄存器用來(lái)保存當前地址。當該路I2C控制器作為從節點(diǎn)通信時(shí),地址寄存器中保存的是自己的地址,這個(gè)地址在總線(xiàn)上是唯一的。從節點(diǎn)接收到包頭后,將其中的地址與自己的地址比較,如果一致,則響應主節點(diǎn),開(kāi)始傳輸。
(3)控制寄存器用來(lái)控制I2C總線(xiàn)控制器的數據傳輸,按照設置產(chǎn)生各個(gè)協(xié)議命令、響應動(dòng)作及工作模式。
(4)狀態(tài)寄存器顯示當前總線(xiàn)的狀態(tài)。通過(guò)狀態(tài)寄存器中不同的狀態(tài)指示,實(shí)現與MPC8245處理器的握手協(xié)議。
MPC8245處理器利用地址線(xiàn)、數據線(xiàn)、片選信號和讀寫(xiě)信號來(lái)與MPC8245處理器接口模塊N路I2C總線(xiàn)控制器相關(guān)的N×4個(gè)寄存器交換數據、讀取狀態(tài)、作為從設備時(shí)響應的地址和控制各路I2C總線(xiàn)的控制器。
I2C總線(xiàn)控制器模塊
I2C總線(xiàn)控制器模塊主要實(shí)現并行的I2C通信控制,每一路I2C總線(xiàn)控制器通過(guò)FPGA的I/O管腳連接到外部實(shí)現各自獨立的I2C總線(xiàn),具有主工作模式和從工作模式兩種工作狀態(tài)。
I2C總線(xiàn)控制器主要有兩個(gè)狀態(tài)機:主控制狀態(tài)機和時(shí)鐘生成狀態(tài)機。
主控制狀態(tài)機是整個(gè)I2C總線(xiàn)控制器的核心。時(shí)鐘生成狀態(tài)機只在I2C總線(xiàn)控制器作為主設備時(shí)的模式下工作,是I2C總線(xiàn)通信時(shí)的時(shí)鐘。當I2C總線(xiàn)控制器作為從設備通信時(shí),主控制狀態(tài)機時(shí)鐘由FPGA所實(shí)現的I2C總線(xiàn)上所掛載的I2C主設備提供,整個(gè)I2C總線(xiàn)通信時(shí)的時(shí)鐘為外部主設備提供的時(shí)鐘。
I2C總線(xiàn)控制器狀態(tài)機設計
(1)主控制狀態(tài)機
主控制狀態(tài)機狀態(tài)轉移圖如圖3所示。
IDLE狀態(tài):當I2C上電或者復位后,主控制狀態(tài)機就處于此狀態(tài)。
HEADER狀態(tài):在此狀態(tài),系統根據控制寄存器位MSTA值,發(fā)送或者接收包頭,滿(mǎn)足條件后,轉移到ACK_HEADER狀態(tài);I2C總線(xiàn)控制器中的HEADER移位寄存器與地址寄存器中存放的I2C總線(xiàn)控制器作為從設備時(shí)響應的地址進(jìn)行比較,如果匹配,則表明該路I2C總線(xiàn)控制器為被主設備尋址的從設備,模式立刻切換到從設備模式,同時(shí)狀態(tài)寄存器中的MAAS位被置位,數據線(xiàn)SDA將會(huì )按照TXAK中的設置應答當前主設備。
ACK_HEADER狀態(tài):當該路I2C總線(xiàn)控制器作為主設備時(shí),如果沒(méi)有收到從設備發(fā)送的ACK,則發(fā)送結束信號,返回到IDLE狀態(tài);如果收到ACK,則確定仲裁沒(méi)有丟失,根據控制寄存器位TX值轉到XMIT_DATA或者RCV_DATA狀態(tài);當該路I2C總線(xiàn)控制器作為從設備時(shí),如果地址匹配,則發(fā)送ACK,根據主設備發(fā)送的第一個(gè)字節中的最后一位的值轉到XMIT_DATA或者RCV_DATA狀態(tài)。
XMIT_DATA狀態(tài):在此狀態(tài)時(shí),移位寄存器將數據移到SDA線(xiàn)上。發(fā)送一個(gè)字節完成后,轉移到WAIT_ACK狀態(tài)。
WAIT_ACK狀態(tài):在此狀態(tài)時(shí),如果收到ACK,則返回到XMIT_DATA狀態(tài);如果仲裁丟失,則轉到IDLE狀態(tài);如果沒(méi)有收到ACK,則發(fā)送結束信號,轉移到IDLE狀態(tài)。
RCV_DATA狀態(tài):在此狀態(tài)時(shí),如果檢測到重新啟動(dòng)信號,則返回HEADER狀態(tài);否則,移位寄存器從SDA線(xiàn)上移入數據,以供MPC8245處理器的驅動(dòng)程序讀取,移入一個(gè)字節后,轉到ACK_DATA狀態(tài),控制寄存器中的TXAK位被輸出到數據線(xiàn)SDA。
ACK_DATA狀態(tài):I2C控制器發(fā)送ACK,返回到RCV_DATA狀態(tài)。
(2)時(shí)鐘狀態(tài)機
整個(gè)狀態(tài)機狀態(tài)轉換如圖4所示。
SCL_IDLE狀態(tài):當上電復位后,狀態(tài)機就處于該狀態(tài)。當I2C控制器為主節點(diǎn)并且總線(xiàn)空閑時(shí),收到開(kāi)始標志后,轉移到START狀態(tài)。
START狀態(tài):當在此狀態(tài)時(shí),根據I2C協(xié)議,需要保持一定的時(shí)間,當持續時(shí)間滿(mǎn)足要求時(shí),轉移到SCL_LOW_EDGE狀態(tài),否則保持在START狀態(tài)。
SCL_LOW_EDGE狀態(tài):當在此狀態(tài)時(shí),在下一個(gè)系統時(shí)鐘時(shí),轉移到SCL_LOW狀態(tài)。
SCL_LOW狀態(tài):在此狀態(tài)時(shí),根據控制信號,設置SDA的輸出,根據I2C協(xié)議,需要保持一定的時(shí)間,當保持時(shí)間滿(mǎn)足要求時(shí),轉移到SCL_HIGH_EDGE狀態(tài),否則保持在該狀態(tài);如果仲裁丟失且已經(jīng)傳輸了7個(gè)字節,則轉移到SCL_IDLE狀態(tài)。
SCL_HIGH_EDGE狀態(tài):在此狀態(tài)時(shí),完成一定的操作,持續一個(gè)時(shí)鐘周期后,轉移到SCL_HIGH狀態(tài)。如果SCL輸入為0或者狀態(tài)寄存器中的位MCF=1,則一直停留在該狀態(tài)。
SCL_HIGH狀態(tài):在此狀態(tài)時(shí),如果有重復起始信號,則SCL高電平持續一半時(shí)間,轉移到START狀態(tài);如果有結束信號,則SCL高電平持續一半時(shí)間,轉移到STOP_WAIT狀態(tài);根據I2C協(xié)議,需要保持一定的時(shí)間,當持續時(shí)間滿(mǎn)足要求時(shí),轉移到SCL_LOW_EDGE狀態(tài),否則保持在當前狀態(tài)。
STOP_WAIT狀態(tài):在此狀態(tài)時(shí),根據I2C協(xié)議,需要保持一定的時(shí)間,當持續時(shí)間滿(mǎn)足要求時(shí),轉移到SCL_IDLE狀態(tài)。
系統工作流程
多路I2C總線(xiàn)的系統在系統上電后,處理器通過(guò)FPGA與FPGA相連接的I2C設備通信。
(1)當處理器作為主設備與FPGA所實(shí)現的I2C總線(xiàn)上所掛的從設備進(jìn)行通信時(shí),處理器主體通過(guò)對FPGA內部的該路I2C總線(xiàn)控制器對應的寄存器進(jìn)行操作,根據I2C總線(xiàn)通信協(xié)議,產(chǎn)生起始信號和時(shí)鐘信號,并查詢(xún)狀態(tài)位,對該路I2C總線(xiàn)上的從設備進(jìn)行發(fā)送或者接收數據的操作,在數據交換完成后,產(chǎn)生停止信號,完成整個(gè)通信。
(2)當處理器主體作為從設備與FPGA所實(shí)現的I2C總線(xiàn)上所掛的主設備進(jìn)行通信時(shí),FPGA所實(shí)現的I2C總線(xiàn)上所掛的主設備產(chǎn)生起始信號和時(shí)鐘信號,處理器主體通過(guò)對FPGA內的該路I2C總線(xiàn)控制器對應的數據寄存器進(jìn)行操作,發(fā)送或者接收數據。當通信完成后,FPGA所實(shí)現的I2C總線(xiàn)上所掛的主設備產(chǎn)生停止信號,完成整個(gè)通信。
通過(guò)可編程邏輯器件實(shí)現的多路I2C總線(xiàn)上每一路可以?huà)於鄠€(gè)設備,可以是從設備,也可以是主設備,具體能掛的設備數量受總線(xiàn)電容的限制。
本設計利用可編程邏輯器件,完成對處理器主體I2C總線(xiàn)的擴展,使該處理器能夠有多個(gè)I2C總線(xiàn)通道,每一路I2C總線(xiàn)上可以?huà)燧d多個(gè)不同的設備,可以是主設備,也可以是從設備,滿(mǎn)足不同應用場(chǎng)合的要求。在可編程邏輯器件內,每個(gè)I2C總線(xiàn)控制器僅使用4個(gè)寄存器,大大降低了控制的復雜度,無(wú)需占用較多的CPU資源,系統穩定,執行效率高。
評論