概述
IIC(Inter-Integrated Circuit)其實是IICBus簡稱,所以中文應該叫集成電路總線,它是一種串行通信總線,使用多主從架構,由飛利浦公司在1980年代為了讓主板、嵌入式系統或手機用以連接低速周邊設備而發展。I2C的正確讀法為“I平方C”("I-squared-C"),而“I二C”("I-two-C")則是另一種錯誤但被廣泛使用的讀法。自2006年10月1日起,使用I2C協議已經不需要支付專利費,但制造商仍然需要付費以獲取I2C從屬設備地址。
接口
I2C串行總線一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL。所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。
- SCL - 串行時鐘線
- SDA - 串行數據線
為了避免總線信號的混亂,要求各設備連接到總線的輸出端時必須是漏極開路(OD)輸出或集電極開路(OC)輸出。設備上的串行數據線SDA接口電路應該是雙向的,輸出電路用于向總線上發送數據,輸入電路用于接收總線上的數據。而串行時鐘線也應是雙向的,作為控制總線數據傳送的主機,一方面要通過SCL輸出電路發送時鐘信號,另一方面還要檢測總線上的SCL電平,以決定什么時候發送下一個時鐘脈沖電平;作為接受主機命令的從機,要按總線上的SCL信號發出或接收SDA上的信號,也可以向SCL線發出低電平信號以延長總線時鐘信號周期。總線空閑時,因各設備都是開漏輸出,上拉電阻Rp使SDA和SCL線都保持高電平。任一設備輸出的低電平都將使相應的總線信號線變低,也就是說:各設備的SDA是“與”關系,SCL也是“與”關系。 因此SDA和SCL 可以被拉低為低電平,但是不能被驅動為高電平,所以每條線上都要使用一個上拉電阻,默認情況下將其保持在高電平。 IIC 總線上數據的傳輸速率在標準模式下可達 100kbit/s 在快速模式下可達 400kbit/s 在高速模式下可達 3.4Mbit/s。
通信協議
SDA 線上的數據必須在時鐘的高電平周期保持穩定。數據線的高或低電平狀態只有在 SCL 線的時鐘信號是低電平時才能改變。
空閑狀態
SDA為高電平,SCL為高電平。
起始狀態
其中一種情況是在 SCL 線是高電平時 SDA 線從高電平向低電平切換,產生一個 下降沿 ,這個情況表示起始條件。
結束狀態
當 SCL 是高電平時 SDA 線由低電平向高電平切換,產生一個 上升沿 ,這個情況表示停止條件。
傳輸數據
器件地址位
由于IIC總線上可能掛載著多臺設備,所以主設備在傳輸有效數據之前要先指定從設備的地址, 大多數從設備的地址是7位的,還有部分設備支持10位尋址 ,主設備如果需要向從機發送/接收數據,首先要發送對應從機的地址,然后會匹配總線上掛載的從機的地址。將數據發送至SDA數據線上即可。
讀寫位
緊接著的第 8 位是數據方向位(R/ W) ----'0'表示發送(寫),'1'表示請求數據(讀)。
應答信號位
主設備每發送完8bit數據后等待從設備的ACK。 即在第9個clock,若從設備發ACK,SDA會被拉低。 若沒有ACK,SDA會被置高,這會引起主設備發生RESTART或STOP流程,當ACK=0時為有效應答位,說明從機已經成功接收到該字節,若為1則說明接受不成功。
數據地址位
當找到往哪個設備寫數據之后,就開始尋址往這個設備的特定地址寫數據,和上述的發送器件地址一樣,直接將地址數據發送至SDA線即可。
數據位
發送到 SDA 線上的每個字節必須為8位,每次傳輸可以發送的字節數量不受限制,每個字節后必須跟一個響應位,首先傳輸的是數據的最高位 (MSB) 。
示例
設置器件地址為0x78(0111 1000),數據地址為0x40(0100 0000),寫入數據0xAA(1010 1010)。
HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,data_i,1,0x100);
查看HAL_I2C_Mem_Write說明可以得知,目標設備地址在調用接口之前,數據表中設備的7位地址值必須左移;即發送到從設備的數據已經右移了一位,所以0x78(0111 1000)右移一位變成0x3c(011 1100)。
/**
* @brief Write an amount of data in blocking mode to a specific memory address
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for the specified I2C.
* @param DevAddress Target device address: The device 7 bits address value
* in datasheet must be shifted to the left before calling the interface
* @param MemAddress Internal memory address
* @param MemAddSize Size of internal memory address
* @param pData Pointer to data buffer
* @param Size Amount of data to be sent
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
通過示波器抓取的波形如下所示。
-
在空閑狀態,SDA和SCL都是處于高電平狀態。
-
在起始狀態,SDA先產生一個下降沿,之后SCL也出現一個下降沿,此時數據傳輸開始。
-
在傳輸狀態,由于傳輸速率為100kbit/s,故SCL時鐘的切換時間為5us,一個周期為10us;當SCL為1的時候,SDA不會發生改變,故檢測SDA信號線的數據,當為低電平則為0,高電平則為1.
-
在讀寫狀態,當SDA數據為0的時候,為寫狀態。
-
在應答狀態,當SDA數據為0的時候,為應答狀態。
上述為成功傳輸的例子,若不成功傳輸,設置器件地址為0x77(0111 0111),數據地址為0x40(0100 0000),寫入數據0xAA(1010 1010)。
HAL_I2C_Mem_Write(&hi2c1 ,0x77,0x40,I2C_MEMADD_SIZE_8BIT,data_i,1,0x100);
由于地址位0x77(0111 0111)右移一位,故發送出去的為0x3B(011 1011),通過示波器抓取的波形如下所示。
- 在應答狀態,由于沒有連接0x77地址(實際發送為0x3B)的設備,當SDA數據為1的時候,為非應答狀態,之后進入復位或者停止。
- 在應答狀態,由于沒有連接0x77地址(實際發送為0x3B)的設備,當SDA數據為1的時候,為非應答狀態,之后進入復位或者停止。
審核編輯:湯梓紅
-
IIC
+關注
關注
11文章
306瀏覽量
39125 -
通訊協議
+關注
關注
10文章
284瀏覽量
20706
發布評論請先 登錄
IIC通訊協議解析
stm32之IIC通信協議定義
IIC協議總線特點簡介
FPGA基礎知識之IIC協議讀寫解析

IIC與SPI通訊

STM32第九章-IIC通訊應用

評論