目錄
- 什么是I2C
- I2C的通信時序
- I2C的暫存器決議
- 什么是G-Sensor
- I2C總線的通信流程
1.什么是I2C
-
物理介面:SCL + SDA
(1)SCL:時鐘線,傳輸CLK信號,一般是I2C主設備向從設備提供時鐘的通道,
(2)SDA: 資料線,通信資料都通過SDA線傳輸, -
原理圖:

-
通信特征:
(1)串行通信
(2)同步
(3)非差分(對應電平信號)
(4)低速率 -
主要用途:SoC和周邊外設之間的通信(典型的如EEPROM、電容觸摸IC、各種sensor等)
2. I2C的通信時序

其中
S:起始位,當SCL和SDA都為高電平時,為總線空閑狀態,當SDA從1->0時,為起始狀態,SDA從0->1時,為結束狀態

時序圖:

解讀:為了完成一個位元組的傳輸操作,接收端向發送端發送一個ACK位,ACK脈沖發生在SCL線路的第九個時鐘,一個位元組的資料傳輸需要8個時鐘,主機產生發送ACK位所需的時鐘脈沖,
如果接收到ACK時鐘脈沖,發射機將SDA線設定為高,釋放SDA線:In Tx mode, the I2CSDA is free in the ACK time.
在ACK時鐘脈沖期間,接收器驅動SDA線Low,以便在第九個SCL脈沖的高周期期間SDA保持低,
軟體(I2CSTAT)開啟或關閉ACK位傳輸功能,但是,在SCL的第9個時鐘上的ACK脈沖需要完成一個位元組的資料傳輸操作,
3. I2C的暫存器決議
-
結構框圖:

(1)時鐘部分,時鐘來源是PCLK_PSYS,經過內部分頻最終得到I2C控制器的CLK,通信中這個CLK會通過SCL線傳給從設備,
(2)I2C總線控制邏輯(前臺代表是I2CCON、I2CSTAT這兩個暫存器),主要負責產生I2C通信時序,實際編程中要發送起始位、停止位、接收ACK等都是通過這兩個暫存器(背后所代表的電路模塊)實作的,
(3)移位暫存器(shift register),將代碼中要發送的位元組資料,通過移位暫存器變成1個位一個位的丟給SDA線上去發送/接收,學過數字電路的同學應該對移位暫存器不陌生,
(4)地址暫存器+比較器,本I2C控制器做從設備的時候用,(理論分析)

I2CCON暫存器:

時鐘分析:
(1)I2C時鐘源頭來源于PCLK(PCLK_PSYS,等于65MHz),經過了2級分頻后得到的,
(2)第一級分頻是I2CCON的bit6,可以得到一個中間時鐘I2CCLK(等于PCLK/16或者PCLK/512)
(3)第二級分頻是得到最終I2C控制器作業的時鐘,以I2CCLK這個中間時鐘為來源,分頻系數為[1,16]
(4)最終要得到時鐘是2級分頻后的時鐘,譬如一個可用的設定是:65000KHz/512/4=31KHz
中斷分析
(1)如果1位元組的發送或接收操作完成,則i2c總線中斷發生,換句話說,ack周期結束了
(2)bit[4]: I2C-BUS TX / RX中斷待定標志.如果該位讀取為1,則I2CSCL為低電平,和I2Cstop,要恢復操作,請清除此位為0,
(2)I2CSTAT暫存器

(3)I2CADD暫存器

(4)I2CDS暫存器

4. G-Sensor(KXTE9)
(1) 概念:重力加速度傳感器
(2)
- KXTE9的I2C地址固定為0b0001111(0x0f)
- I2C從設備地址本身是7位的,但是在I2C通信中發送I2C從設備地址時實際發送的是8位,這8位中高7位(bit7-bit1)對應I2C從設備的7位地址,最低一位(LSB)存放的是R/W信(就是說下一個資料是主設備寫從設備讀(對應0),還是主設備讀從設備寫(對應1)
- 基于上面講的,對于KXTE9來說,主設備(SoC)發給gsensor資訊時,SAD應該是:0b00011110(0x1E)
如果是主設備讀取gsensor資訊時,SAD應該是:0b0001111(0x1F)
5.I2C總線的通信流程


框架分析:
我們最終目的是通過讀寫gsensor芯片的內部暫存器來得到一些資訊,為了完成這個目的,我們需要能夠讀寫gsensor的暫存器,根據gsensor的規定我們需要按照一定的操作流程來讀寫gsensor的內部暫存器,這是一個層次(協議層);我們要按照操作流程去讀寫暫存器,就需要考慮I2C介面協議(這就是所謂的物理層,本質就是那些時序),此時主機SoC有或者沒有控制器,有控制器時考慮控制器的暫存器,沒控制器時要自己軟體模擬時序,
協議層的代碼主要取決于gsensor芯片;物理層代碼主要取決于主機SoC,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301593.html
標籤:其他
