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