IIC(Inter-Integrated Circuit)總線是一種由荷蘭飛利浦(Philips)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。IIC總線產(chǎn)生于在80年代,最初為音頻和視頻設(shè)備開發(fā),如今主要在服務(wù)器管理中使用,其中包括單個(gè)組件狀態(tài)的通信。IIC總線最主要的優(yōu)點(diǎn)是其簡(jiǎn)單性和有效性。由于接口直接在組件之上,因此IIC總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。IIC總線的另一個(gè)優(yōu)點(diǎn)是,它支持多主控,其中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主總線。一個(gè)主控能夠控制信號(hào)的傳輸和時(shí)鐘頻率,在任何時(shí)間點(diǎn)上只能有一個(gè)主控。IIC總線是由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進(jìn)行雙向傳送。各種被控制電路均并聯(lián)在這條總線上,但就像電話機(jī)一樣只有撥通各自的號(hào)碼才能工作,所以每個(gè)電路和模塊都有唯一的地址,在信息的傳輸過程中,IIC總線上并接的每一模塊電路既是主控器(或被控器),又是發(fā)送器(或接收器),這取決于它所要完成的功能。CPU發(fā)出的控制信號(hào)分為地址碼和控制量?jī)刹糠郑刂反a用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調(diào)整的類別(如對(duì)比度、亮度等)及需要調(diào)整的量。這樣,各控制電路雖然掛在同一條總線上,卻 彼此獨(dú)立,互不相關(guān)。
圖1 被動(dòng)模式IIC接口電路框圖
在實(shí)際設(shè)計(jì)芯片與計(jì)算機(jī)接口電路時(shí),通常只希望計(jì)算機(jī)能夠檢測(cè)、控制芯片的內(nèi)部工作情況,因此可以簡(jiǎn)化IIC接口電路,只需要實(shí)現(xiàn)處于被動(dòng)模式的芯片IIC接口電路即可。該接口電路主要用于芯片內(nèi)部寄存器的讀寫操作,這樣可以減小占用過多的芯片面積資源。
根據(jù)IIC總線上數(shù)據(jù)傳輸過程的特點(diǎn),使用狀態(tài)機(jī)控制整個(gè)系統(tǒng)的運(yùn)作,可以使設(shè)計(jì)思路清晰明確,程序模塊化。系統(tǒng)上電復(fù)位后即進(jìn)入狀態(tài)機(jī),并在狀態(tài)機(jī)控制下完成起始/停止信號(hào)的自動(dòng)檢測(cè),slave地址、子地址、配置數(shù)據(jù)的接收及響應(yīng),發(fā)送數(shù)據(jù)及檢測(cè)響應(yīng),對(duì)配置寄存器陣列的尋址和連續(xù)讀寫等功能。此外,系統(tǒng)最高數(shù)據(jù)傳輸速度應(yīng)由時(shí)鐘CLK及寄存器的存取速度決定。根據(jù)電路的功能,整個(gè)IIC接口電路的系統(tǒng)框圖如圖1所示。
狀態(tài)機(jī)如圖2所示,其中Idle是空閑狀態(tài),Rx_address狀態(tài)接收slave地址,Ack_rx_address狀態(tài)接收slave地址響應(yīng),Tx_data狀態(tài)發(fā)送數(shù)據(jù),Ack_tx_data狀態(tài)發(fā)送數(shù)據(jù)響應(yīng),Rx_subaddress狀態(tài)接收子地址,Ack_rx_subaddr狀態(tài)接收子地址響應(yīng),Rx_data狀態(tài)接收數(shù)據(jù),Ack_rx_data狀態(tài)接收數(shù)據(jù)響應(yīng)。狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換在SCL下降沿后第5個(gè)時(shí)鐘周期進(jìn)行,但是,停止信號(hào)出現(xiàn)后,總線被釋放,SCL/SDA均為高電平,除非再出現(xiàn)起始信號(hào)進(jìn)行數(shù)據(jù)傳送,SCL不會(huì)再出現(xiàn)下降沿。如果停止信號(hào)出現(xiàn)后,就把空閑狀態(tài)賦給下一個(gè)狀態(tài),將沒有SCL時(shí)鐘下降沿做時(shí)間基準(zhǔn)完成狀態(tài)轉(zhuǎn)化(即狀態(tài)機(jī)進(jìn)入到空閑狀態(tài))。為了解決這個(gè)問題,需要將停止信號(hào)看作復(fù)位信號(hào)。一旦有停止信號(hào)出現(xiàn),當(dāng)前狀態(tài)在下一個(gè)CLK脈沖強(qiáng)制進(jìn)入到空閑狀態(tài),而不再等到SCL下降后第5個(gè)時(shí)鐘脈沖。
圖2 被動(dòng)模式IIC接口電路狀態(tài)機(jī)
圖3 被動(dòng)模式IIC接口電路仿真波形
Ack_rx_subaddr狀態(tài)之后,master既可能發(fā)送數(shù)據(jù)又可能發(fā)送重復(fù)停止信號(hào)或者停止信號(hào),如何區(qū)分是哪種情況成為正確進(jìn)入相應(yīng)的狀態(tài)的關(guān)鍵。這里設(shè)定ack_rx_subaddr狀態(tài)之后無條件緊跟rx_data狀態(tài)。這樣,如果在rx_data狀態(tài)時(shí)檢測(cè)到重復(fù)起始信號(hào),丟棄已經(jīng)接收的數(shù)據(jù),并在SCL時(shí)鐘下降沿后第5個(gè)時(shí)鐘周期進(jìn)行狀態(tài)轉(zhuǎn)化進(jìn)入rx_address狀態(tài),否則繼續(xù)完成接收數(shù)據(jù)。若發(fā)現(xiàn)停止信號(hào),處理如前所述。這樣做既滿足設(shè)計(jì)要求又不會(huì)增加多余的狀態(tài)。
master收到數(shù)據(jù)后沒有響應(yīng)(SDA=1)表示master接收的是最后一個(gè)字節(jié)數(shù)據(jù)。在這種情況下,可以在SCL時(shí)鐘下降沿后第5個(gè)時(shí)鐘周期就直接進(jìn)入到空閑狀態(tài),處理接下來應(yīng)該出現(xiàn)的重復(fù)起始信號(hào)或停止信號(hào)。
起始/停止信號(hào)、SCL檢測(cè)如下:
在高速時(shí)鐘CLK的上升沿采樣SDA、SCL,如果在前后兩個(gè)采樣點(diǎn)發(fā)現(xiàn)SDA從“1”變化到“0”而SCL保持“1”則認(rèn)為master發(fā)出起始信號(hào),將detect_start設(shè)置為有效。同理,若發(fā)現(xiàn)SDA從“0”變化到“1”而SCL保持“1”,則認(rèn)為是停止信號(hào),將detect_stop設(shè)置為有效。detect_start有效保持一個(gè)狀態(tài)周期,detect_stop有效保持一個(gè)時(shí)鐘周期,以避免誤操作。
依靠SCL時(shí)鐘下降沿進(jìn)行狀態(tài)轉(zhuǎn)換以及在SCL時(shí)鐘上升沿將SDA的數(shù)據(jù)送入移位寄存器。移位寄存器在rx_address、rx_subaddress、rx_data狀態(tài)完成在數(shù)據(jù)采樣時(shí)刻(SDA數(shù)據(jù)有效時(shí))對(duì)slave地址、寄存器子地址、數(shù)據(jù)的移位接收,接收完畢后在響應(yīng)狀態(tài)將數(shù)據(jù)并行送往指定的寄存器,在ack_tx_data狀態(tài)和ack_rx_address狀態(tài)且讀寫控制位為高(r/w=1)時(shí),并行輸入數(shù)據(jù),在tx_data狀態(tài)發(fā)送時(shí)刻有效時(shí)輸出最高位,在數(shù)據(jù)采樣時(shí)刻有效時(shí)進(jìn)行移位操作。
寄存器子地址寄存器實(shí)現(xiàn)完成對(duì)寄存器一次讀寫操作后地址自動(dòng)增加的功能,這樣可以實(shí)現(xiàn)在對(duì)器件的配置時(shí)只輸入一次子地址就完成對(duì)所有的配置寄存器的配置。計(jì)數(shù)器寄存器記錄接收或發(fā)送的數(shù)據(jù)的位數(shù),為狀態(tài)機(jī)提供控制信號(hào)。
根據(jù)上面的狀態(tài)機(jī),使用verilog編寫硬件描述代碼,為了減小競(jìng)爭(zhēng)冒險(xiǎn)、提高電路運(yùn)行的可考性,所有電路均在同一時(shí)鐘控制下工作,例如,狀態(tài)轉(zhuǎn)化并沒有依靠SCL時(shí)鐘的下降沿觸發(fā),而是利用高速時(shí)鐘的上升沿采樣SCL,檢測(cè)到SCL時(shí)鐘的下降沿后,在時(shí)鐘的上升沿觸發(fā)狀態(tài)轉(zhuǎn)化。這樣就避免了由于總線負(fù)載過重而導(dǎo)致SCL上升、下降時(shí)間太長(zhǎng)所帶來的一系列問題。代碼編寫好后,運(yùn)用modelsim進(jìn)行仿真驗(yàn)證,仿真驗(yàn)證設(shè)計(jì)的IIC接口工作正確。圖3是計(jì)算機(jī)對(duì)IIC接口電路進(jìn)行寫操作仿真得到的CLK、SCL、SDA波形,剛開始時(shí),reset有個(gè)高電平脈沖,IIC模塊復(fù)位,IIC中第一個(gè)寄存器的數(shù)據(jù)Dout0[7∶0]被置為fb(16進(jìn)制),之后開始對(duì)IIC的第一個(gè)寄存器寫入數(shù)據(jù)08,最終Dout0[7∶0]中的數(shù)據(jù)從fb為08,表明計(jì)算機(jī)成功完成了對(duì)芯片寄存器的控制。
被動(dòng)模式的IIC接口電路是IIC總線的一個(gè)簡(jiǎn)化版本,通過被動(dòng)模式的IIC接口電路,計(jì)算機(jī)可以檢測(cè)、控制芯片的狀況,本文分析了被動(dòng)模式的芯片IIC接口設(shè)計(jì),并通過modelsim驗(yàn)證設(shè)計(jì)的正確性。
[1]徐偉,劉建成.基于模擬IIC總線的電壓測(cè)量系統(tǒng)[J].南京信息工程大學(xué)學(xué)報(bào),2011,1.
[2]王鈺,潘仕彬,王卉.IIC在數(shù)據(jù)采集中的應(yīng)用[J].科技廣場(chǎng),2008,8.
[3]張文甲.IIC總線通信中主機(jī)控制器的設(shè)計(jì)與應(yīng)用[J].電腦知識(shí)與技術(shù),2007,1.
[4]徐廣振,張茂青,王力,黃穎.基于IIC總線的鍵盤讀取[J].江蘇電器,2007,4.
[5]夏宇聞.verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M].北京航空航天大學(xué)出版社,2008.