I2C總線(xiàn)是兩線(xiàn)式串行總線(xiàn),用于連接微控制器及其外圍設備。該總線(xiàn)具有如下特點(diǎn):1)只要求兩條總線(xiàn)線(xiàn)路,一條串行數據線(xiàn)(SDA),一條串行時(shí)鐘線(xiàn)(SDL);2)每個(gè)連接到總線(xiàn)的器件都可以通過(guò)唯一的地址尋址,總線(xiàn)中主機可以作為主機發(fā)送器或主機接收器;3)它是一個(gè)真正的多主機總線(xiàn),如果兩個(gè)或更多主機同時(shí)初始化數據傳輸可以通過(guò)沖突檢測和仲裁防止數據被破壞;4)雙向數據傳輸位速率在標準模式下可達100 kbit/s快速模式下可達400kbit/s高速模式下可達3.4 Mbit/s;5)片上的濾波器可以濾去總線(xiàn)數據線(xiàn)上的毛刺以保證數據完整;6)連接到相同總線(xiàn)的IC數量只受到總線(xiàn)的最大電容400 pF限制。I2C總線(xiàn)最主要的優(yōu)點(diǎn)是其簡(jiǎn)單性和有效性。由于I2C總線(xiàn)為兩線(xiàn)式總線(xiàn),它占用的空間非常小,減少了電路板的空間和芯片管腳的數量,降低了互聯(lián)成本。它支持多主控制(multimastering),總線(xiàn)中任何能夠進(jìn)行發(fā)送和接收的設備都可以成為主機。任何主機都能夠控制總線(xiàn)信號的傳輸和時(shí)鐘頻率。在任何時(shí)間點(diǎn)上只能有一個(gè)器件作為主機,其他器件作為從機。正是由于I2C總線(xiàn)具有上述諸多優(yōu)點(diǎn),具備I2C接口的器件在儀器設計中已被廣泛采用,比較常見(jiàn)的如:日歷芯片、存儲芯片、模數轉換器以及數模轉換器等。 不幸的是大多數CPU都擅長(cháng)操作并口,而并不具備直接操作I2C總線(xiàn)接口的能力。在系統設計時(shí),為了與具有I2C總線(xiàn)接口的芯片連接,經(jīng)常采用的方法是:利用CPU的2條通用輸入輸出(GPIO)線(xiàn)作為I2C總線(xiàn)使用,用軟件模擬的方法,產(chǎn)生I2C總線(xiàn)需要的控制時(shí)序。該方法雖然可以達到同I2C器件連接的目的,卻不可避免地帶來(lái)軟件編制復雜、占用CPU處理時(shí)間多的弊端。為了在不增加編程難度、不大量占用CPU處理時(shí)間的前提下使不具備I2C總線(xiàn)的CPU也能夠充分享受I2C總線(xiàn)的優(yōu)點(diǎn),本文設計了一種基于CPLD的8位并行接口轉I2C總線(xiàn)接口的控制模塊,通過(guò)該模塊,具有并口的CPU可以通過(guò)對并口的讀寫(xiě)完成對I2C總線(xiàn)的控制。 1 I2C總線(xiàn)的基本時(shí)序 I2C總線(xiàn)是由數據線(xiàn)SDA和時(shí)鐘線(xiàn)SCL構成,靠它們在連接于I2C總線(xiàn)的各個(gè)設備之間傳送信息。I2C總線(xiàn)在傳送數據過(guò)程中共有4種類(lèi)型的信號,分別是:開(kāi)始信號、結束信號、應答信號和數據傳輸信號。 開(kāi)始信號:主機控制SDA信號線(xiàn)在SCL線(xiàn)的高電平期間發(fā)生由高電平到低電平的跳變,通知從機開(kāi)始數據傳輸。 結束信號:主機控制SDA信號線(xiàn)在SCL線(xiàn)的高電平期間發(fā)生由低電平到高電平的跳變,通知從機本次數據傳輸結束。 應答信號:接收數據的芯片(主機或者從機)在完整接收到8位數據后,向發(fā)送數據的芯片發(fā)出低電平信號,通知發(fā)送的數據已被接收。發(fā)送數據的芯片應根據應答信號的電平高低判斷數據是否被接收芯片接收。 數據傳輸信號:發(fā)送數據的芯片在SCL脈沖控制下在SDA上串行輸出數據信號,SDA只能在SCL為低電平期間改變狀態(tài),在SCL為高電平期間應保持穩定。 I2C總線(xiàn)上的數據傳輸主要有4種模式,分別是:字節寫(xiě)、頁(yè)面寫(xiě)、當前地址讀、隨機地址讀和順序讀。 字節寫(xiě):對給定的芯片的確定地址單元寫(xiě)入一個(gè)字節的數據。 頁(yè)面寫(xiě):對給定的芯片的確定地址單元所在頁(yè)面連續寫(xiě)入全部的數據。 當前地址讀:讀出當前地址單元中的一個(gè)字節數據。 隨機地址讀:從給定的芯片的確定地址單元中讀出一個(gè)字節數據。 順序讀:從給定的地址后連續讀出n個(gè)字節的數據。 I2C總線(xiàn)各種信號及數據傳輸模式示意圖如圖1所示。 ![]() 利用CPLD設計一種模塊,如果能夠將CPU發(fā)出的并行數據按上述I2C總線(xiàn)數據傳輸模式自動(dòng)轉換成串行數據輸出,同時(shí)將接收到的I2C總線(xiàn)串行數據自動(dòng)轉換成并行數據供CPU讀取,則不具備I2C總線(xiàn)接口的CPU也能通過(guò)對并口的操作輕松實(shí)現與I2C總線(xiàn)連接并同其他具備I2C總線(xiàn)接口的芯片交換數據。為此本文設計了一種基于CPLD的工作于I2C總線(xiàn)主機模式的并口轉I2C總線(xiàn)模塊。利用該模塊CPU可以很容易地實(shí)現與I2C總線(xiàn)的接口。 2 I2C總線(xiàn)接口模塊的CPLD實(shí)現 上面簡(jiǎn)要介紹了I2C總線(xiàn)的信號以及I2C總線(xiàn)的數據傳輸模式,如果要使接口模塊正常工作,CPU必須首先要通知模塊執行什么操作,而后再把需要的數據依次送入模塊中,考慮到I2C總線(xiàn)的速率可以在0~3.4 Mbit/s之間,為了適應不同外設的需要,模塊還應在CPU的控制下自由調整數據傳送速率。因此,CPU應能夠向模塊發(fā)送數據傳送速率控制數據、I2C總線(xiàn)工作模式控制數據、信息交換數據,同時(shí)還能從模塊 中讀取工作狀態(tài)數據、模塊接收數據。據此設計出基于CPLD的I2C總線(xiàn)接口模塊如圖2所示。 ![]() 該設計由7個(gè)單元組成,它們分別是:用于調整I2C總線(xiàn)數據傳輸速率的Clock單元;用于實(shí)現同CPU并行接口的PcPort單元:用于產(chǎn)生I2C總線(xiàn)工作時(shí)序的I2CStep單元;用于產(chǎn)生數據傳輸時(shí)序的BitTiming單元;用于產(chǎn)生I2C總線(xiàn)使能信號的En12C單元:用于產(chǎn)生I2C總線(xiàn)接口模塊工作狀態(tài)指示的Status單元:以及用于產(chǎn)生I2C接口時(shí)鐘信號SDL和數據串行輸入輸出信號SDA的I2CPORT單元。 2.1 Clock單元 整個(gè)接口模塊以CPU的系統時(shí)鐘作為主時(shí)鐘信號,模塊傳輸數據的速率受該時(shí)鐘頻率的控制,時(shí)鐘頻率高則模塊傳輸數據的速率也高,反之亦然?紤]到各種具有I2C總線(xiàn)接口的芯片的工作速率差別較大(從幾十kB/s到幾MB/s),該接口模塊的工作速率必須能夠靈活調整,以適應不同外設芯片的接口需要。 Clock單元實(shí)際上就是一個(gè)分頻器,它在輸出頻率控制碼CKSEL[7..0]的控制下產(chǎn)生對PCCLK分頻后合適的時(shí)鐘信號供I2C接口使用。 2.2 I2CStep單元 通過(guò)對圖1中I2C總線(xiàn)各種工作模式的分析,可知不同的工作模式都是按特定的工作流程串行輸入、輸出數據的,例如字節寫(xiě)模式的工作流程為:發(fā)送開(kāi)始信號、串行輸出被叫芯片的片選地址、發(fā)送寫(xiě)信號、等待被叫芯片響應、串行輸出被叫芯片存儲單元的地址、等待被叫芯片響應、串行輸出寫(xiě)入的數據、等待被叫芯片響應、發(fā)送結束信號結束本次操作。 為了使接口模塊正確工作,模塊在接收到來(lái)自CPU的工作模式控制信號I2CMD[2..0]后,根據工作模式的不同產(chǎn)生接口模塊工作流程。當前流程結束后由Status單元產(chǎn)生IncStep信號,控制工作流程指向下一階段。該模塊的功能類(lèi)似一個(gè)計數器,它在I2CMD[2..0]和I2CStep的共同作用下,產(chǎn)生長(cháng)度不等的工作流程信號Step[6..0]。 2.3 BitTiming單元 在I2C總線(xiàn)工作流程的不同階段,I2C接口模塊需要按一定的時(shí)序完成不同的工作,通過(guò)對總線(xiàn)數據傳輸模式的分析可知,在一個(gè)數據傳輸模式的所有工作流程中,輸入、輸出8位數據的工作流程用時(shí)最長(cháng),需要25個(gè)工作時(shí)序周期,為了滿(mǎn)足所有工作流程的需要,工作時(shí)序Bit-Timing單元被設計成最長(cháng)可產(chǎn)生31個(gè)時(shí)鐘周期的工作時(shí)序。 該單元在IncStep=‘1’時(shí)復位工作時(shí)序;在EnTiming信號有效后的每個(gè)SysCLK的上升沿使工作時(shí)序信號EnTiming加1,用于控制I2CPORT單元按給定的時(shí)序串行輸入、輸出數據信息。 2.4 Status單元 在I2C總線(xiàn)工作過(guò)程中,CPU需要隨時(shí)了解I2C接口模塊的發(fā)送數據寄存器是否為空、接收數據寄存器是否準備數據好、從機響應信號是否正確、當前工作流程是否完成等工作狀態(tài),只有在發(fā)送數據寄存器為空時(shí),CPU才可以向接口模塊寫(xiě)入待傳輸數據;只有在接收數據寄存器數據準備好后,CPU才可以從接口模塊讀入正確的接收數據;從機響應信號不正確時(shí),CPU應立即發(fā)出結束信號結束本次操作;當前工作流程未完成前不能進(jìn)行下一流程。這些狀態(tài)信號全部由Status單元產(chǎn)生。 在該單元中,共有4種輸出信號,它們分別是:用于指示發(fā)送數據寄存器是否為空的TxSTS狀態(tài),該狀態(tài)在CPU寫(xiě)入數據后置‘1’,數據被發(fā)送后清‘0’;用于指示接收數據準備好狀態(tài)的RxSTS信號,該信號在模塊接收到完整的數據后置‘1’,數據被CPU讀走后清‘0’;用于指示模塊工作狀態(tài)的ACKSTS信號,該信號在模塊工作正常(接收到從機響應信號)時(shí)自動(dòng)置‘1’,工作不正常時(shí)自動(dòng)清‘0’;用于使工作流程指向下一階段的IncStep信號,該信號在當前工作流程完成后由模塊自動(dòng)產(chǎn)生,用于使模塊的工作流程指向下一階段。 2.5 EnI2C單元 在I2C總線(xiàn)接口模塊中,BitTiming單元何時(shí)開(kāi)始產(chǎn)生工作時(shí)序,需要時(shí)序信號控制,I2CPORT單元何時(shí)向I2C總線(xiàn)輸出信息、何時(shí)從I2C總線(xiàn)上讀入信息也需要時(shí)序信號控制。這些控制時(shí)序的產(chǎn)生由EnI2C單元完成。 EnI2C單元在I2CMD[2..0]、Step[6..0]、TxSTS、RxSTS等信號的控制下,從預先存儲于單元內部的一組I2C工作時(shí)序信息中讀出當前的時(shí)序信息輸出,控制BitTiming和I2CPORT單元工作。 模塊中,預先存儲的I2C工作時(shí)序信息實(shí)現如下: ![]() ![]() ![]() 2.6 12CPORT單元 本單元是整個(gè)設計的核心,用于完成數據的I2C總線(xiàn)輸出以及I2C總線(xiàn)輸入數據的讀入。同時(shí)產(chǎn)生接口模塊的各種工作狀態(tài)。 該單元的工作過(guò)程為:在SysCLK的下降沿分別讀入工作使能信號和工作時(shí)序信號,如果此時(shí)EnIdle=‘1’則強制I2C總線(xiàn)進(jìn)入空閑模式;如果EnStart=‘1’,則使I2C總線(xiàn)輸出開(kāi)始信號;如果EnWrite=‘1’,則使I2C總線(xiàn)輸出8位數據信號;如果EnInACK=‘1’,則從I2C總線(xiàn)讀入從機響應信號;如果EnRead=‘1’,則從I2C總線(xiàn)讀入8位數據;如果EnOutACK=‘1’。則使I2C總線(xiàn)輸出主機響應信號;如果EnStop=‘1’,則使I2C總線(xiàn)輸出結束信號;在整個(gè)工作過(guò)程中,模塊會(huì )自動(dòng)根據工作情況,設置各種狀態(tài)控制信號。 圖3是用QuartusII9.0對該單元仿真的時(shí)序圖。 ![]() 2.7 PcPort單元的實(shí)現 該單元是模塊與CPU的接口,CPU通過(guò)該單元向接口模塊寫(xiě)入工作模式控制信息、需要發(fā)送的數據以及I2C工作速度控制信息;同時(shí)通過(guò)該單元讀入從機響應信息、從機輸出數據、發(fā)送接收寄存器狀態(tài)等信息。 3 應用實(shí)例 該模塊工作于主模式,主要應用于沒(méi)有I2C專(zhuān)用接口的CPU通過(guò)并口方便地與具有I2C接口的外設連接并交換信息。 圖4給出了CPU通過(guò)該模塊與X24C04E2PROM接口的例子。 ![]() 在圖中,PC104 CPU通過(guò)數據總線(xiàn)、地址總線(xiàn)、讀、寫(xiě)信號線(xiàn)與I2C接口模塊相連,I2C接口模塊則通過(guò)SDL、SDA與X24C04相連,PC104CPU輸出的并行數據,經(jīng)過(guò)I2C接口模塊轉換后變成符合I2C總線(xiàn)模式要求的串行數據輸出到X24C04,X24C04輸出的串行數據經(jīng)過(guò)I2C接口模塊轉換后,變成并行數據供PC104CPU讀取。使用該模塊后CPU操作I2C總線(xiàn)就像操作并口一樣方便。該電路的控制軟件流程如圖5所示。 ![]() 通過(guò)上述應用實(shí)例可以看出,本文設計的接口模塊只能工作于主機模式,并且在整個(gè)系統中只能有一個(gè)主機工作。在從機因處理其他工作而暫不能響應主機時(shí),模塊沒(méi)有設計等待功能,只能發(fā)送總線(xiàn)結束信號結束當前操作,待從機空閑時(shí)再重新開(kāi)始通信。 4 結論 本設計的創(chuàng )新點(diǎn)在于:通過(guò)CPLD實(shí)現并口到I2C總線(xiàn)接口的轉換,可以使不具備I2C總線(xiàn)接口的CPU通過(guò)并口方便地控制I2C總線(xiàn)設備,使用該模塊可以簡(jiǎn)化控制軟件的編程,加快系統設計的實(shí)現,在I2C總線(xiàn)操作過(guò)程中,轉換模塊自動(dòng)發(fā)出開(kāi)始信號、結束信號,不需要CPU干預。 本文設計的I2C接口模塊只能工作于主模式,只能應用于主機系統;在模塊的設計中,沒(méi)有考慮多主機的情況,對多主機的總線(xiàn)競爭沒(méi)有設計仲裁功能;模塊的頁(yè)面讀寫(xiě)數據數不能超過(guò)32個(gè)字節,在32個(gè)字節之內,CPU可以通過(guò)主動(dòng)設置工作模式為“110”而終止當前操作,達到連續讀寫(xiě)小于32個(gè)字節數據的目的,超過(guò)32個(gè)字節的連續數據讀寫(xiě)操作將使模塊工作錯誤。 |