基于CPLD的系統中I2C總線(xiàn)的設計 作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò ) 加入技術(shù)交流群 掃碼加入和技術(shù)大咖面對面交流海量資料庫查詢(xún) 收藏 摘要:在介紹I2C總線(xiàn)協(xié)議的基礎上,討論了基于CPLD的系統中I2C總線(xiàn)的設計技術(shù),并結合工程實(shí)例設計了I2C總線(xiàn)IP核,給出了部分源代碼和仿真結果。 關(guān)鍵詞:I2C總線(xiàn) IP核 CPLD I2C總線(xiàn)是PHILIPS公司推出的新一代串行總線(xiàn),其應用日漸廣泛1~2。目前許多單片機都帶有I2C總線(xiàn)接口,能方便地實(shí)現I2C總線(xiàn)設計;對沒(méi)有I2C總線(xiàn)的微控制器(MCU),可以采用兩條I/O口線(xiàn)進(jìn)行模擬。在以單片機為MCU的系統中很容易實(shí)現I2C總線(xiàn)的模擬擴展,有現成的通用軟件包可以使用2~3。 對有些基于CPLD的系統,要與帶有I2C總線(xiàn)接口的外圍器件連接,實(shí)現起來(lái)相對復雜一些。為實(shí)現系統中的I2C總線(xiàn)接口,可以另外引入單片機,也可以采用PCF8584或者PCA9564器件(PHILIPS公司推出的專(zhuān)用I2C總線(xiàn)擴展器)進(jìn)行擴展,但這樣會(huì )增加系統成本,使系統冗余復雜。像ALTERA、XILINX等一些大公司有專(zhuān)用的基于CPLD器件的I2C總線(xiàn)IP核,但這些IP核的通用性不強,需要的外圍控制信號較多,占用系統很大的資源,因此直接采用這種IP核不可取。 鑒于此,依照I2C總線(xiàn)協(xié)議的時(shí)序要求,在基于CPLD的系統中開(kāi)發(fā)了自己的I2C總線(xiàn)IP核。對于一些帶有I2C總線(xiàn)接口的外圍器件較少、對I2C總線(xiàn)功能要求較簡(jiǎn)單的CPLD系統,自主開(kāi)發(fā)IP核顯得既經(jīng)濟又方便。 1 I2C總線(xiàn)的協(xié)議 I2C總線(xiàn)僅僅依靠?jì)筛B線(xiàn)就實(shí)現了完善的全雙工同步數據傳送:一根為串行數據線(xiàn)(SDA),一根為串行時(shí)鐘線(xiàn)(SCL)。該總線(xiàn)協(xié)議有嚴格的時(shí)序要求??偩€(xiàn)工作時(shí),由時(shí)鐘控制線(xiàn)SCL傳送時(shí)鐘脈沖,由串行數據線(xiàn)SDA傳送數據??偩€(xiàn)傳送的每幀數據均為一個(gè)字節(8 bit),但啟動(dòng)I2C總線(xiàn)后,傳送的字節個(gè)數沒(méi)有限制,只要求每傳送一個(gè)字節后,對方回應一個(gè)應答位(Acknowledge Bit)。發(fā)送數據時(shí)首先發(fā)送數據的最高位(MSB)。 I2C總線(xiàn)協(xié)議規定,啟動(dòng)總線(xiàn)后第一個(gè)字節的高7位是從器件的尋址地址,第8位為方向位(“0”表示主器件對從器件的寫(xiě)操作;“1”表示主器件對從器件的讀操作),其余的字節為操作的數據??偩€(xiàn)每次傳送開(kāi)始時(shí)有起始信號,結束時(shí)有停止信號。在總線(xiàn)傳送完一個(gè)或幾個(gè)字節后,可以使SCL線(xiàn)的電平變低,從而使傳送暫停。 圖1列出了I2C總線(xiàn)上典型信號的時(shí)序,圖2表示I2C總線(xiàn)上一次完整的數據傳送過(guò)程。 依據I2C總線(xiàn)的傳輸協(xié)議,總線(xiàn)工作時(shí)的具體時(shí)序如下: 起始信號(S):在時(shí)鐘SCL為高電平期間,數據線(xiàn)SDA出現由高電平向低電平的變化,用于啟動(dòng)I2C總線(xiàn),準備開(kāi)始傳送數據; 停止信號(P):在時(shí)鐘SCL為高電平期間,數據線(xiàn)SDA出現由低電平向高電平的變化,用于停止I2C總線(xiàn)上的數據傳送; 應答信號(A):I2C總線(xiàn)的第9個(gè)脈沖對應應答位,若SDA線(xiàn)上顯示低電平則為總線(xiàn)“應答”(A),若SDA線(xiàn)上顯示高電平則為“非應答”(/A); 數據位傳送:I2C總線(xiàn)起始信號或應答信號之后的第1~8個(gè)時(shí)鐘脈沖對應一個(gè)字節的8位數據傳送。在脈沖高電平期間,數據串行傳送;在脈沖低電平期間,數據準備,允許總線(xiàn)上數據電平變化。 2 應用實(shí)例 2.1 實(shí)例模型介紹 現舉某應用實(shí)例,要求對顯示器的視頻信號進(jìn)行采集、處理和再顯示,整個(gè)系統采用CPLD器件進(jìn)行控制。信號采集采用A/D公司的專(zhuān)用視頻采集芯片AD9883,該芯片在使用前需要依據實(shí)際的功能指標進(jìn)行初始化。 初始化過(guò)程依靠AD9883的SDA和SCL兩引腳進(jìn)行。在系統中用CPLD器件,ALTERA公司的EPM3256A,實(shí)現初始化:按照I2C總線(xiàn)協(xié)議向AD9883的19個(gè)內部寄存器(01H~13H)寫(xiě)入19組固定的8位數據;第14H寄存器為只讀型同步檢測寄存器,僅用于檢測幾個(gè)關(guān)鍵的數據設置。 可見(jiàn)該I2C總線(xiàn)模型如下:?jiǎn)沃鞑僮?,只?shí)現簡(jiǎn)單的寫(xiě)和讀操作(亦可只有寫(xiě)操作,只是硬件調試的時(shí)候會(huì )麻煩些),寫(xiě)地址連續,沒(méi)有競爭和仲裁,是很簡(jiǎn)單的I2C總線(xiàn)系統。由此設計了如圖3所示的IP核。其中,RESET為復位信號,CLK為系統時(shí)鐘。 為了軟件仿真方便,把雙向數據線(xiàn)SDA用分離的兩條線(xiàn)模擬:SDA為數據輸出,SDAACK為SDA的應答信號。軟件仿真成功后,只要把SDA設置為雙向,稍微修改一下程序就可以向CPLD器件下載,進(jìn)行實(shí)際應用。 對AD9883內部地址連續的寄存器進(jìn)行初始化,I2C總線(xiàn)上傳輸的時(shí)序信號依次為:開(kāi)始信號(S);從器件地址和寫(xiě)操作位(SLAW);內部寄存器基地址(Base Address);寫(xiě)入基地址的數據(Data0);寫(xiě)入下一地址(Base Address+1)的數據(Data1);寫(xiě)入地址(Base Address+2)的數據(Data2);……;寫(xiě)入地址(Base Address+18)的數據(Data18);停止信號(P)。 針對AD9883,如果電路中的A0引腳55#接電源,則SLAW=“10011001”;Base Address=“00000001”,Data0~Data18是依據實(shí)際需要寫(xiě)入的初始化數據。 2.2 IP核程序的編寫(xiě) 整個(gè)程序用VHDL語(yǔ)言編制,SCL輸出時(shí)鐘的設計是基于CLK輸入時(shí)鐘的64分頻的。程序由三個(gè)狀態(tài)組成:開(kāi)始(START)、轉換(SHIFT)和應答(ACK)。狀態(tài)定義如下: type states is startshiftack signal my_states states 下面給出部分進(jìn)程的源代碼以供參考。 2.2.1開(kāi)始信號的產(chǎn)生 PROCESSclk if clk’event and clk=‘1’ then TWCR<=DATAIN SCL<=‘1’ else TWCR<=others=>‘0’ end if if TWCR=“10000000” then ——比較寄存器TWCR的開(kāi)始 值設置(由用戶(hù)決定) STRB<=‘1’ end if if STRB=‘1’ then ——開(kāi)始條件 INT<=INT+“000001” ——INT為時(shí)鐘脈沖計數 if INT<=“011000” then ——產(chǎn)生SDA的下降沿 SDA<=‘1’ else SDA<=‘0’ end if if INT>=“011110” then ——STRB歸0,保證只產(chǎn)生 一次開(kāi)始信號 STRB <=‘0’ INT<=“000000” end if end if 等所有的初始化數據傳輸完畢后即產(chǎn)生停止信號,過(guò)程與上面相類(lèi)似,在此省略。 2.2.2 數據轉換過(guò)程 數據轉換過(guò)程采用移位傳輸,傳輸8位之后即進(jìn)入應答狀態(tài)。 when shift=> if cnt=“010000” then ——cnt為clk脈沖計數,由 實(shí)際的時(shí)鐘頻率決定cnt的值 COUNT<=COUNT+“0001” ——COUNT為數據移位個(gè) 數計數MSR為移位寄存器 MSR<=MSR6 downto 0&txtag txtag<=‘0’ if COUNT=“1000” then my_states<=ack TACK<=‘1’ ——TACK為應答標志位 else SDA<=MSR7 my_states<=shift TACK<=‘0’ end if end if 圖4 數據傳輸仿真波形 圖5 SDA非應答時(shí)的仿真波形 2.2.3 數據輸入 一般情況下,I2C總線(xiàn)傳輸的數據要由外部ROM或其它專(zhuān)門(mén)的數據存儲區來(lái)存儲,但在數據相對固定且數據量不是很大的情況下,可以將初始化的數據寫(xiě)在程序中,這樣可減少頻繁的數據交換,簡(jiǎn)化操作。AD9883的初始化數據就屬于這種情況,可以通過(guò)檢測應答信號來(lái)改變輸入的值。程序如下: PROCESSclk ——數據輸入 if clk’event and clk=‘1’ then CASE ackint IS ——ackint為應答計數,每應答 一次,輸入改變一次 when “00000”=> DATAIN<=“10000000” when “00001”=> DATAIN<=“01010010” when “00010”=> DATAIN<=“11010000” …… when “10010”=> DATAIN<=“00000000” when “10011”=> DATAIN<=“00000000” when others=> DATAIN<=“ZZZZZZZZ” END CASE end if 2.3 仿真結果 把自主開(kāi)發(fā)的IP核置于MAX+PLUS II 10.0開(kāi)發(fā)環(huán)境下,選用EPM3128ATC100-10器件,經(jīng)過(guò)編譯、調試與仿真,證明該程序符合設計要求。圖4是模擬產(chǎn)生開(kāi)始信號并傳輸兩組二進(jìn)制數據“10011001”和“10101010”(十進(jìn)制表示為153和170)的仿真波形。圖5是傳輸數據“10011001”后沒(méi)有應答時(shí)的仿真結果,此時(shí)總線(xiàn)處于暫停狀態(tài)。 仿真完成后,通過(guò)編程電纜將pof文件下載到實(shí)際電路的EPM3128ATC100-10中,然后對AD9883進(jìn)行初始化,結果工作正常,這進(jìn)一步驗證了采用該自主開(kāi)發(fā)的IP核完全可滿(mǎn)足I2C總線(xiàn)的時(shí)序要求,能實(shí)現I2C總線(xiàn)的功能。
評論