關於I2C的理論知識


I2C(Inter-Integrated Circuit)總線是由PHILIPS公司開發的兩線式串行總線,用於連接微控制器及其外圍設備。是微電子通信控制領域廣泛采用的一種總線標准。它是同步通信的一種特殊形式,具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。I2C 總線支持源任何IC 生產過程(CMOS、雙極性)。通過串行數據(SDA)線和串行時鍾 (SCL)線在連接到總線的器件間傳遞信息。每個器件都有一個唯一的地址識別(無論是微控制器——MCU、LCD 驅動器、存儲器或鍵盤接口),而且都可以作為一個發送器或接收器(由器件的功能決定)。LCD 驅動器只能知作為接收器,而存儲器則既可以接收又可以發送數據。除了發送器和接收器外道,器件在執行數據傳輸時也可以被看作是主機或從機。主機是初始化總線的數據傳輸並產生允許傳輸的時鍾信號的器件。此時,任何被尋址的器件都被認為是從機。

I2C的從模式與主模式的區別是什么?

宏觀上來講,主模式:就是主CPU作為主機,向從機(掛載器件)發送接收數據。
從模式:就是主CPU作為從機,接來收和發送主機(掛載器件)數據。
而主從機的分別其實是一個觸發的作用,主機主動觸發,從機只能被動響應觸發。

一、I2C 基礎知識

I2C 總線是由 Philips 公司開發的一種簡單、雙向二線制同步串行總線。它只需要兩根線 SDA 、SCL 即可在連接於總線上的器件之間傳送信息,I2C 總線數據傳輸速率在標准模式下可達 100kbit/s,快速模式下可達 400kbit/s,高速模式下可達 3.4Mbit/s,在超高速模式下可達到 5Mbit/s。

1. I2C 主要特點

(1)簡單的雙向兩線總線(漏極開路模式):

(2)串行數據(SDA)串行時鍾(SCL)

(3)帶仲裁功能的多主機的總線

(4)總線上的每個設備都具有不同的識別地址

(5)每次數據傳輸都是由主機發起,且時鍾總是由主機提供

2. I2C 硬件框圖

(1)I2C 支持帶仲裁功能的多設備通信,在一條總線上可以掛載多個 I2C 外設

(2)I2C 兩條總線為漏極開路結構,需要外接上拉電阻

 

 

 

3. I2C 數據通訊

3.1 I2C 總線協議

I2C 總線由起始信號、停止信號、應答信號、非應答信號組成,如圖 1.4.1 所示:

起始信號:當時鍾線 SCL 為高期間,數據線 SDA 由高到低的跳變

停止信號:當時鍾線 SCL 為高期間,數據線 SDA 由低到高的跳變

應答信號(ACK):應答位為低電平時,規定為有效應答位,表示接收器已經成功接收該字節;

非應答信號(NACK):應答位為高電平時,規定為非應答位,一般表示接收器接收該字節沒有成功

數據有效性:SCL 在高電平期間,SDA 上的數據必須保持穩定,只有在 SCL 為低電平期間,SDA 狀態才允許變化。

 

3.2 I2C 總線的操作

對 I2C 總線的操作實際就是主從設備之間的讀寫操作。大致可分為以下二種操作情況:

1. 主設備往從設備中寫數據,如圖 1.4.3 所示

2. 主設備從從設備中讀數據,如圖 1.4.3 所示

4. I2C 時鍾同步

由於總線具有線“與”的邏輯功能,當多個節點同時發送時鍾信號時,在總線上表現的是統一的時鍾信號,只要有一個節點發送的是低電平,總線上表現為低電平,只有當所有節點都發送高電平時,總線才表現為高電平,由此可知總線時鍾取決於低電平周期最長的節點時鍾。這就是 SCL 的同步原理,如圖 4.5 所示

 

 

 

 

5. I2C 仲裁

(1)I2C 仲裁:在多節點的 I2C 通信中,為解決兩個或兩個以上節點同時向一條總線發送數據形成的沖突,需要進行 I2C 總線仲裁。

(2)仲裁機制:根據總線線“與”邏輯原理,當有一個節點發送低電平時,總線上表現為低電平,而發送高電平的節點將會失去仲裁。

(3)以圖 4.6 兩個節點為例,DATA1 和 DATA2 分別是節點向總線所發送的數據信號,SDA 為總線上所呈現的數據信號,SCL 是總線上所呈現的時鍾信號

起始:DATA 1 和 DATA 2 發送起始信號,DATA 1 和 DATA 2 為高電平,根據總線線“與”功能,總線為高電平,DATA 1、DATA 2 與 總線電平相同,繼續發送數據。

第一個時鍾周期:DATA1 和 DATA 2 為高電平,總線為高電平,DATA 1、DATA 2 繼續發送數據。

第二個時鍾周期:DATA1 和 DATA 2 為低電平,總線為低電平,DATA 1、DATA 2 繼續發送數據。

第三個時鍾周期:DATA1 為高電平,DATA2 為低電平,SDA 總線為低電平,DATA1 繼續發送數據,DATA 2 與 SDA 總線電平不同失去仲裁。

 

 

 

二、LPC824 I2C 性能概述

1. 性能概述

(1)支持數據速率 400 Kbit/s 的標准模式和高達 1Mbit/s 的快速模式

(2)獨立的主機、從機和監視器功能

(3)硬件中支持多個 I2C 從機地址

(4)支持 SMBus

(5)片上 ROM 提供 I2C 驅動

(6)收發支持 DMA

(7)支持低功耗模式喚醒

2. I2C0 與 I2C1/2/3 異同

 

 

 

3. I2C 時鍾框圖

I2C 的時鍾由 system clock、AHB 時鍾控制寄存器、時鍾分頻寄存器、SCL 主機時間寄存器四部分組成

 

 

 4. I2C 功能框圖

 

 

 

三、LPC824 I2C 具體應用操作

LPC824 I2C 具體應用操作可分為 8 種:時鍾配置、IO 配置、地址配置、主從機功能配置、主機功能初始化、主機數據傳輸、主機中斷處理、從機功能初始化、從機中斷處理。

1. 時鍾配置

1.1 I2C 的 AHB 時鍾使能

 

 

 1.2 I2C 的時鍾分頻寄存器

 

 

 1.3 I2C 的時鍾 SCL 主機時間寄存器

 

1.4 波特率計算

 

 

 

 

 2. IO 配置2.1 I2C 的管腳分配

2.2 I2C 的管腳配置

3. 地址配置3.1 從機地址寄存器

 

 

 3.2 從機地址限定寄存器

 

 

 4. 主從功能配置

 

 

 5. 其它寄存器一覽

 

 

 

 

 6. I2C 主機功能初始化

 

 

 

 7. I2C 主機數據傳輸

 

 

 8. I2C 主機中斷處理

 

9. I2C 從機功能初始化

 

 

 10. I2C 從機中斷處理

11. 監測功能

(1)監測功能用於監聽 I2C 總線數據傳輸

(2)操作配置寄存器使能監測功能

(3)讀取 MONRXDAT 寄存器,獲取 I2C 總線數據傳輸信息

12. DMA 應用

(1)I2C 被設置為主機或從機模式,都可以使用 DMA 進行數據收發

(2)需要軟件來確認地址傳輸

(3)使用 DMA 模式,需要配置 DMA 控制器相關寄存器

(4)DMA 請求

 

 四、LPC824 I2C 低功耗模式喚醒1. 低功耗模式喚醒

 

Sleep 模式下,任何觸發 I2C 中斷的信號都可以喚醒芯片。相關配置如下:

 

 

 

 2. 低功耗模式喚醒

 

 Deep_Sleep/Power_down 模式下,只能支持 I2C 從機模式的喚醒(因為 I2C 時鍾被關閉)。相關配置如下:

 

 Startlogic1interruptwake-upenableregister

五、LPC824 I2C 主從機通信實驗

1. 實驗目的:

通過本實驗,理解和掌握 I2C 配置和用法。

2. 實驗軟/硬件環境搭建:

硬件:LPC824Lite-V1.0(評估板)

