FPGA實用通信協議之IIC


本文主要參考正點原子開發資料

EEPROM (Electrically Erasable Progammable Read Only Memory, E2PROM)即電可擦除可編程只讀存儲器, 是一種常用的非易失性存儲器(掉電數據不丟失), EEPROM有多種類型的產品,較常使用的是ATMEL公司生產的AT24C系列。AT24CXX具有高可靠性, 可對所存數據保存100年,並可多次擦寫,擦寫次數達一百萬次。

I2C即Inter-Integrated Circuit(集成電路總線),是由Philips半導體公司(現在的NXP半導體公司)在八十年代初設計出來的一種簡單、雙向、二線制總線標准。多用於主機和從機在數據量不大且傳輸距離短的場合下的主從通信。主機啟動總線,並產生時鍾用於傳送數據,此時任何接收數據的器件均被認為是從機。

I2C總線由數據線SDA和時鍾線SCL構成通信線路,既可用於發送數據,也可接收數據。 在主控與被控IC之間可進行雙向數據傳送,數據的傳輸速率在標准模式下可達100kbit/s,在快速模式下可達400kbit/s,在高速模式下可達3.4Mbit/s,各種被控器件均並聯在總線上,通過器件地址(SLAVE ADDR, 具體可查器件手冊)識別。

I2C_SCL是串行時鍾線, I2C_SDA是串行數據線,由於I2C器件一般采用開漏結構總線相連,所以I2C_SCL和I2C_SDA均需接上拉電阻,也正因此,當總線空閑時,這兩條線路都處於高電平狀態,當連到總線上的任一器件輸出低電平,都將使總線拉低,即各器件的SDA及SCL都是“線與”關系。

I2C總線支持多主和主從兩種工作方式,通常工作在主從工作方式,我們的開發板就采用主從工作方式。在主從工作方式中,系統中只有一個主機,其它器件都是具有I2C總線的外圍從機。在主從工作方式中,主機啟動數據的發送(發出啟動信號)並產生時鍾信號,數據發送完成后,發出停止信號。

I2C總線結構雖然簡單,使用兩線傳輸,然而要實現器件間的通信,需要通過控制SCL和SDA的時序,使其滿足I2C的總線傳輸協議,方可實現器件間的數據傳輸。

在I2C器件開始通信(傳輸數據)之前,串行時鍾線SCL和串行數據線SDA線由於上拉的原因處於高電平狀態,此時I2C總線處於空閑狀態。如果主機(此處指FPGA)想開始傳輸數據,只需在SCL為高電平時將SDA線拉低,產生一個起始信號,從機檢測到起始信號后,准備接收數據,當數據傳輸完成,主機只需產生一個停止信號,告訴從機數據傳輸結束,停止信號的產生是在SCL為高電平時, SDA從低電平跳變到高電平,從機檢測到停止信號后,停止接收數據。 I2C整體時序如下圖。起始信號之前為空閑狀態,起始信號之后到停止信號之前的這一段為數據傳輸狀態,主機可以向從機寫數據, 也可以讀取從機輸出的數據,數據的傳輸由雙向數據線(SDA)完成。停止信號產生后,總線再次處於空閑狀態。

 

 

 

 

如上圖所示,在起始信號之后,主機開始發送傳輸的數據; 在串行時鍾線SCL為低電平狀態時, SDA允許改變傳輸的數據位(1為高電平, 0為低電平),在SCL為高電平狀態時, SDA要求保持穩定,相當於一個時鍾周期傳輸1bit數據,經過8個時鍾周期后,傳輸了8bit數據,即一個字節。第8個時鍾周期末,主機釋放SDA以使從機應答,在第9個時鍾周期,從機將SDA拉低以應答; 如果第9個時鍾周期, SCL為高電平時, SDA未被檢測到為低電平,視為非應答,表明此次數據傳輸失敗。第9個時鍾周期末,從機釋放SDA以使主機繼續傳輸數據,如果主機發送停止信號,此次傳輸結束。 要注意的 是數據以8bit即一個字節為單位串行發出,其最先發送的是字節的最高位。

 

單次寫時序:

 

連續寫時序:

 

如果讀寫控制位R/W位為“1”即讀命令,主機就處於接收數據的狀態,從機從該地址單元輸出數據。讀數據有三種方式:當前地址讀、隨機讀和連續讀。當前地址讀是指在一次讀或寫操作后發起讀操作。由於I2C器件在讀寫操作后,其內部的地址指針自動加一,因此當前地址讀可以讀取下一個字地址的數據。也就是說上次讀或寫操作的單元地址為02時,當前地址讀的 內容就是地址03處的單元數據,時序圖如下圖所示。

隨機讀時序:

由於當前地址讀極不方便讀取任意的地址單元的數據,所以就有了隨機讀,隨機讀的時序有點奇怪,見下圖,發送完器件地址和字地址后,竟然又發送起始信號和器件地址,而且第一次發送器件地址時后面的讀寫控制位為“0”,也就是寫命令,第二次發送器件地址時后面的讀寫控制位為“1”,也就是讀。為什么會有這樣奇怪的操作呢?這是因為我們需要使從機內的存儲單元地址指針指向我們想要讀取的存儲單元地址處,所以首先發送了一次Dummy Write也就是虛寫操作,只所以稱為虛寫,是因為我們並不是真的要寫數據, 而是通過這種虛寫操作使地址指針指向虛寫操作中字地址的位置,等從機應答后,就可以以當前地址讀的方式讀數據了,如圖 28.1.9所示,隨機地址讀是沒有發送數據的單次寫操作和當前地址讀操作的結合體 。

 

 

至於連續讀,對應的是當前地址讀和隨機讀都是一次讀取一個字節而言的,它是將當前地址讀或隨機讀的主機非應答改成應答,表示繼續讀取數據,下圖是在當前地址讀下的連續讀。

I2C協議就這么多。

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM