引言
I2C(Inter-IntegratedCommunication),單線是Philips公司開發(fā)的一種高效、簡單、雙向、兩線制同步串行總線,它僅需要兩根線(串行數(shù)據(jù)線SDA和串行時鐘線SCL)即可為連接到總線的設備提供簡單有效的數(shù)據(jù)交換方式該總線可將各電路分割成各種功能的模塊,并進行軟件化設計,各個功能模塊電路內(nèi)部都集成有一個I2C總線接口電路,故可連接在總線上,從而很好地進行眾多功能模塊與MCU之間的輸入輸出接口,并使連接方式變得簡便,同時可靈活地實現(xiàn)在線配置。本文采用VerilogHDL設計了一個FC總線的控制模塊,該模塊能夠實現(xiàn)FC的所有功能。此外,該模塊可作為一個軟核來方便地嵌入到音頻SoC系統(tǒng)中,這就是當前非常流行的兩線總線。
1 I2C總線原理
通常將FC總線主從機之間的一次數(shù)據(jù)傳送稱為一幀,一幀數(shù)據(jù)一般由啟動信號、地址碼、若干數(shù)據(jù) 字節(jié)、應答信號位以及停止信號等組成。SDA和 SCL都通過一個電流源或者上拉電阻連接到正的電 源電壓,圖1所示是rc總線上標準模式器件和快速 模式器件之間的連接電路,由圖1可見,當總線空閑 時,這兩條線路都是高電平,連接到總線的器件輸出 級必須是漏極開路或者集電極開路才能執(zhí)行“線與” 的邏輯功能。串行8位雙向數(shù)據(jù)傳輸位速率在rc 總線的標準模式下,其速率可達100 Kb/s,快速模式 下可達400 Kb/s,高速模式下可達3. 5 Mb/s。
I2C總線可構成多主和多從系統(tǒng)。在系統(tǒng)結構中,系統(tǒng)通過硬件或者軟件仲裁獲得總線控制權。在應用系統(tǒng)中,I2C總線多采用主從結構。I2C總線上的設備尋址由器件地址線決定,與總線相連的每個器件都對應一個特定的地址,同時采用軟件尋址方式,并且可以通過訪問地址最低位來控制W/R方向。I2C總線的數(shù)據(jù)傳輸格式如圖2所示。
在I2C總線上發(fā)送數(shù)據(jù)的操作(針對WM8731/8731L類似的設備)過程一般可為4步:
第一步,啟動START信號,接著寫一個字節(jié)的設備地址,地址字節(jié)的高7位是設備有效地址,地址字節(jié)的最低1位代表準備寫(低電平),然后等待ACK應答;
第二步,應繼續(xù)寫一個字節(jié)的rc設備內(nèi)部數(shù)據(jù)訪問地址,然后等待發(fā)出ACK;
第三步即可開始發(fā)送數(shù)據(jù),發(fā)送的數(shù)據(jù)可以是一個字節(jié),也可以連續(xù)發(fā)送N個字節(jié),每發(fā)送完一個字節(jié)的數(shù)據(jù),都需要等待一個應答ACK信號;
最后發(fā)送的是一個STOP信號,以結束發(fā)送操作。
在I2C總線上接收數(shù)據(jù)的操作(針對WM8731/8731L類似的設備)過程如下:
第一步,也是啟動START信號,接著寫一個字節(jié)的設備地址,地址字節(jié)的高7位是設備有效地址,地址字節(jié)的最低位代表準備寫(低有效),然后等待ACK應答;
第二步,繼續(xù)寫一個字節(jié)的I2C器件內(nèi)部數(shù)據(jù)訪問地址,并等待ACK;
第三步,再次啟動START信號,此時再寫一個字節(jié)的設備地址,這個設備地址字節(jié)的最低1位若為高電品,則代表準備接收數(shù)據(jù);
第四步,開始接收數(shù)據(jù),數(shù)據(jù)可以是接收一個字節(jié),也可以連續(xù)接收N個字節(jié)。在接收前面的N—1個字節(jié)后,每接收一個字節(jié)數(shù)據(jù),都要產(chǎn)生一個ACK;
第五步,在接收最后一個字節(jié)數(shù)據(jù)前停止控制器生成ACK信號,然后等待最后一個字節(jié)的數(shù)據(jù)就緒后,再讀??;
最后,發(fā)送一個STOP信號,以停止接收操作。
2 I2C總線的接口設計
2.1 總體內(nèi)部架構設計
圖3所示為rc總線接口中ip核的總體結構。該接口主要包括時鐘發(fā)生器,字節(jié)命令控制器、位命令寄存器、數(shù)據(jù)I/O移位寄存器、發(fā)送與接收寄存器等幾部分。
時鐘發(fā)生器可用于產(chǎn)生時鐘使能信號,該信號可觸發(fā)位命令控制器的所有時鐘同步操作。
字節(jié)命令控制器承擔著I2C接口字節(jié)數(shù)據(jù)的傳輸任務。它從I2C寄存器中的命令寄存器中讀取操作命令。這些命令可通過設置該寄存器中的某些位來完成,并且都是以字節(jié)為單位。
位命令寄存器負責總線上實際的數(shù)據(jù)傳輸工作,包括START和STOPo這些操作可通過控制SCL和SDA線來實現(xiàn)。
數(shù)據(jù)I/O移位寄存器中存儲著當前數(shù)據(jù)傳輸所需要的數(shù)據(jù)。如果是讀操作,移位寄存器將接收從SDA線上的逐位數(shù)據(jù);如果是寫操作,移位寄存器則將該數(shù)據(jù)逐位發(fā)送到SDA線上。
2.2 I2C接口控制器
I2C總線是通過二根線來連在器件之間進行通信的總線,它可根據(jù)地址識別每個器件。每個I2C設備都有自己固定的硬件地址。對于芯片WM8731/WM8731L的FC總線它的兩個從地址為001_1011和001_1010oWM8731設備的控制操作可以描述為:首先發(fā)出該設備地址,和該設備建立連接,再向該設備讀或寫2個字節(jié)的數(shù)據(jù),最后發(fā)出停止信號以結束I2C通訊。
對WM8731的控制實際上就是控制FC設備讀/寫數(shù)據(jù),本文不涉及讀數(shù)據(jù)而只介紹部分rc總線寫數(shù)據(jù)的關鍵Verilog程序設計。
2.3 啟動與停止程序
檢測通訊啟動與停止的Verilog程序如下:
always@(posedge mclk or negedge reset_n)
在主機方式下,完成啟動與地址信號發(fā)送后,即開始發(fā)送數(shù)據(jù)。發(fā)送數(shù)據(jù)時,并串數(shù)據(jù)在SCL的下降沿移位,這樣可保證SCL高電平時SDA數(shù)據(jù)的穩(wěn)定。發(fā)送的進程由WR信號和從機的應答信號啟動。為了保證時序正確和控制的可靠,軟件程序可采用有限狀態(tài)機來設計。其Verilog程序如下:
3 仿真結果
設計時,可以釆用Xilinx公司的集成開發(fā)工具ISE9.0,仿真工具使用SYNPOSYS的VCS仿真軟件,圖4所示是其仿真波形,由圖可見,該設計是正確的。整個設計可以采用Verilog語言描述在LINUX平臺上完成系統(tǒng)的仿真、綜合、映射、布局。在得到正確的仿真結果后,通過器件編程(即通過編程器將設計下載到實際芯片中)來進行系統(tǒng)調(diào)試,直到最后實現(xiàn)。
4 結語
本文介紹了一種簡易的音頻soc的I2c總線接口的軟件設計方法。該設計可以作為一個ip核方便地嵌入音頻SoC的系統(tǒng)設計中,以用于對具有I2c接口的芯片ic芯片進行數(shù)據(jù)讀寫。目前,本設計已經(jīng)在實踐項目中投片,并已經(jīng)通過實際系統(tǒng)的測試。