今天花費了一天時間,研究i2c總線的特點。因為我要用FPGA設計操作i2c總線的時序.i2c總線是常用的串行總線。我要操作的串行eeprom AT24C512。該EEPROM 容量是512KBIT,內部按照每頁128字節組織,總共是512頁。根據我的設計構思,准備使用PAGE WIRET 和隨機連續讀 兩種命令方式。讀寫准備按照頁方式進行。根據我上面的要求,我仔細研讀eeprom 手冊。下面我分享我讀書心得。
第一點:芯片工作速度選擇: 根據AT24C512手冊可以知道,該款芯片的電壓工作可以為1.8V-5.0V ; 不同電壓等級I2C總線的最大工作速度不同。1.8V--最大工作速度fscl=100K; 2.7V----最大工作速度fscl=400K;5.0V----最大工作速度fscl=1000K. 在本案中,我要操作的AT24C512 電壓等級是3.3V. 因此,我定義fscl=200K(取最大速度的一半),保證時序。
第二點:寫周期耗時間(Write Cycle Time)-Twr。 該參數也是編寫FPGA程序需要特別考慮一個時間。根據DATASHEET,該參數定義了從I2C總線停止位開始到數據真正寫到存儲區,EEPROM內部耗時。該參數與AT24C512的工作電壓有關。從DATASHEET可以看到,1.8V的芯片,該參數最大為20毫秒;2.7V和5V的芯片,該參數的最大時間為10毫秒。
第三點:AT24C512支持讀寫操作方式:從DATASHEET可以看到,兩種寫方式和4種讀操作方式。
1. 當前地址寫操作方式:
EEPROM內部具有保持當前地址的寄存器。對當前地址進行寫操作時,不需要指定地址。只要單純給出寫指令和該地址數據即可。寫操作完成后,內部所保持的當前地址將自動進位。其時序圖如下:

這是指定任意的地址(8位)寫人數據的方式。 起始字節的DEVSEL按照前面描述的起始數據的格式,位7~4是“1010”的固定模式,位操作(“1”)還是寫操作(“0”)。如果存儲器處於寫保護狀態(WC引腳為高電平等),則在接收地址之前一直返回ACK信號,對於之后傳輸的數據,則返回No-ACK信號。
數據發送完畢后,如果檢測出來自主機的結束條件,則EEP-ROM內部開始進行寫入操作。根據數據手冊可查出完成寫入操作所需要的時間。+5V的產品需要5ms,其他的產品大約需要10ms左右的時間。
EEPROM內部的替換周期在進行過程中,即使發送下一個指令也將返回NoACK信號。因此,利用該NoACK信號就可判斷內部的操作是否完成。
數據發送完畢后,如果檢測出來自主機的結束條件,則EEP-ROM內部開始進行寫入操作。根據數據手冊可查出完成寫入操作所需要的時間。+5V的產品需要5ms,其他的產品大約需要10ms左右的時間。
EEPROM內部的替換周期在進行過程中,即使發送下一個指令也將返回NoACK信號。因此,利用該NoACK信號就可判斷內部的操作是否完成。
2. 頁地址寫操作方式
頁面寫操作本身與字節寫是相同的。由於在存取后地址自動進位,因而可以按序發送1頁(16字節)以內的數據。實際上向存儲器單元的寫人操作,與字節寫相同,都是在檢測出結束條件后進行的,所以需要等待,直到操作結束,然后再進行下一個操作。其時序圖如下:


3. 當前地址讀操作方式
E
EPROM
內部具有保持當前地址的
寄存器
。讀取當前地址的數據時,不需要指定地址。只要單純給出讀指令就可讀出數據。讀取完畢后,內部所保持的當前地址將自動進位。其時序圖如下:


4. 指定地址讀操作方式(隨機讀)
隨機讀是由主機指定任意的地址讀取的。利用寫指令設定地址,如果賦予讀指令則可以讀出當前地址。所以,與字節寫操作時相同,在第1字節的數據后面給出地址。在這里,一旦發送出數據就成為寫操作,在此設置開始條件,取消向寫操作的遷移而發出讀指令,將從事先設定的地址中讀出數據。此時,DEVSEL數據(前7位數據)必須設定與最初寫指令所發送的相同的值。時序圖如下:


5.指定地址順序讀操作方式(順序讀)
在當前地址讀操作之后,如果主機返田ACK信號,則為順序讀模式,器件將准備下一個地址的數據,主機取回該數據。一旦到達要讀出的最終地址,主機將返回NoACK信號,通知器件這已是最后的數據。


6.指定地址順序隨機讀操作方式(順序隨機讀)
當指定任意地址、希望由此連續讀出數據時,可利用該模式。只要認為這是與對應於當前讀的順序讀相同的模式即可。
順序隨機讀模式與隨機讀同樣進行讀操作,接收到數據后如果是ACK應答,則器件將准各下一個地址的數據;如果是最終數據,則返回NoACK信號,結束數據的傳輸。時序圖同上
順序隨機讀模式與隨機讀同樣進行讀操作,接收到數據后如果是ACK應答,則器件將准各下一個地址的數據;如果是最終數據,則返回NoACK信號,結束數據的傳輸。時序圖同上
第4點:數據傳遞時序。I2C總線,所有操作時序都遵循這個原則:高電平,取數據;低電平,不取數據。所有對於所有時序編程來說,要求在低電平准備好數據,然后高電平傳遞。時序圖如下:


第5點:IO總線操作。對應FPGA IO總線操作技巧一定要處理好。
個人認為:掌握好以上5點,用CPU編程操作I2C總線一點是一點問題都沒有!
特別要注意一點:接收到EEPROM響應(ACK后),不要下一個時鍾周期就給數據總線給高電平,這樣會造成總線沖突!