軟件:SDK 從 NXP 官網下載(https://mcuxpresso.nxp.com/en/select);

工程位置:

..\..\..\driver_examples\i2c\interrupt_b2b_transfer\master\mdk\lpc_i2c_interrupt_b2b_transfer_master.uvprojx

..\..\..\driver_examples\i2c\interrupt_b2b_transfer\slave\mdk\lpc_i2c_interrupt_b2b_transfer_master.uvprojx

3. 實驗描述:

本實驗中以 I2C0 為例,一個板子作為主機,將另一個板子作為從機,主機發送數據給從機,從機接收數據並發送給主機,串口助手上可看到主從的收發數據。

4. 實驗結果:

上電之前將兩個板子的 SDA 和 SCL 相連,按下復位鍵,在串口助手上可以看到 master 及 slave 的收發打印信息。5. 軟件設計5.1 使能 I2C 時鍾

/* Enable clock of i2c0. */

CLOCK_EnableClock(kCLOCK_I2c0);//使能 I2C 時鍾

通過 SYSAHBCLKCTRL 寄存器使能 I2C 時鍾,具體函數實現如圖 5.1 所示

5.2 IO 配置

BOARD_InitPins(); //IO 配置

 

 

 具體函數實現如上圖所示:

5.3 master 配置

(1)master 初始化

masterConfig.enableMaster = true; //使能 Master

masterConfig.baudRate_Bps = 100000U; //設置波特率 100K

masterConfig.enableTimeout = false; //不使能 Timeout

I2C_MASTER_CLOCK_FREQUENCY=12000000; //master 時鍾

/* Initialize the I2C master peripheral */

I2C_MasterInit(EXAMPLE_I2C_MASTER, &masterConfig, I2C_MASTER_CLOCK_FREQUENCY);//初始化 I2C

 

I2C 的角色為 Master,波特率為 100K,沒有 Timeout 功能,I2C_MasterInit 具體函數配置實現如圖 5.3.1 所示

(2)創建中斷回調函數

/* Create the I2C handle for the non-blocking transfer */

I2C_MasterTransferCreateHandle(EXAMPLE_I2C_MASTER, &g_m_handle, i2c_master_callback,

 

 

 I2C_MasterTransferCreateHandle具體函數實現如圖 5.3.2 所示

(3)master 發送一次數據

/* subAddress = 0x01, data = g_master_txBuff - write to slave.

start + slaveaddress(w) + subAddress + length of data buffer + data buffer + stop*/

uint8_t deviceAddress = 0x01U;

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT; //從機地址

masterXfer.direction = kI2C_Write; //I2C 寫模式

masterXfer.subaddress = (uint32_t)deviceAddress; //子地址

masterXfer.subaddressSize = 1; //子地址大小

masterXfer.data = g_master_txBuff; //發送數據 buff

masterXfer.dataSize = I2C_DATA_LENGTH; //發送數據 buff 大小

masterXfer.flags = kI2C_TransferDefaultFlag; //傳輸以起始信號開始,以停止信號結束

/* Send master non-blocking data to slave */

reVal = I2C_MasterTransferNonBlocking (EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);//發送一次數據

 

 

 

I2C_MasterTransferNonBlocking 具體函數實現如圖 5.3.3 所示

5.4 slave 配置

(1)slave 初始化

/* Set up i2c slave */

slaveConfig.enableSlave = true;//使能 slave

slaveConfig.address1.addressDisable = true;//address1 使能

slaveConfig.address2.addressDisable = true;//address2 使能

slaveConfig.address3.addressDisable = true;//address3 使能

/* Change the slave address */

slaveConfig.address0.address = I2C_MASTER_SLAVE_ADDR_7BIT;//設置主機地址

/* Initialize the I2C slave peripheral */

I2C_SlaveInit(EXAMPLE_I2C_SLAVE, &slaveConfig, I2C_SLAVE_CLOCK_FREQUENCY);//初始化 I2C

I2C_SlaveInit 具體函數實現如圖 5.4.1 所示

(2)創建中斷回調函數

/* Create the I2C handle for the non-blocking transfer */

I2C_SlaveTransferCreateHandle(EXAMPLE_I2C_SLAVE, &g_s_handle, i2c_slave_callback, NULL);//創建中斷回調函數

 

I2C_SlaveTransferCreateHandle 具體函數實現如圖 5.4.2 所示

(3)接收一次數據

/* Start accepting I2C transfers on the I2C slave peripheral */

reVal = I2C_SlaveTransferNonBlocking(EXAMPLE_I2C_SLAVE, &g_s_handle,

kI2C_SlaveAddressMatchEvent | kI2C_SlaveCompletionEvent);//讀一次數據

 

 

 I2C_SlaveTransferCreateHandle 具體函數實現如圖 5.4.3 所示

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM