今天給大俠帶來基于FPGA的 模擬 I2C 協(xié)議設(shè)計,由于篇幅較長,分三篇。今天帶來第一篇,上篇,?I2C 總線解析以及模擬?I2C 接口程序的基本框架。話不多說,上貨。
導(dǎo)讀
I2C(Inter-Integrated Circuit),其實(shí)是 I2C Bus簡稱,中文就是集成電路總線,它是一種串行通信總線,使用多主從架構(gòu),由飛利浦公司在1980年代為了讓主板、嵌入式系統(tǒng)或手機(jī)用以連接低速周邊設(shè)備而發(fā)展。I2C的正確讀法為“I平方C”("I-squared-C"),而“I二C”("I-two-C")則是另一種錯誤但被廣泛使用的讀法。自2006年10月1日起,使用 I2C 協(xié)議已經(jīng)不需要支付專利費(fèi),但制造商仍然需要付費(fèi)以獲取 I2C 從屬設(shè)備地址。
I2C?簡單來說,就是一種串行通信協(xié)議,I2C的通信協(xié)議和通信接口在很多工程中有廣泛的應(yīng)用,如數(shù)據(jù)采集領(lǐng)域的串行 AD,圖像處理領(lǐng)域的攝像頭配置,工業(yè)控制領(lǐng)域的 X 射線管配置等等。除此之外,由于 I2C 協(xié)議占用的 IO 資源特別少,連接方便,所以工程中也常選用 I2C 接口做為不同芯片間的通信協(xié)議。I2C 串行總線一般有兩根信號線,一根是雙向的數(shù)據(jù)線SDA,另一根是時鐘線SCL。所有接到?I2C 總線設(shè)備上的串行數(shù)據(jù)SDA都接到總線的SDA上,各設(shè)備的時鐘線SCL接到總線的SCL上。
在現(xiàn)代電子系統(tǒng)中,有為數(shù)眾多的 IC 需要進(jìn)行相互之間以及與外界的通信。為了簡化電路的設(shè)計,Philips 公司開發(fā)了一種用于內(nèi)部 IC 控制的簡單的雙向兩線串行總線 I2C(Intel-Integrated Circuit bus)。1998 年當(dāng)推出?I2C?總線協(xié)議 2.0 版本時,I2C 協(xié)議實(shí)際上已經(jīng)成為一個國際標(biāo)準(zhǔn)。
在進(jìn)行 FPGA 設(shè)計時,經(jīng)常需要和外圍提供?I2C?接口的芯片通信。例如低功耗的 CMOS 實(shí)時時鐘/日歷芯片 PCF8563、LCD 驅(qū)動芯片 PCF8562、并行口擴(kuò)展芯片 PCF8574、鍵盤/LED 驅(qū)動器 ZLG7290 等都提供?I2C?接口。因此在 FPGA 中模擬?I2C?接口已成為 FPGA 開發(fā)必要的步驟。
本篇將詳細(xì)講解在 FPGA 芯片中使用 VHDL/Verilog HDL 模擬?I2C?協(xié)議,以及編寫 TestBench仿真和測試程序的方法。
第一篇內(nèi)容摘要:本篇會介紹?I2C 總線解析,包括?I2C 總線概述、I2C 協(xié)議的基本概念、I2C協(xié)議的時序要求,還會介紹模擬 I2C 接口程序的基本框架等相關(guān)內(nèi)容。
?
一、I2C?總線概述
?
下面先對 I2C 協(xié)議中有關(guān)數(shù)據(jù)格式和時序的內(nèi)容進(jìn)行介紹,這里沒有涉及的地方請參考《THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000》。
1.1?I2C?總線概述
I2C 協(xié)議作為一個串行總線標(biāo)準(zhǔn)盡管沒有并行總線的數(shù)據(jù)吞吐能力,但是它的以下特點(diǎn)使其有著廣泛的應(yīng)用:
? 只需要兩條總線—串行數(shù)據(jù)線 SDA 和串行時鐘線 SCL;
? 每個連接到總線的器件都可以通過惟一的地址和一直存在的簡單的主/從節(jié)點(diǎn)關(guān)系軟件設(shè)定地址,主節(jié)點(diǎn)可以發(fā)送數(shù)據(jù)或接收數(shù)據(jù);
? 是真正的多主總線,當(dāng)兩個或更多主節(jié)點(diǎn)同時初始化數(shù)據(jù)傳輸時,可以通過沖突檢測和仲裁防止數(shù)據(jù)被破壞;
? 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá) 100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá) 3.4Mbit/s;
? 片上的濾波器可以濾去總線數(shù)據(jù)線上的毛刺波,保證數(shù)據(jù)完整;
? 連接到相同總線的 IC 數(shù)量只受到總線的最大電容(400pF)限制。
總線不僅僅是互連的線,還包含系統(tǒng)通信的所有格式和過程。I2C 總線結(jié)構(gòu)上的特點(diǎn)保證了其應(yīng)用時的簡潔,另外其完備的協(xié)議避免了所有混亂、數(shù)據(jù)丟失和妨礙信息的可能性。
1.2 I2C?協(xié)議的基本概念
I2C 總線支持任何 IC 生產(chǎn)過程(NMOS、CMOS 和雙極性)。串行數(shù)據(jù)線 SDA 和串行時鐘線 SCL在連接到總線的器件間傳遞信息。每個器件都有一個惟一的地址作為識別的標(biāo)志(無論是微控制器、LCD 驅(qū)動器存儲器還是鍵盤接口),并且都可以發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。很明顯 LCD 驅(qū)動器只需要接收數(shù)據(jù),而存儲器需要接收和發(fā)送數(shù)據(jù)。圖 1 所示的是一個高性能集成電視的例子。
圖 1 高性能集成電視
從圖 1 可以看到,應(yīng)用?I2C 總線是非常方便的。用通俗的話講 I2C 總線的硬件設(shè)計工作就是連接 SDA 和 SCL 兩條線,依靠 I2C 協(xié)議完成軟件工作。在 I2C 協(xié)議中應(yīng)理解如下的概念。
1)主/從節(jié)點(diǎn)
主節(jié)點(diǎn)負(fù)責(zé)初始化總線的數(shù)據(jù)傳輸,并產(chǎn)生允許傳輸?shù)臅r鐘信號。此時任何被尋址的器件都被認(rèn)為是從節(jié)點(diǎn)。當(dāng)有多個主節(jié)點(diǎn)在總線上傳輸數(shù)據(jù)時,每個主節(jié)點(diǎn)產(chǎn)生自己的時鐘信號。掛接到總線上的所有外圍器件、外設(shè)接口都是總線上的節(jié)點(diǎn)。
2)總線上節(jié)點(diǎn)的尋址方式
在任何時刻總線上只有一個主控器件(主節(jié)點(diǎn))實(shí)現(xiàn)總線的控制操作,對總線上的其他節(jié)點(diǎn)尋址,可分時實(shí)現(xiàn)點(diǎn)-點(diǎn)的數(shù)據(jù)傳送。因此總線上每個節(jié)點(diǎn)都有一個固定的節(jié)點(diǎn)地址。
I2C 總線上主節(jié)點(diǎn)的地址由軟件給定,此地址存放在 I2C 總線的地址寄存器中。I2C 總線上所有的外圍器件都有規(guī)范的器件地址。器件地址由 7 位數(shù)字組成,它和 1 位方向位構(gòu)成了 I2C 總線器件的尋址字節(jié) SLA(Slave address)。
器件地址是 I2C 總線外圍接口器件固有的地址編碼,器件出廠時就已給定。數(shù)據(jù)方向位規(guī)定了總線上主節(jié)點(diǎn)對從節(jié)點(diǎn)的數(shù)據(jù)傳送方向。
1.3 I2C協(xié)議的時序要求
1)總線上的數(shù)據(jù)傳遞時序
I2C 總線上數(shù)據(jù)傳遞時序如圖 2 所示,具體步驟如下。
圖 2 I2C 總線的數(shù)據(jù)傳遞時序
? 首先主節(jié)點(diǎn)器件發(fā)送一個起始信號。
? 接下來主節(jié)點(diǎn)器件發(fā)送從節(jié)點(diǎn)地址和讀寫方式,一共 8 位。其中從節(jié)點(diǎn)地址 7 位,讀寫方式 1 位。
? 與傳輸?shù)刂芬恢碌膹墓?jié)點(diǎn)器件應(yīng)答(即 ACK)。
? 開始數(shù)據(jù)傳輸,傳輸數(shù)據(jù)數(shù)量不限。每個字節(jié)(八位)后面跟接收數(shù)據(jù)方的應(yīng)答位。例如主節(jié)點(diǎn)器件讀取從節(jié)點(diǎn)數(shù)據(jù),從節(jié)點(diǎn)發(fā)送數(shù)據(jù),主節(jié)點(diǎn)應(yīng)答;主節(jié)點(diǎn)器件寫數(shù)據(jù)到從節(jié)點(diǎn),主節(jié)點(diǎn)發(fā)送數(shù)據(jù),從節(jié)點(diǎn)應(yīng)答。
? 數(shù)據(jù)傳輸結(jié)束,主節(jié)點(diǎn)器件發(fā)送一個終止信號結(jié)束整個過程。
采用 I2C 總線后對傳送的字節(jié)數(shù)沒有限制,只要求每傳送一個字節(jié)后對方回應(yīng)一個應(yīng)答位。在發(fā)送時首先發(fā)送的是數(shù)據(jù)的最高位(MSB,Most Significant Bit)。每次傳送開始有起始信號,結(jié)束時有停止信號。在總線傳送完一個字節(jié)后,可以通過對時鐘線(SCL)的控制使傳送暫停。例如當(dāng)某個外圍器件接收 N 個字節(jié)數(shù)據(jù)后需要一段處理時間以便繼續(xù)接收以后的字節(jié)數(shù)據(jù),這時可在應(yīng)答信號后使 SCL 變?yōu)榈碗娖娇刂瓶偩€暫停。如果主節(jié)點(diǎn)要求總線暫停也可使時鐘線保持低電平控制總線暫停。
2)總線上的時序信號
I2C 總線為同步傳輸總線,總線信號完全與時鐘同步。I2C 總線上與數(shù)據(jù)傳送有關(guān)的信號有起始信號 S、終止信號 P、應(yīng)答信號 A 以及位傳送信號。下面將對這些信號一一介紹。
(1)起始信號
起始信號(Start Condition)如圖 3 所示。當(dāng)時鐘線 SCL 為高電平時,數(shù)據(jù)線 SDA 從高電平向低電平變化將形成起始信號,啟動 I2C 總線。
(2)終止信號
終止信號(Stop Condition)如圖 3 所示。當(dāng)時鐘線 SCL 為高電平時,數(shù)據(jù)線 SDA 從低電平向高電平變化將形成終止信號,停止 I2C 總線。
(3)應(yīng)答信號
如圖 3 所中 ACK 第 9 個時鐘脈沖對應(yīng)應(yīng)答位,相應(yīng)數(shù)據(jù)線上低電平時為應(yīng)答信號,高電平時為非應(yīng)答信號。
圖 3 起始信號和終止信號
(4)位傳送信號
在 I2C 總線啟動后或應(yīng)答信號后的第 1~8 個時鐘脈沖對應(yīng)于一個字節(jié)的 8 位數(shù)據(jù)傳送。脈沖高電平期間,數(shù)據(jù)串行傳送;低電平期間為數(shù)據(jù)準(zhǔn)備,允許總線上數(shù)據(jù)電平變換。
?
二、模擬?I2C?接口程序的基本框架
?
模擬 I2C 接口程序的基本框架如圖 4 所示。
圖 4 模擬 I2C 接口程序的基本框架
1)程序接口
用于和應(yīng)用程序連接的接口,將應(yīng)用程序的數(shù)據(jù)按照 I2C 協(xié)議的方式通過 SDA 傳遞給外部器件。包括下列內(nèi)容:
? clk_I FPGA 外部時鐘信號。
? rst_I 同步重起信號。
? arst_I 異步重起信號。
? adr_I 從節(jié)點(diǎn)地址。
? dat_I 輸入數(shù)據(jù)。
? dat_o 輸出數(shù)據(jù)。
? we_I 寫有效信號。
? stb_I 接口有效信號。
? cyc_I 有效總線周期輸入。
? ack_o 應(yīng)答信號輸出。
? inta_o 中斷信號輸出。
2)時鐘設(shè)置寄存器
I2C 協(xié)議提供了 3 種速度模式:正常速度模式 100kbit/s、快速模式 400kbit/s、高速模式3.5Mbit/s。SCL 輸出的時鐘信號頻率和速度模式一致。程序內(nèi)部使用 5 倍 SCL 信號作為時鐘,而 FPGA 外部時鐘需要經(jīng)過分頻得到程序內(nèi)部使用的時鐘。
例如:采用正常速度 100kbit/s,F(xiàn)PGA 外部時鐘為 50MHz,則時鐘設(shè)置寄存器需要設(shè)置為(50MHz/5*100kHz – 1=99)。
3)時鐘產(chǎn)生模塊
時鐘產(chǎn)生模塊產(chǎn)生 4 倍 SCL 頻率的時鐘信號,它為位傳輸控制模塊中所有同步動作提供觸發(fā)信號。
4)命令寄存器
命令寄存器共 8 位,它決定是否在總線上產(chǎn)生各種時序信號、是否讀/寫數(shù)據(jù),各位表示的含義如表 1 所示。
表 1 命令寄存器內(nèi)容
5)狀態(tài)寄存器
狀態(tài)寄存器用來顯示當(dāng)前總線的狀態(tài),例如是否接收到從節(jié)點(diǎn)的應(yīng)答信號、是否忙、是否在傳遞數(shù)據(jù)等,具體內(nèi)容如表 2 所示。
表 2 狀態(tài)寄存器內(nèi)容
6)數(shù)據(jù)傳輸寄存器
數(shù)據(jù)傳輸寄存器用于保存等待傳輸?shù)臄?shù)據(jù)。當(dāng)傳遞從節(jié)點(diǎn)地址信息時,前 7 位保存從節(jié)點(diǎn)地址,最后一位保存讀寫命令;當(dāng)傳遞普通數(shù)據(jù)時,8 位保存一個字節(jié)數(shù)據(jù)。數(shù)據(jù)傳輸寄存器具體內(nèi)容如表 3 所示。
表 3 數(shù)據(jù)傳輸寄存器內(nèi)容
7)數(shù)據(jù)接收寄存器
數(shù)據(jù)接收寄存器用于保存通過 I2C 總線接收到的最后一個字節(jié)內(nèi)容,具體內(nèi)容如表4所示。
表 4 數(shù)據(jù)接收寄存器內(nèi)容
8)字節(jié)傳輸控制模塊
字節(jié)傳輸控制模塊以字節(jié)為單位控制 I2C 總線的數(shù)據(jù)傳輸。這個模塊按照命令寄存器設(shè)置的內(nèi)容將數(shù)據(jù)傳輸寄存器內(nèi)容傳遞到 I2C 總線的接收端,或者從 I2C 總線發(fā)送端接收數(shù)據(jù)并保存到數(shù)據(jù)接收寄存器中。
9)位傳輸控制模塊
位傳輸控制模塊以位為單位進(jìn)行 I2C 總線的數(shù)據(jù)傳輸和產(chǎn)生各個 I2C 協(xié)議命令(如開始、停止、重復(fù)開始等)。字節(jié)傳輸控制模塊控制位傳輸控制模塊的各種動作。例如讀取一個字節(jié)數(shù)據(jù),位傳輸控制模塊需要執(zhí)行 8 個讀的命令。
10)數(shù)據(jù)移位寄存器
數(shù)據(jù)移位寄存器保存的數(shù)據(jù)總是和當(dāng)前的數(shù)據(jù)傳輸相關(guān)的。例如在進(jìn)行讀操作時,主節(jié)點(diǎn)通過移位寄存器依次通過 SDA 獲得來自 I2C 發(fā)送端的數(shù)據(jù),完成后數(shù)據(jù)拷貝到數(shù)據(jù)接收寄存器中。在寫操作時,數(shù)據(jù)傳輸寄存器中的數(shù)據(jù)拷貝到數(shù)據(jù)移位寄存器中,然后依次通過 SDA 將數(shù)據(jù)傳輸?shù)?I2C 總線的接收端。
編輯:黃飛
?
評論
查看更多