I2C總線(基於IMX6ULL介紹)

I2C(Inter-Integrated Circuit BUS)是I2C BUS簡稱,中文爲集成電路總線,是目前應用最廣泛的總線之一,和IMX6ULL有些相關的是,恰巧該總線是NXP前身的PHILIPS設計。當前仍然是應用最廣泛的總線協議之一。

1 通用I2C協議介紹

1)概述
I2C是一種串行通信總線,使用多主從架構,最初設計師爲了讓主板、嵌入式系統或手機用以連接低速周邊設備而發展而來。在小數據量場合使用,有傳輸距離短,任意時刻只能有一個主機等特性。嚴格意義上講,I2C應該是軟硬件結合體,所以我們將分物理層和協議層來介紹該總線。(總線結構如下圖)
在這裏插入圖片描述
2)物理層
特性1:半雙工(非全雙工)
兩條總線線路:
SDA(串行數據線): 主芯片通過一根SDA線既可以把數據發給從設備,也可以從SDA上讀取數據,連接SDA線的引腳裏面必然有兩個引腳(發送引腳/接受引腳),具體可以參考下圖device端I2Cn_SDA(output/input)。
SCL(串行時鐘線):同SDA的引腳電路結構一致,引腳的輸出驅動與輸入緩衝連在一起。其中輸出爲漏極開路的場效應管、輸入緩衝爲一隻高輸入阻抗的同相器。這樣結構有如下特性:
 由於 SDA、SCL 爲漏極開路結構,藉助於外部的上拉電阻實現了信號的“線與”邏輯;
 引腳在輸出信號的同時還將引腳上的電平進行檢測,檢測是否與剛纔輸出一致。爲 “時鐘同步”和“總線仲裁”提供硬件基礎。
SDA和CLK連接線上連有兩個上拉電阻,當總線空閒時,兩根線均爲高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號變低。(物理層結構如下圖所示)
在這裏插入圖片描述

特性2:地址和角色可配置
每個連接到總線的器件都可以通過唯一的地址和其它器件通信,主機/從機角色和地址可配置,主機可以作爲主機發送器和主機接收器。

特性3:多主機
IIC是真正的多主機總線,( IIC可以在通訊過程中,改變主機),如果兩個或更多的主機同時請求總線,可以通過沖突檢測和仲裁防止總線數據被破壞。

特性4:傳輸速率
傳輸速率在標準模式下可以達到100kb/s,快速模式下可以達到400kb/s。

特性5:負載和距離
節點的最大數量受限於地址空間以及總線電容決定。另外總電容也限制了實際通信距離只有幾米。

3)協議層
a.數據有效性
I2C協議的數據有效性是靠時鐘來保證的,在時鐘的高電平週期內,SDA線上的數據必須保持穩定。數據線僅可以在時鐘SCL爲低電平時改變。
在這裏插入圖片描述
b.起始和結束條件
起始條件:當SCL爲高電平的時候,SDA線上由高到低的跳變被定義爲起始條件。
結束條件:當SCL爲高電平的時候,SDA線上由低到高的跳變被定義爲停止條件,要注意起始和終止信號都是由主機發出的,連接到I2C總線上的器件,若具有I2C總線的硬件接口,則很容易檢測到起始和終止信號。
在這裏插入圖片描述
總線在起始條件之後,視爲忙狀態,在停止條件之後被視爲空閒狀態。
c.應答
每當主機向從機發送完一個字節的數據,主機總是需要等待從機給出一個應答信號,以確認從機是否成功接收到了數據,從機應答主機所需要的時鐘仍是主機提供的,應答出現在每一次主機完成8個數據位傳輸後緊跟着的時鐘週期,低電平0表示應答,1表示非應答
d.數據幀格式
SDA線上每個字節必須是8位長,傳輸幾個字節每個transfer是不限制的,每個字節後面必須跟一個ACK。數據首先用最高有效位(MSB)傳輸。
在這裏插入圖片描述

2. IMX6ULL的I2C控制器操作與寄存器介紹

IMX6ULL的I2C提供了標準I2C從服務器和主服務器的功能,I2C是設計與標準的NXP I2C總線協議兼容,所以上面的通用知識完全可以應用在IMX6ULL I2C的編程和控制。
故我們只要熟悉IMX6ULL I2C重點寄存器即可。
(1)I2C Memory Map
I2C包含5個16-bit 的寄存器
注意:寄存器在偏移量0x0002/0x0006/0x000A/0x000E作爲保留位。
可以看到I2C1的入口地址爲21A_0000,這個我們重點關注,後面做實驗,編程會使用到。
在這裏插入圖片描述
(2)Register
 I2C Address Register (I2Cx_IADR)
在這裏插入圖片描述
地址寄存器,偏移量爲0h。
 bit15-8爲保留位即只讀爲0。
 bit7-1(ADR)位是I2C作爲從機時的地址。從屬模式是I2C的默認模式,這個地址是作爲從機的相應地址,不能被軟件復位。
 I2C Frequency Divider Register (I2Cx_IFDR)
在這裏插入圖片描述
分頻寄存器,偏移量爲4h。
 bit15-6位爲保留位即只讀爲0。
 bit5-1 位爲I2C時鐘頻率
注意:該值在傳輸過程中不應該改變,但是可以在之前改變。
I2C_IFDR提供了一個可編程的預分頻器,用於時鐘配置以進行比特率選擇,寄存器不會被軟件重置。
寄存器IC位設置計算方法如下:

