i2c 匯流排介面單元

53
1 14-1 I2C 匯匯匯匯匯匯匯

Upload: milica

Post on 19-Mar-2016

142 views

Category:

Documents


8 download

DESCRIPTION

I2C 匯流排介面單元. 大綱. 概觀 信號說明 功能說明 I2C 匯流排操作 Slave 模式程式設計範例 Master 程式設計範例. 概觀. I2C Bus 是由飛利浦研發的一個二支腳位的序列匯流排 SDA 資料腳位 - 輸入和輸出功能 SCL 時脈腳位 - 控制和參考 I2C 匯流排 I2C 單元允許處理器透過 I2C 匯流排來服務 master 和 slave 裝置 I2C 單元啟動應用程式處理器與 I2C 周邊設備作溝通以及使用微控制器達成系統管理功能. I2C 介面圖. 概觀 (cont.). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: I2C 匯流排介面單元

114-1

I2C匯流排介面單元

Page 2: I2C 匯流排介面單元

214-2

大綱 概觀 信號說明 功能說明 I2C匯流排操作 Slave模式程式設計範例 Master程式設計範例

Page 3: I2C 匯流排介面單元

314-3

概觀 I2C Bus是由飛利浦研發的一個二支腳位的序列匯流排

SDA資料腳位 - 輸入和輸出功能 SCL時脈腳位 - 控制和參考 I2C匯流排

I2C單元允許處理器透過 I2C匯流排來服務master和 slave裝置

I2C單元啟動應用程式處理器與 I2C周邊設備作溝通以及使用微控制器達成系統管理功能

Page 4: I2C 匯流排介面單元

414-4

I2C 介面圖

Page 5: I2C 匯流排介面單元

514-5

概觀 (cont.)

I2C單元是屬於應用程式處理器內部匯流排的一個周邊設備 資料是經由一個緩衝介面來傳送到 I2C匯流排以及從 I2C匯流排來接收 控制和狀態資訊是透過一組記憶體映像暫存器來傳送

Page 6: I2C 匯流排介面單元

614-6

信號說明 I2C單元信號為 SDA和 SCL

信號名稱 輸入 / 輸出 說明 SDA 雙向 I2C 序列資料 / 位址信號SCL 雙向 I2C 序列時脈線信號

Page 7: I2C 匯流排介面單元

714-7

功能說明 I2C 匯流排定義一個由序列資料 / 位址 (SDA)線和序列時脈線 (SCL)組成的序列協定給 I2C匯流排上的代理器處理來處理通過的資訊

I2C匯流排上的每個裝置是由一個獨特的 7 位元位址來識別而且可以在 master或 slave模式下當成傳送端或接收端來操作

Page 8: I2C 匯流排介面單元

814-8

功能說明 (cont.)

I2C 裝置 定義 傳送端 傳送資料到 I2C匯流排接收端 從 I2C匯流排接收資料 Master 起始傳送,產生時脈信號,終止傳送 Slave 由 master來定址裝置 Multi-master

多個 master能同時試著控制匯流排調停 當多個 master同時嘗試要控制匯流排時,保證只有一個 master能控制匯流排

Page 9: I2C 匯流排介面單元

914-9

功能說明 (cont.)

當應用程式處理器 I2C單元在匯流排上作用為 master 時 , 它定址一個 EEPROM 為 slave來接收資料。當 I2C單元定址 EEPROM時,它是一個 master傳送端而 EEPROM是一個 slave接收端。當I2C讀取資料時,它是一個 master接收端而 EEPROM是一個slave傳送端。不管它是傳送端或是接收端, master會產生時脈信號,起始傳送,還有終止傳送

Page 10: I2C 匯流排介面單元

1014-10

功能說明 (cont.)

