FPGA--I2C串行通信總線


一、I2C總線基本介紹

  I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機系統所需的包括總線裁決和高低速器件同步功能的高性能串行總線。在多主機系統中,可能同時有幾個主機企圖啟動總線傳送數據。為了避免混亂,I2C總線要通過總線仲裁,以決定由哪一台主機控制總線。

  I2C 標准速率為 100kbit/s,快速模式 400kbit/s, 每個電路和模塊都有唯一的地址。

  I2C總線只有兩根雙向信號線。一根是數據線SDA(無論是數據信息還是地址信息都經過這根線傳輸),另一根是時鍾線SCL。

  I2C總線通過上拉電阻接正電源。因此,當總線空閑時,兩根線均為高電平(這也就是后面在寫I2C協議時,當主機從EEPROM讀取完最后一個字節的數據,在給EEPROM發送非應答信號(高電平)時,沒有在程序中寫SDL高電平的原因)。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線“與”關系。每個接到I2C總線上的器件都有唯一的地址。數據的傳輸也可以是雙向的。

二、I2C總線通信協議

(一)時序

  只有在總線處於非忙狀態時,數據傳輸才能被初始化。在數據傳輸期間,只要時鍾線為高電平,數據線都必須保持穩定,否則數據線上的任何變化都被當作啟動停止信號。圖 1 是被定義的總線狀態。

① 總線非忙狀態(A 段) 

數據線SDA  時鍾線 SCL 都保持高電平。 

② 啟動數據傳輸(B 段) 

當時鍾線(SCL)為高電平狀態時,數據線(SDA)由高電平變為低電平的下降沿被認為是啟動信號。只有出現啟動信號后,其它的命令才有效。

③ 停止數據傳輸(C 段) 

當時鍾線(SCL)為高電平狀態時,數據線(SDA)由低電平變為高電平的上升沿被認為是停止信號。隨着停在信號出現,所有的外部操作都結束。 

④ 數據有效(D 段) 

在出現啟動信號以后,在時鍾線(SCL)為高電平狀態時數據線是穩定的,這時數據線的狀態就要傳送的數據。數據線(SDA)上的數據的改變必須在時鍾線為低電平期間完成,每位數據占用一個時鍾脈沖。

⑤ 應答信號 (ACK和NACK)

I2C總線上的所有數據都是以8位字節傳送,發送器每發送一個字節,就在時鍾脈沖9期間釋放數據線,由接收器反饋一個應答信號。應答信號為低電平時,規定為有效應答位(ACK),表示接收器已經成功接收了該字節;應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。但是當接收器是主控器(比如單片機對EEPROM進行讀操作,則單片機即為接收器),則它在收到最后一個字節后,也會發送一個NACK信號(並不是說沒有成功),以通知被控發送器結束數據發送,並釋放SDA總線,以便主控器發送一個停止信號。

以EEPROM為例:每個正在接收數據的EEPROM 在接到一個字節的數據后,通常需要發出一個應答信號(由主機接收)。而每個正在發送數據的EEPROM 在發出一個字節的數據后,通常需要接收一個應答信號(由主機發出)。EEPROM 讀寫控制器必須產生一個與這個應答位相聯系的額外的時鍾脈沖。在EEPROM 的讀操作中,EEPROM 讀寫控制器對EEPROM 完成的最后一個字節不產生應答位(高電平),但是應該給EEPROM 一個結束信號。

(二)數據幀格式

I2C總線上傳送的數據信號是廣義的,既包括地址信號,又包括正真的數據信號。

I2C總線上的所有數據都是以8位字節傳送。在起始信號后必須傳送一個從機的地址(7位),第8位是數據的傳送方向為(R/W),用0表示主機寫(發送),用1表示主機讀(接收)。每次數據傳送總是由主機產生的終止信號結束。但是,若主機希望繼續占用總線進行新的數據傳送,則可以不產生終止信號,馬上再次發出起始信號對另一從機進行尋址。

(三)總線的尋址

I2C總線協議有明確的規定:采用7位的尋址字節(尋址字節是起始信號后的第一個字節)。

尋址字節的定義:D7~D1位組成從機的地址。D0位是數據傳送的方向位。

當主機發送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同,則認為自己正被主機尋址,根據R/T位將自己確定為發送器或接收器。

從機的地址由固定部分和可編程部分組成。在一個系統中可能希望接入多個相同的從機(固定部分相同),從機地址中可編程部分決定了可接入總線該類器件的最大數目。如一個從機的7位尋址位有4位是固定位,3位是可編程位,這時僅能尋址8個同樣的器件,即可以有8個同樣的器件接入到該I2C總線系統中。

三、I2C總線的應用舉例

(一)I2C 設備讀寫操作的種類

   在這里以 AT24C04 為例說明 I2C 讀寫的基本操作和時序,I2C 設備的操作可分為寫單個
存儲字節,寫多個存儲字節,讀單個存儲字節和讀多個存儲字節。各個操作如下圖所示。

其中:

Device Address:從機地址=4位固定位+3位可編程位

Word Address:將要讀或寫的存儲單元的首地址(若是讀/寫多個存儲字節,每讀/寫完一個字節的數據,這個地址會自動加1)

(二)單個存儲字節的讀寫操作具體過程舉例

① EEPROM 的寫操作(字節編程方式) 

  所謂EEPROM 的寫操作(字節編程方式)就是通過讀寫控制器把一個字節數據發送到EEPROM 中指定地址的存儲單元。其過程如下:EEPROM 讀寫控制器發出啟動信號后,緊跟着發送4 I2C 總線器件特征編碼1010 3 EEPROM 芯片地址/頁地址XXX 以及寫狀態的R/W (=0)到總線上,然后等待EEPROM 發出應答信號;若接收到應答,讀寫控制器將跟着發送1 個字節的EEPROM 存儲單元地址,然后等待EEPROM 再一次發出應答信號;若再次接收到應答則繼續寫入1 個字節數據到被尋址的存儲單元,之后EEPROM 再一次發出應答信號;讀寫控制器收到此應答信號后,便產生停止信號。字節寫入幀格式如圖2 所示:

② 二線制I2C CMOS 串行EEPROM 的讀操作 

  所謂EEPROM 的讀操作即通過讀寫控制器讀取 EEPROM 中指定地址的存儲單元中的一個字節數據。串行EEPROM 的讀操作分兩步進行:讀寫器首先發送一個啟動信號和控制字節(包括頁面地址和寫控制位R/W = 0)EEPROM,再通過寫操作設置EEPROM 存儲單元地址(注意:雖然這是讀操作,但需要先寫入地址指針的值),在此期間EEPROM 會產生必要的應答位。接着讀寫器重新發送另一個啟動信號和控制字節(包括頁面地址和讀控制位R/W = 1)EEPROM 收到后發出應答信號,然后,要尋址存儲單元的數據就從SDA 線上輸出。讀操作有三種: 讀當前地址存儲單元的數據、讀指定地址存儲單元的數據、讀連續存儲單元的數據。在這里只介紹讀指定地址存儲單元數據的操作。讀指定地址存儲單元數據的幀格式如圖3

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com