I2C詳解學習 - nRF52832藍牙芯片 TWI-I2C學習詳解筆記

(本文部分來源於網上資源)

1. I2C 總線概述

1.1 主要特徵

nRF52832 片內集成了 TWI(Two-wire Serial Interface)兩線串行總線,TWI 完全兼容 I2C 總線,簡單一點,可以直接認爲 TWI 是 I2C 總線。
典型的 I2C 應用原理如下圖所示,I2C 總線通訊僅需兩根信號線,可以連接多個設備, 從設備都有唯一的地址,主設備通過從設備的地址和不同的從設備通訊。

                       

                                                    圖 22-1:典型的 I2C 總線應用

 

I2C  總線硬件結構簡單,僅需一根時鐘線(SCL)、一根數據線(SDA)和兩個上拉電阻即可實現通訊。

I2C 總線的 SCL 和 SDA 均爲開漏結構,開漏結構的電路只能輸出“邏輯 0”,無法輸出“邏輯 1”,因此 SCL 和 SDA 需要連接上拉電阻。

上拉電阻的阻值影響傳輸速率,阻值越大,由於 RC 影響,會帶來上升時間的增大,傳輸的速率慢,阻值小,傳輸的速率快,但是會增加電流的消耗,一般情況下,我們會選擇 4.7K 左右的阻值,在從機數量少,信號線短的情況下,可以適當增加阻值,如使用 10K 的阻值。

I2C 總線中的從設備必須有自己的地址,並且該地址在其所處的 I2C 總線中唯一,主設備通過此唯一的地址即可和該從設備進行數據傳輸。

I2C 總線支持多主機,但是同一時刻只允許有一個主機。I2C 總線中存在多個主機時, 爲了避免衝突,I2C 總線通過總線仲裁決定由哪一個主機控制總線。

I2C 總線只能傳輸 8 位的數據,數據速率在標準模式下可達 100Kbit/s,快速模式下可達400Kbit/s,高速模式下可達 3.4Mbit/s,nRF52832 的 I2C 總線不支持高速模式。

同時連接到同一個 I2C 總線上的設備數量受總線最大電容(400pF)的限制。

I2C 總線電流消耗很低,抗干擾強,適合應用於低功耗的場合。

 

1.2 I2C 地址

I2C 總線中的設備必須要有唯一的地址,這意味着如果在總線中接入兩個相同的設備, 該設備必須有配置地址的功能,這也是我們經常用的 I2C 接口的設備會有幾個引腳用來配置地址的原因。

對於 I2C 地址,我們經常看到有的 I2C 接口設備在規格書中描述的是 7 位地址,而有的I2C 接口設備在規格書中描述的是 8 位地址,它們有什麼區別?(I2C 也有 10 位地址,但用的較少,這裏不做介紹,本章中的內容不涉及到 10 位地址)。

7 位地址和 8 位地址如下圖所示,它們結構上是一樣的,都是由 7 個地址位加一個用來表示讀寫的位組成,只是描述上有所區別。

規格書中描述I2C 地址是 7 位地址的設備:給出的是 7 個地址位加R/W 位,最低位(R/W 位)爲 0 時表示爲寫地址,最低位爲 1 時爲讀地址。如果把 0 和 1 分別帶入 R/W 位, 得到的地址就和 8 位地址一樣了。

規格書中描述 I2C 地址是 8 位地址的設備:直接給出寫地址和讀地址,也就是最低位(R/W 位)爲 0 時的地址和最低位爲 1 時的地址。

                          

                                                                 22-2:I2C 地址

 

   由此可見,所謂的 7 位地址和 8 位地址實際上都是 7 位地址加上最低位的讀寫位,本質上是一樣的,只是各個 I2C 接口設備的描述方式不一樣。

I2C 保留了如下表所示的兩組 I2C 地址,這些地址用於特殊用途。

 

從機地址   

R/ W 位   

描述

 


表 22-1:保留地址

 

0000 000   

0

廣播呼叫地址。

0000 000   

1

起始字節。

0000 001   

X

CBUS 地址。  

0000 010   

X

保留給不同的總線格式 。

0000 011   

X

保留到將來使用。

0000 1XX   

X

Hs 模式主機碼。

1111 1XX   

X

保留到將來使用。

1111 0XX   

X

10 位從機尋址。

 

1.3 I2C 數據傳輸