I2C匯流排允許 multi-master系統,意思是當多個裝置能同時起始資料傳輸 I2C匯流排調停 ( 藉著硬體接線及閘連接所有I2C介面到 I2C匯流排

二個 masters能同時驅動匯流排,前提是他們所傳送的資料是相同的 假如一個 master嘗試去驅動 SDA高電位而另一

個 master驅動 SDA為低電位時,則調停失敗 SCL線是一個由所有的 master使用硬體接線及閘連接到 SCL線所產生的同步時脈組合

Page 11: I2C 匯流排介面單元

1114-11

操作區塊 I2C單元是連接到周邊的匯流排,應用程式處理器使用中斷機制來通知 CPU在 I2C匯流排上的動作 可以使用輪詢來取代中斷 I2C單元是由二條接線介面到 I2C匯流排,由一個 8 位元緩衝器來傳送與接收從應用程式處理器來的資料、一組控制與狀態暫存器和平

行 / 序列轉換的移位暫存器所組成

Page 12: I2C 匯流排介面單元

1214-12

操作區塊 (cont.)

當緩衝區滿溢、緩衝區清空、檢測到 I2C單元slave位址、調停失敗、或是匯流排錯誤情況發生時, I2C單元會初始啟動中斷應用程式處理器。所有中斷情況必須由軟體確實地清除

當接收到資料時, 8 位元 I2C資料緩衝區暫存器(IDBR)從移位暫存器介面載入一個位元組的資料到 I2C匯流排

當寫入資料時, 8 位元 I2C資料緩衝區暫存器(IDBR)從應用程式處理器內部匯流排載入一個位元組的資料到 I2C匯流排

Page 13: I2C 匯流排介面單元

1314-13

I2C匯流排介面模式模式 說明Master傳送 •I2C 單元作為 master •為寫入操作使用

• I2C 單元傳送資料•I2C 單元回應時脈 • Slave裝置在 slave接收模式下

Master接收 •I2C 單元作為 master •為讀取操作使用 • I2C 單元接收資料

•I2C 單元回應時脈 • Slave裝置在 slave傳送模式下Slave傳送 •I2C 單元作為 slave • 為 master讀取操作使用

• I2C 單元傳送資料• Master裝置在 master接收模式下

Slave接收( 預設 )

•I2C 單元作為 slave •為 master寫入操作使用 • I2C 單元接收資料

• Master裝置在 master傳送模式下 當 I2C單元為閒置時,它預設為 slave接收模式。這樣允許介面去監視匯流排而且接收任何應用程式處理器的 slave位址

Page 14: I2C 匯流排介面單元

1414-14

START 與 STOP匯流排狀態 START:在傳輸一開始時使用 STOP:在傳輸結束時使用 當 SCL是高電位時, SDA線上發生高電位轉換到低電位的話, START狀況將發生 當 SCL是高電位時, SDA線上發生低電位轉換到高電位的話, STOP狀況將發生

Page 15: I2C 匯流排介面單元

1514-15

START 與 STOP匯流排狀態 (Cont.)

STOP位元

START位元

狀況 注意

0 0 無START

或 STOP

I2C單元傳送一個沒有 START或 STOP狀況,當多個資料位元組需要傳輸時使用。

0 1 START而且重複START

I2C單元傳送一個 START狀況而且傳送 8 位元 IDBR的內容在一個 START開始前 IDBR必須包含 7 位元位址和 R/nW位元為了重複 START, IDBR 包含有目標 slave位址和 R/nW位元允許一個 master能執行多傳輸到不同的 slaves而不用讓出流排1 X STOP 在 master傳送模式下, I2C單元傳送 8 位元 IDBR和在 I2C匯流排上發送一個 STOP狀況。在 master接收模式下, ICR[ACKNAK]必須變成否定 ACK , I2C單元傳送 NAK位元,在 IDBR中接收資料位組,還有在 I2C匯流排上發送一個 STOP狀況。

I2C單元使用 ICR[START]和 ICR[STOP]位元

Page 16: I2C 匯流排介面單元

1614-16

START 與 STOP匯流排狀態 (cont.)

START和 STOP狀況

Page 17: I2C 匯流排介面單元

1714-17

START 與 STOP匯流排狀態 (cont.)

START 和 STOP狀況

Page 18: I2C 匯流排介面單元

1814-18

I2C匯流排操作 I2C單元以 1 位元組增量來傳輸資料隨著下列順序: 1) START 2) 7位元 Slave位址 3) R/nW位元 4) 認可脈衝 5) 8位元的資料 6) ACK/NAK脈衝 7) 重複步驟 5 和 6 給必須的位元組號碼 8) 重複 START(重複步驟 1)或 STOP