I2C的時鐘源來源於IPG_CLK_ROOT=66Mhz
PLL2 = 528 MHz
PLL2_PFD2 = 528 MHz
IPG_CLK_ROOT = (PLL2_PFD2 / ahb_podf )/ ipg_podf = (528 MHz/4)/2 = 66Mhz
PER_CLK_ROOT = IPG_CLK_ROOT/perclk_podf = 66 MHz/1 = 66 MHz
設置I2C的波特率爲100K, 因此當分頻值=66000000/100000=660.
參考Table 31-3. I2C_IFDR Register Field Values 中只有640對應的0x15最接近
在這裏插入圖片描述
即寄存器IFDR的IC位設置爲0X15

 I2C Control Register (I2Cx_I2CR)
在這裏插入圖片描述
控制寄存器,偏移量爲8h
 bit 15-8爲保留位即只讀爲0。
 bit 7 爲I2C使能位。(0 disable,1 enable)
 bit 6 爲I2C中斷使能位。(0 disable,1 enable)
 bit 5 爲主/從模式選擇位(0 slave mode,1 master mode )
 bit 4 爲傳輸方向模式選擇位 (0 receive mode,1 transmit mode)
 bit 3爲應答使能位 (0 ACK , 1 NO ACK)
 bit 2 重複開始信號(0 no repeat start,1 Generates repeat start)
 bit 0 保留位

 I2C Status Register (I2Cx_I2SR)
在這裏插入圖片描述
狀態寄存器,偏移量爲Ch
 bit 15-8爲保留位即只讀爲0。
 bit 7 數據傳輸狀態位(0 傳輸中,1 傳輸完成)
 bit 6 I2C地址是否爲從標識(0 不表示,1 是從機地址)
 bit 5 I2C總線忙狀態標識位(0 空閒,1 忙 )
 bit 4 仲裁丟失位 (0 正常,1 仲裁丟失)
 bit 3 保留位
 bit 2從機讀寫標識位 (0 slave接收,主向從寫 , 1 slave發送 主向從讀)
 bit 1 I2C中斷(0無中斷等待, 1有中斷等待)
 bit 0 應答信號標識位(0檢測到ACK, 1檢測到NO ACK)

 I2C Data I/O Register (I2Cx_I2DR)
在這裏插入圖片描述
數據寄存器,偏移量爲10h
 bit 15-8爲保留位即只讀爲0。
 bit 7-1 數據字節
注意:在主接收模式下,讀取數據寄存器允許發生讀取並初始化下一個字節被接收。在從模式下,相同功能需要編址後生效。
低8位爲有效數據位,發送數據時將數據寫到這個寄存器中,如果要接收時直接讀取該寄存器中的數據。

3. I2C控制器編程_框架

之前的所有鋪墊都是爲了實現I2C通訊,所以怎麼用代碼實現也是尤爲關鍵的一個問題。
 初始化
因爲不使用中斷服務函數模式,初始化代碼非常簡單,我們僅需要將I2CR(bit7) 置0後寫入IFDR爲0x15,設置波特率爲100k。(具體計算方法參考 2. IMX6ULL的I2C控制器操作與寄存器介紹中關於分頻寄存器),然後再使能I2C,將I2CR(bit7)置1 。
01 I2C_BASE->I2CR &= ~(1 << 7);
02 I2C_BASE->IFDR = 0x15;
03 I2C_BASE->I2CR |= (1<<7);
 讀寫操作
下面是是I2C的讀寫標準流程,可能實際使用時根據需求略有異同。
寫寄存器的標準流程如下圖:
在這裏插入圖片描述
 1.Master發起START
 2.Master發送I2C addr(7bit)和w操作0(1bit),等待ACK
 3.Slave發送ACK
 4.Master發送reg addr(8bit),等待ACK
 5.Slave發送ACK
 6.Master發送data(8bit),即要寫入寄存器中的數據,等待ACK
 7.Slave發送ACK
 8.第6步和第7步可以重複多次,即順序寫多個寄存器
 9.Master發起STOP

讀寄存器的標準流程如下圖:
在這裏插入圖片描述

 1.Master發送I2C addr(7bit)和w操作1(1bit),等待ACK
 2.Slave發送ACK
 3.Master發送reg addr(8bit),等待ACK
 4.Slave發送ACK
 5.Master發起RESTART
 6.Master發送I2C addr(7bit)和r操作1(1bit),等待ACK
 7.Slave發送ACK
 8.Slave發送data(8bit),即寄存器裏的值
 9.Master發送ACK
 10.第8步和第9步可以重複多次,即順序讀多個寄存器
 11. Master發送NO ACK表示讀取完成,從機也不用發送ACK
 12. Master發送STOP

4. I2C控制器編程_中斷

I2C控制器中和中斷有關的寄存器如下:
IIEN :I2C_I2CR(bit6)(0 disable I2C interrupt ,1 enable I2C interrupt)
IIF:I2C_I2SR (bit1) (0 No I2C interrupt pending , 1 An interrupt is pending)
即中斷使能位,中斷狀態位。
編碼中在傳送完1byte後可以通過判斷IIF狀態來確認ACK和傳輸完成。當然作爲從機時,收到自己的地址後也可以進入中斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章