(1)起始和停止條件(START and STOP conditions

所有的 I2C 事務都是以 START 開始、STOP 結束,起始和停止條件總是由主機產生, 如下圖所示,當 SCL 爲高電平時,SDA 從高電平向低電平轉換表示起始條件,當 SCL 是高電平時,SDA 由低電平向高電平轉換表示停止條件。如果總線中存在多個主機,先將 SDA 拉低的主機獲得總線控制權。

                            

 

                                                 圖 22-3:起始和停止條件

 

(2)字節格式(Byte format)
I2C 總線發送到 SDA 上的數據必須爲 8 位,即一次傳輸一個字節,每次傳輸可以發送的字節數量不受限制。每個字節後必須跟一個響應位,首先傳輸的是數據的最高位 MSB, 如果從機要完成一些其他功能後,例如一個內部中斷服務程序才能接收或發送下一個完整的數據字節,那麼從機可以將時鐘線 SCL 保持爲低電平強制主機進入等待狀態,當從機準備好接收下一個字節數據並釋放時鐘線 SCL 後數據傳輸繼續。

                               

 

1.4 ACK NACK

每個字節後會跟隨一個 ACK 信號。接收者通過 ACK 位告知發送者已經成功接收一字節數據並準備好接收下一字節數據。所有的時鐘脈衝包括 ACK 信號的時鐘脈衝都是由主機產生的。

ACK 信號:發送者發送完 8 位數據後,在 ACK 時鐘脈衝期間釋放 SDA 線,接收者可以將 SDA 拉低並在時鐘信號爲高時保持低電平,這樣就產生了 ACK 信號,從而使得主機知道從機已成功接收數據並且準備好了接收下一數據。

 

NACK 信號:當 SDA 在第 9 個時鐘脈衝的時候保持高電平,定義爲 NACK 信號。這時, 主機要麼產生STOP 條件來放棄這次傳輸,要麼重複START 條件來啓動一個新的傳輸。下面的 5 種情況會導致產生 NACK 信號:

(1)發送方尋址的接收方在總線上不存在,因此總線上沒有設備應答。

(2)接收方正在處理一些實時的功能,尚未準備好與主機通信,因此接收方不能執行收發。

(3)在傳輸期間,接收方收到不能識別的數據或者命令。

(4)在傳輸期間,接收方無法接收更多的數據字節。

(5)主-接收器要通知從-發送器傳輸的結束。

 

1.5 從機地址和 R/W 位
I2C 數據傳輸如下圖所示,在起始條件(S)後,發送從機地址,從機地址是 7 位,從機地址後緊跟着的第 8 位是讀寫位(R/W),讀寫位爲 0 表示寫,讀寫位爲 1 表示讀。數據傳輸一般由主機產生的停止位 P 終止,但是,如果主機仍希望在總線上通訊,它可以產生重複起始條件 S 和尋址另一個從機而不是首先產生一個停止條件,在這種傳輸中可能有不同的讀寫格式結合。

                                   

                                                                      圖 22-5:I2C 總線傳輸時序

 

可能的數據傳輸格式有:

(1)主機發送器發送到從機接收器,傳輸的方向不會改變,接收器應答每一個字節,如下圖所示

 

(2)在第一個字節後,主機立即讀從機,在第一次應答後,主機發送器變成主機接收器,從機接收器變成從機發送器。第一次應答仍由從機生成,主機生成後續應答。之前發送了一個非應答(A)的主機產生 STOP 條件。

 

                             

                                               圖 22-7:主機發送第一個字節後立即讀取從機

 

(3)複合格式,如下圖所示。傳輸改變方向的時侯,起始條件和從機地址都會被重複,但R/W 位取反。如果主接收器發送重複 START 條件,它會在重複 START 條件之前發送一個非應答(A)。

                                  

                                                                    圖 22-8:複合格式

2. nRF52832 TWI 特點

本章描述的是 TWIM(帶 EasyDMA 的 TWI 主機),本章中的 TWI 均指的TWIM,即 TWI 主機。

nRF52832 片內集成的 TWI(兩線串行總線)兼容 I2C 總線,帶有 EasyDMA,可與連接到同一總線的多個從機設備通訊,主要特點如下:

(1)兼容 I2C。

(2)速率:100 kbps、250 kbps 或 400 kbps。

(3)支持時鐘延伸。

(4)帶 EasyDMA。

(5)TWI 的 SCL 和 SDA 信號可以通過配置寄存器連接到任何一個GPIO,這樣可以靈活地實現器件引腳排列,並有效利用電路板空間和信號路由。

nRF52832 的 TWI 的原理框圖如下圖所示,TWI 主機通過觸發STARTTX 或STARTRX 任務啓動TWI 傳輸,通過觸發 STOP 任務停止 TWI 傳輸。TWI 主機在掛起時無法停止,因此必須在 TWI 主機恢復後觸發 STOP 任務停止 TWI。啓動 TWI 主機後,在TWI 主機停止之前,即在 LASTRX,LASTTX 或 STOPPED 事件之後,不應再次觸發 STARTTX 任務或STARTRX 任務。如果從機產生 NACK 輸入,那麼 TWI 主機將產生ERROR 事件。

                                       

                                                                圖 22-9:TWI 的原理框圖

 

2.1 EasyDMA

TWI 主機通過 EasyDMA 實現數據傳輸,因此 TWI 的接收和發送緩存必須位於數據RAM 區域,如果 TXD.PTR 和 RXD.PTR 未指向數據 RAM 區域,則 EasyDMA 傳輸可能導致 HardFault 或 RAM 損壞。

.PTR 和.MAXCNT 寄存器是雙緩衝的,因此在收到RXSTARTED/TXSTARTED 事件後, 可以立即更新並準備下一個 RX/TX 傳輸。STOPPED 事件表示 EasyDMA 已完成訪問 RAM 中的緩衝區。

2.2 低功耗

當系統處於低功耗且不需要 TWI 外設時,爲了儘可能降低功耗,應先停止 TWI,然後禁用TWI 外設來實現最低功耗。

如果 TWI 已經停止,則不需要觸發 STOP 任務停止 TWI,但是如 TWI 正在執行發送, 則應等待直到收到STOPPED 事件作爲響應,然後再通過ENABLE 寄存器禁用外設。

2.3 引腳配置

TWI 的 SCL 和 SDA 信號可以自由映射,通過設置 PSEL.SCL 和 PSEL.SDA 寄存器可以將它們映射到任意的物理引腳。

PSEL.SCL 和 PSEL.SDA 寄存器及其配置僅在 TWI 使能時使用,並且僅在器件處於 ON 模式時保留。TWI 禁用後,引腳將作爲常規 GPIO 使用,即可以使用 GPIO 的 OUT 位字段和PIN_CNF [n]寄存器中的配置。PSEL.SCL 和 PSEL.SDA 必須在禁用 TWI 後纔可以配置。

爲確保 SPIM 中的正確行爲,在使用 SPIM 前必須要正確配置 SPIM 的引腳,但是需要注意的是不能同時將多個 SPIM 外設的信號映射到同一個引腳,如不能將 SPIM0 和 SPIM1 的 MISO 同時映射到P0.05,否則,可能會導致不可預測的行爲。

當系統處於 OFF 模式時以及 TWI 禁用時,爲確保 TWI 主機使用的引腳上的信號電平正確,這些引腳應按照下表所示配置。

TWI 信號

SPIM 引腳

方向

輸出值

驅動能力

SCL

由PSEL.SCK 寄存器設置

輸入。

不適用

S0D1

SDA

由PSEL.SDA 寄存器設置

輸入。

不適用

S0D1

 

                                                         表 22-2:TWI 使能前GPIO 配置

TWI 寄存器

nRF52832 片內集成了 2 個 TWIM 外設,如下表所示。

外設名稱

基址

TWIM0

0x40003000

TWIM1

0x40004000

 

                                                              表 22-3:TWIM 基址

========******=========******========******=========******==========

白浪介紹:

(1)關於射頻、微波、天線、無線通信、智能硬件、軟件編程、滲透安全、人工智能、區塊鏈,Java、Android、C/C++、python等綜合能力的培養提升。

(2)各種學習資料、學習軟件分享。

1.掃碼關注公衆號(Geekxiaobai)

                                                    

2. 在後臺發送“Python高級編程”“Python Graphics”或者“2003”,即可免費獲得電子書籍。僅供學習之用。

3. 掃碼關注後,查看往期內容,會有更多資料驚喜等着你來拿哦  

   

  想要更多相關學習資料,可以在文章後面留言哦,後期將會根據留言需求免費分享學習資料哦。

========******=========******========******=========******==========

 

 

發佈了31 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章