Page 19: I2C 匯流排介面單元

1914-19

資料與定址管理 I2C資料緩衝區暫存器 (IDBR)和 I2C Slave位址暫存器 (ISAR)是用來管理資料和 slave的定址 IDBR包含一個位元組的資料或 7 位元 slave位址加上 R/nW 位元 ISAR 包含應用程式處理器可程式化 slave位址

Page 20: I2C 匯流排介面單元

2014-20

資料與定址管理 (cont.)

這個位元組由預期裝置的 slave位址和動作定義的 R/nW位元組成,

最高有效位元優先傳送, slave位址和 R/nW位元寫入到 IDBR 當動作是寫入時, I2C單元仍在 master傳送模式下而且定址 slave裝置停留在 slave接收模下。 當動作是讀取時, I2C單元隨著接收到 ACK立即轉換到 master接收模式而定址 slave裝置轉換

到 slave傳送模式下

Page 21: I2C 匯流排介面單元

2114-21

定址 Slave裝置 圖 9-4. Master動作中第一個位元組的資料格式

Page 22: I2C 匯流排介面單元

2214-22

I2C 認可 每個 I2C位元組傳輸必須伴隨在由 master或 slave接收所產生的認可脈衝之後,傳送者必須釋放 SDA線給接收者傳送認可脈衝 ( 見圖 9-5 I2C匯流排上的認可 )

Page 23: I2C 匯流排介面單元

2314-23

調停 I2C匯流排的 multi-master功能需要 I2C匯流排調停,當二或多個 master在最短的停留時間產生 START狀況時調停將發生 因 I2C匯流排有硬體接線及閘,假如多個master發出同樣匯流排狀態的信號,傳輸不會遺失資料

假如他們包含的位址和 R/nW位元或是資料不一樣時, master發出高電位狀態來表示調停失敗並關閉它的資料驅動器

Page 24: I2C 匯流排介面單元

2414-24

SCL調停 每個 I2C匯流排上的 master為了在 SCL線上的資料傳輸會產生它自己的時脈,不同頻率的時脈連接到 SCL線,當時脈是在高電位期間時資料是有效的,位元接著位元的調停需要明確的時脈同步程序。 時脈同步是透過 I2C介面到 SCL線的硬體接線及閘連接。 Master擁有最長的時脈週期者會將 SCL維持在低電位

Page 25: I2C 匯流排介面單元

2514-25

SCL調停 (Cont.)

調停程序期間的時脈同步

Page 26: I2C 匯流排介面單元

2614-26

SDA調停 在 SDA線上的調停可以繼續一段長時間因為它由位址和R/nW位元開始且繼續透過資料位元,假如二個以上的master連接到匯流排,其位址位元跟 R/nW一樣的話,調停系統會認為是資料,因為 I2C匯流排有接線及閘

假如 master包含的位址和 R/nW位元或是資料不一樣時, master發出第一個低電位資料位元來表示調停失敗並關閉它的資料驅動器 假如 I2C單元調停失敗,對於剩餘的位元傳輸它會關閉SDA或 SCL的驅動器來停止,且設置 ISR[ALD]位元,並回到 slave接收模式。

Page 27: I2C 匯流排介面單元

2714-27

SDA調停 (Cont.)

二個 Master的調停程序

Page 28: I2C 匯流排介面單元

2814-28

Master 操作 Master傳送 — I2C單元寫入資料 Master接收 — I2C單元讀取資料

Page 29: I2C 匯流排介面單元

2914-29

Master 操作 (Cont.) Master接收端從 Slave傳送端讀取

Page 30: I2C 匯流排介面單元

3014-30

Master 操作 (Cont.) Master接收端從 Slave傳送端 / 重複 START / Master傳送端寫入到 Slave接收端

Page 31: I2C 匯流排介面單元

3114-31

Master 操作 (Cont.) 完整的資料傳輸

Page 32: I2C 匯流排介面單元

3214-32

Slave 操作 Master傳送端寫入到 Slave接收端

Page 33: I2C 匯流排介面單元

3314-33

Slave 操作 (Cont.) Master接收端讀取到 Slave傳送端

Page 34: I2C 匯流排介面單元

3414-34

Slave 操作 (Cont.) Master接收端讀取到 Slave傳送端、重複啟動、 Master傳送端寫入到 Slave接收端

Page 35: I2C 匯流排介面單元

3514-35

一般呼叫位址 一般呼叫位址是以 slave位址 0x00來進行動作,當一個裝置需要從一般呼叫位址來的資料時,它會認可動作且停留在 slave接收端模式,否則裝置會忽略一般呼叫位址。一般呼叫動作中的其他位元組是由每個在匯流排上使用它的裝置來認可,裝置不使用這些位元組時不必發送 ACK,這表示一般呼叫位址是定義在第二個位元組而是由 master傳送端發送。 當 B=1時,順序是硬體一般呼叫且 I2C單元不支援

Page 36: I2C 匯流排介面單元

3614-36

一般呼叫位址 (Cont.)

圖 9-14. 一般呼叫位址

Page 37: I2C 匯流排介面單元

3714-37

一般呼叫位址 (cont.)

第二個位元組的最低有效位元(B)

第二個位元組值 定義

0 0x06 第二個位元組的 2 位元組動作告訴slave重置並儲存這個值到它位址可程式化部分

0 0x04 第二個位元組的 2 位元組動作告訴slave儲存這個值到它位址可程式化部分。沒有重置

0 0x00 不允許為第二個位元組

Page 38: I2C 匯流排介面單元

3814-38

Slave模式程式設計範例 初始單元 1. 設置 ISAR中的 slave位址 2. 啟動 ICR中要求的中斷 3. 設置 ICR[IUE]位元來啟動 I2C單元

Page 39: I2C 匯流排介面單元

3914-39

Slave模式程式設計範例 (Cont.)

寫入 n 個位元組為 Slave 1. 當 Slave位址檢測到中斷發生時 讀取 ISR: Slave位址檢測 (1)、單元忙碌 (1)、 R/nW位元 (1)、 ACK/NAK (0) 2. 寫入 1 到 ISR[SAD]位元來清除中斷 3. 從中斷返回 4. 載入 IDBR中的資料位元組來傳輸 5. 設置 ICR[TB]位元 6. 當 IDBR傳送空的中斷發生 讀取 ISR: IDBR傳送空的 (1)、 ACK/NAK (0)、 R/nW位元 (0)

Page 40: I2C 匯流排介面單元

4014-40

Slave模式程式設計範例 (Cont.)

7. 載入 IDBR中的資料位元組來傳輸 8. 設置 ICR[TB]位元 9. 寫入 1 到 ISR[ITE]位元來清除中斷 10. 從中斷返回 11. 重複步驟 6 到 10 n-1次,假如 slave在沒有資料, I2C單元保持 SCL在低電位直到有可用的資料 12. 當 IDBR傳送空的中斷發生 讀取 ISR: IDBR傳送空的 (1) 、 ACK/NAK

(1) 、 R/nW位元 (0) 13. 寫入 1 到 ISR[ITE]位元來清除中斷 14. 從中斷返回 15. 當 Slave停止檢測中斷發生 讀取 ISR: 單元忙碌 (0) 、 Slave停止檢測 (1) 16. 寫入 1 到 ISR[SSD]位元來清除中斷

Page 41: I2C 匯流排介面單元

4114-41

Slave模式程式設計範例 (Cont.)

讀取 n 個位元組為 Slave 1. 當 Slave位址檢測中斷發生 讀取 ISR: Slave位址檢測 (1)、 單元忙碌 (1)、 R/nW位元 (0) 2. 寫入 1 到 ISR[SAD]位元來清除中斷 3. 從中斷返回 4. 設置 ICR[TB]位元來開始傳輸 5. 當 IDBR接收到滿溢的中斷發生 讀取 ISR: IDBR接收滿溢 (1)、 ACK/NAK (0)、 R/nW位元 (0)

