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