I2C 總線時 PHILIPS 公司推出的一種串行總線,具備多主機系統所需的包括總線仲裁和高低速器件同步功能的高性能串行總線。它只需要兩跟雙向的信號線,一根數據線 SDA,一個是時鐘線 SCL。在 I2C 總線上面,每個器件都有自己相應的 I2C 地址,所以在兩個器件之間進行通信的時候,都要首先呼叫你想要通信的器件地址,然後等待相應的從器件進行應答之後才開始通信。首先我們來看一下,一個 I2C 信號傳輸的一個過程,如圖:
從圖上我們可以看出在 I2C 上面一個完整信號的傳輸過程,一定要有一個始信號,還有一個結束信號,在每個字節傳輸結束的時候,從機還要提供一個應答信號。一個完整的信號傳輸就是這樣子。接下來我們來看一下,I2C 總線上面對起始信號、應答信號、結束信號、還有高低電平的協定是怎麼樣的呢?這裡有兩個要注意的要點:
1、在總線空閒的時候,SDA 和 SCL 都是高電平的。
2、在 SCL 為高電平期間,SDA 必須保持穩定。所以 SDA 改變狀態最好在 SCL 為低電
平的時候改變,如果在高電平改變的話回被認為是一種有效信號(如:起始信號或者結束信號)
1. 起始信號
起始信號簡介 SCL 線為高電平期間,SDA 線由高電平向低電平的變化表示起始信號,
信號時序如圖:
這裡要注意的就是,在 I2C 總線上面,當總線空閒的時候,SCL 和 SDA 都是高電平
的。起始信號,它是需要有一定的保持時間的,在 SDA 從高電平向低電平跳變的時候,兩
個先必須至少保持 4.7us 的時間,而跳變之後,也要保持 SCL 高電平和 SDA 低電平要至
少保持 4us 的時間(從這裡我們看出 I2C 總高速率已經決定了) 。
//IO 口模擬起始信號 //產生起始信號 void I2C_Start(void) { I2C_SDA_OUT(); I2C_SDA_H; I2C_SCL_H; delay_us(5); I2C_SDA_L; delay_us(6); I2C_SCL_L; }
2. 結束信號
結束信號簡介 SCL 線為高電平期間,SDA 線由低電平向高電平的變化表示終止信號。
信號時序如圖:
注意的就是這裡保持時間也是有一定限制的。
//IO 口模擬結束信號 //產生停止信號 void I2C_Stop(void) { I2C_SDA_OUT(); I2C_SCL_L; I2C_SDA_L; I2C_SCL_H; delay_us(6); I2C_SDA_H; delay_us(6); }
3. 應答信號
應答信號
應答,也叫響應。數據的傳輸必須要帶應答。在響應的時鐘脈衝期間(也就是 SCL 在高電
平的時候) ,發送器釋放 SDA 線(釋放 SDA 意思就是將 SDA 拉為高電平,這裡要注
意的是,不能在 SCL 為高電平的時候講 SDA 從低電平拉到高電平,可以在在 SCL 在低
電平的時候,將 SDA 拉為高電平等待),然後等待應答,在應答時鐘脈衝器件,接收器
必須將 SDA 拉低,使它在這個時鐘脈衝的高電平期間保持穩定的低電平。而一個字節傳輸
完畢之後,接收器沒有應答則表示接收完畢。還有一種情況是,當主機作為接收器的時候,接收完最後一個字節之後,必須向從機發出一個結束傳送的信號。這個信號是由對從機「非 應答」來實現的。(從上面的規則我們知道,當主機作為接收器的時候,如果是進行應答,那麼在接收完一個字節的最後一位之後產生一個低電平的時鐘,進行應答。而非應答呢,就是產生一個高電平的時鐘,進行應答) 。如果大家不是很理解呢,大家可以參考我們例程裡面 I2C 的 IO 模擬信號裡面接收數據的函數,最後的應答和非應答。
//IO 口模擬應答信號 //主機產生應答信號 ACK void I2C_Ack(void) { I2C_SCL_L; I2C_SDA_OUT(); I2C_SDA_L; delay_us(2); I2C_SCL_H; delay_us(5); I2C_SCL_L; } //主機不產生應答信號 NACK void I2C_NAck(void) { I2C_SCL_L; I2C_SDA_OUT(); I2C_SDA_H; delay_us(2); I2C_SCL_H; delay_us(5); I2C_SCL_L; } //等待從機應答信號 //返回值:1 接收應答失敗 // 0 接收應答成功 u8 I2C_Wait_Ack(void) { u8 tempTime=0; I2C_SDA_IN(); I2C_SDA_H; delay_us(1); I2C_SCL_H; delay_us(1); while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)) { tempTime++; if(tempTime>250) { I2C_Stop(); return 1; } } I2C_SCL_L; return 0; }
4. 邏輯「1」的表示
要傳輸數據,那麼肯定要分傳輸「1」和「0」 ,而在 I2C 上面是怎麼表示這兩個邏輯變量
的呢?如圖:
一般 I2C 讀取的時候,都是在 SCL 的為高電平的時候進行讀取,所以在 SCL 為高電平
的時候,需要保持 SDA 穩定。而且注意的還有就是他們的保持時間要大於 4us。
5. 邏輯「0」的表示
邏輯「0」和邏輯「1」的表示其實差不多,只是 SDA 正好相反。如圖:
注意的事項跟邏輯「1」的表示差不多。
6. IO 口模擬發送一個字節數據
//I2C 發送一個字節 void I2C_Send_Byte(u8 txd) { u8 i=0; I2C_SDA_OUT(); I2C_SCL_L;//拉低時鐘開始數據傳輸 for(i=0;i0) //0x80 1000 0000 I2C_SDA_H; else I2C_SDA_L; txd<<=1; I2C_SCL_H; delay_us(2); //發送數據 I2C_SCL_L; delay_us(2); } }
7. IO 口模擬接收一個字節數據
//I2C 讀取一個字節 u8 I2C_Read_Byte(u8 ack) { u8 i=0,receive=0; I2C_SDA_IN(); for(i=0;i<8;i++) { I2C_SCL_L; delay_us(2); I2C_SCL_H; receive<<=1; if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)) receive++; delay_us(1); } if(ack==0) I2C_NAck(); else I2C_Ack(); return receive; }
推薦閱讀
/********************************************************************** File : I2C.c 「 Master Read Write |** Version : 1.0** DescripTIon: I2C 查詢法讀寫24C02** Author : LightWu** Date : 2013-4-26** 必須注意多字節數據讀取時,發送停止位需要在最後一個字節讀取之前** 否則數據讀取後,停止位發送容易失敗,導致從機接收不到停止位
發表於 2021-01-04
ADI宣布推出LT8491降壓-升壓電池充電控制器,該控制器具有最大功率點跟蹤(MPPT)、溫度補償和I2C接口等特性,適用於遙測和控制。該器件的工作電壓可高於、低於或等於經調節的電池浮充電壓。LT8491提供三種可選的恆流恆壓(CC-CV)充電曲線,因此非常適合為各種化學電池充電,包括密封鉛酸電池、凝膠電池、溢流型電池和鋰離子電池。所有充電終止算法均已內置,無需開發軟體或固件,從而縮短設計周期。  
發表於 2020-12-15
一、I2C協議 I 2 C (Inter-Integrated Circuit)協議是由 Philips 公司開發的,由於它具備引腳少、硬體實現簡單、可擴展性強、不需要如 USART、CAN 的外部收發設備等特點,現在被廣泛地使用在系統內多個集成電路(IC)間的通信。1、物理層(1)它只使用兩條總線線路 :一條雙向串行數據線(SDA) ,一條串行時鐘線 (SCL)。(2)每個連接到總線的設備都有一個獨立的地址,主機可以利用這個地址進行不同設備之間的訪問。(3)多主機同時使用總線時,為了防止數據衝突,會利用仲裁方式決定由哪個設備佔用總線。(4)具有三種傳輸模式
發表於 2020-12-08
區別:SPI:高速同步串行口。3~4線接口,收發獨立、可同步進行 UART:通用異步串行口。按照標準波特率完成雙向通訊,速度慢 I2C:一種串行傳輸方式,三線制,網上可找到其通信協議和用法的 3根線實現數據雙向傳輸 串行外圍接口 Serial peripheral interface UART:通用異步收發器 UART是用於控制計算機與串行設備的晶片。有一點要注意的是,它提供了RS-232C數據終端設備接口,這樣計算機就可以和數據機或其它使用RS-232C接口的串行設備通信了。作為接口的一部分,UART還提供以下功能: 將由計算機內部傳送過來的並行
發表於 2020-10-28
1 引言溫度傳感器TMP275可直接輸出數位訊號,而無需取樣、放大、濾波和模數信號的轉換,可以直接傳輸給單片機信號處理系統;而且輸出信號解析度可以達到0.0625,測溫精度±0.5℃,若使用MSP430F247做控制器,可直接與其自帶的I2C模塊相連,使用方便。2 電路設計2.1 總體方案設計該測溫儀的硬體結構由溫度測量、核心控制電路、顯示電路和電源電路等4部分組成。總體方案框圖如圖l所示。2.2 單元模塊設計2.2.1 核心控制電路核心控制電路採用MSP4313F247完成數據的測量和處理,實現溫度測量和控制輸出顯示功能,電路如圖2所示,其中的P3.1.P3.2分別是MSP430F247自帶I2C模塊的SCL和SDA,可以直接
發表於 2020-10-16
;24c08操作時序為:起始信號sclk拉高情況下sda由高變低,表示起始; 結束信號sclk拉高情況下sda由低變高,表示結束; 字節由高位向低位依次發送; 第一個字節是地址和讀寫控制,第二個是存儲地址,第三個是數據,每個數據結束器件都會發送 ack應答信號;; I2C
發表於 2020-10-14