Page 42: I2C 匯流排介面單元

4214-42

Slave模式程式設計範例 (Cont.)

6. 讀取 IDBR來得到接收的位元組 7. 寫入 1 到 ISR[IRF]位元來清除中斷 8. 從中斷返回 9. 重複步驟 4 到 8 n-1次,當 IDBR滿溢時, I2C單元將 SCL維持在低電位直到讀取資料 10. 設置 ICR[TB]位元來釋放 I2C匯流排 允許下一個傳輸 11. 當 Slave停止檢測中斷發生 讀取 ISR: 單元忙碌 (0)、 Slave停止檢測(1)

12. 寫入 1 到 ISR[SSD]位元來清除中斷

Page 43: I2C 匯流排介面單元

4314-43

Master程式設計範例 初始單元 1. 設置 ISAR中的 slave位址 2. 啟動 ICR中要求的中斷 不要啟動調停失去 檢測中斷 3. 設置 ICR[IUE]和 ICR[SCLE]位元 來啟動 I2C單元與 SCL

Page 44: I2C 匯流排介面單元

4414-44

Master程式設計範例 (Cont.)

寫入 1 個位元組為 Master 1. 載入 IDBR中的目標 slave位址和 R/nW位元, R/nW為寫入必須設定為 0 2. 開始寫入 設置 ICR[START],清除 ICR[STOP] 清除 ICR[ALDIE],設置 ICR[TB] 3. 當 IDBR傳送清空的中斷發生 讀取 ISR: IDBR傳送空的 (1),單元忙碌 (1), R/nW位元

(0) 4. 寫入 1 到 ISR[ITE]位元來清除中斷 5. 假如設置的話寫入 1 到 ISR[ALD]位元 . 假如 master調停失敗,它當匯流排變成空閒時執行位址重試 調停失敗檢測中斷不允許位址重試

Page 45: I2C 匯流排介面單元

4514-45

Master程式設計範例 (Cont.)

6. 載入 IDBR中的資料位元組傳輸 7. 開始寫入 清除 ICR[START],設置 ICR[STOP] 設置 ICR[ALDIE],設置 ICR[TB] 8. 當 IDBR傳送空的中斷發生( 單元發送 STOP) 讀取 ISR: IDBR傳送空的 (1) 單元忙碌 (x), R/nW位元 (0) 9. 寫入1 到 ISR[ITE]位元來清除中斷 10. 清除 ICR[STOP]位元

Page 46: I2C 匯流排介面單元

4614-46

Master程式設計範例 (Cont.)

讀取 1 個位元組為 Master 1. 載入 IDBR中的目標 slave位址和 R/nW位元, R/nW為讀取必須設定為 1 2. 開始寫入 設置 ICR[START],清除 ICR[STOP] 清除 ICR[ALDIE],設置 ICR[TB] 3. 當 IDBR傳送清空的中斷發生 讀取 ISR: IDBR傳送空的 (1),單元忙碌 (1), R/nW位元

(1) 4. 寫入 1 到 ISR[ITE]位元來清除中斷 5. 開始讀取 清除 ICR[START],設置 ICR[STOP],設置 ICR[ALDIE] 設置 ICR[ACKNAK],設置 ICR[TB]

Page 47: I2C 匯流排介面單元

4714-47

Master程式設計範例 (Cont.)

6. 當 IDBR接收到滿溢的中斷發生 ( 單元發送 STOP) 讀取 ISR: IDBR接收滿溢 (1),單元忙(x)

R/nW位元 (1), ACK/NAK位元 (1) 7. 寫入 1 到 ISR[IRF]位元來清除中斷 8. 讀取 IDBR資料 9. 清除 ICR[STOP]和 ICR[ACKNAK]位元

Page 48: I2C 匯流排介面單元

4814-48

Master程式設計範例 (Cont.)

寫入 2 個位元組與重複 START讀取 1 個位元組為 Master 1. 載入 IDBR中的目標 slave位址和 R/nW位元, R/nW為寫入必須設定為 0 2. 開始寫入 設置 ICR[START],清除 ICR[STOP], 清除 ICR[ALDIE],設置 ICR[TB] 3. 當 IDBR傳送清空的中斷發生 讀取 ISR: IDBR傳送空的 (1),單元忙碌 (1) , R/nW位元 (0) 4. 寫入 1 到 ISR[ITE]位元來清除中斷 5. 載入 IDBR中的資料位元組來傳輸 6. 開始寫入 清除 ICR[START],清除 ICR[STOP], 設置 ICR[ALDIE],設置 ICR[TB]

Page 49: I2C 匯流排介面單元

4914-49

Master程式設計範例 (Cont.)

7. 當 IDBR傳送清空的中斷發生 讀取 ISR: IDBR傳送空的 (1),單元忙碌 (1), R/nW位元

(0) 8. 寫入 1 到 ISR[ITE]位元來清除中斷 9. 重複步驟 5-8一次 10. 載入 IDBR中的目標 slave位址和 R/nW位元, R/nW為讀取必須設定為 1 11. 發送重複 START當作 master 設置 ICR[START],清除 ICR[STOP], 清除 ICR[ALDIE],設置 ICR[TB] 12. 當 IDBR傳送清空的中斷發生 讀取 ISR: IDBR傳送空的 (1),單元忙碌 (1), R/nW位

元 (1) 13. 寫入1 到 ISR[ITE]位元來清除中斷

Page 50: I2C 匯流排介面單元

5014-50

Master程式設計範例 (Cont.)

14. 開始讀取 清除 ICR[START],設置 ICR[STOP], 設置 ICR[ALDIE],設置 ICR[ACKNAK], 設置 ICR[TB] 15. 當 IDBR接收到滿溢的中斷發生( 單元發送 STOP) 讀取 ISR: IDBR接收滿溢 (1),單元忙碌 (x), R/nW位元 (1), ACK/NAK位元 (1) 16. 寫入1 到 ISR[IRF]位元來清除中斷 17. 讀取 IDBR資料 18. 清除 ICR[STOP]和 ICR[ACKNAK]位元

Page 51: I2C 匯流排介面單元

5114-51

Master程式設計範例 (Cont.)

讀取 2 個位元組為 Master – 使用放棄傳送 STOP 1. 載入 IDBR中的目標 slave位址和 R/nW位元, R/nW為讀取必須設定為 1 2. 開始寫入 設置 ICR[START],清除 ICR[STOP], 清除 ICR[ALDIE],設置 ICR[TB] 3. 當 IDBR傳送清空的中斷發生 讀取 ISR: IDBR傳送空的 (1),單元忙碌 (1), R/nW位元

(1) 4. 寫入 1 到 ISR[ITE]位元來清除中斷 5. 開始讀取 清除 ICR[START],清除 ICR[STOP],設置 ICR[ALDIE], 清除 ICR[ACKNAK],設置 ICR[TB]

Page 52: I2C 匯流排介面單元

5214-52

Master程式設計範例 (Cont.)

6. 當 IDBR接收到滿溢的中斷發生 讀取 ISR: IDBR接收滿溢 (1),單元忙碌 (1), R/nW位元 (1) , ACK/NAK位元 (0) 7. 寫入 1 到 ISR[IRF]位元來清除中斷 8. 讀取 IDBR資料 9. 清除 ICR[STOP] 和 ICR[ACKNAK]位元 10. 開始讀取 . 清除 ICR[START],清除 ICR[STOP], 設置 ICR[ALDIE],設置 ICR[ACKNAK], 設置 ICR[TB] ICR[STOP]沒設置是因為 STOP或重複 START將決定位元組讀取

Page 53: I2C 匯流排介面單元

5314-53

Master程式設計範例 (Cont.)

11. 當 IDBR接收到滿溢的中斷發生 讀取 ISR: IDBR接收滿溢 (1), 單元忙碌 (1), R/nW位元 (1), ACK/NAK位元 (1) 12. 寫入 1 到 ISR[IRF]位元來清除中斷 13. 讀取 IDBR資料 14. 開始停止放棄狀況 (STOP則無資料傳輸 )