合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)
這是?北航士諤書院?的第 940?篇推送
北航士諤書院X大班提醒您:
道路千萬條,學習第一條
不搞單片機,開學兩行淚
——新春快樂,我們又回來了!
本文對 I2C 總線的協議做出詳細的介紹,并對其在 51 單片機上的應用代碼做出解析。
I2C 總線
集成電路間總線(Inter-Integrated Circuit Bus,I2C Bus,讀做 I-squared-C 或 I 方 C)是一種連接多個集成電路的總線。它由 Philips Semiconductors(現 NXP Semiconductors)于 1982 年開發。
I2C 總線的特點
多對多。在單個 I2C 總線上,可以有多個主設備(Master Device)和多個從設備(Slave Device)。主設備通常是單片機,而從設備通常是簡單的外圍設備(如傳感器、單色顯示屏),不過從設備也可以是單片機。通信總是由主設備發起并主導。通常我們僅在 I2C 總線上安排單個主設備,本文也只討論有單個主設備的情形。如果存在多個主設備,那么它們需要進行較復雜的時鐘同步和使用權仲裁,在此暫不討論。
簡單、易實現。I2C 總線僅需兩個引腳就可連接多達 112 個設備,而同類總線,如 SPI 等,則需要更多的引腳。I2C 協議簡單直接,不需要復雜的邏輯。
低速。大多數 I2C 設備僅支持在 100 kbit/s 的標準模式(Standard Mode)工作;少數設備最高支持 1Mbit/s 的快速模式+(Fast Mode Plus)。比起其它總線,I2C 的速度是比較慢的。
短距離。I2C 允許的走線距離較短,它通常被用于同一塊 PCB 板上的 IC 間互聯。I2C 總線不適用于長距離傳輸。
I2C 總線的常見應用
I2C 總線通常被用于將低速的外圍設備通過短距離的線路連接到微處理器(單片機)上。常見的外圍設備有溫度傳感器、電流電壓傳感器、單色顯示屏等。這些設備結構簡單,且傳輸的數據量很少,因此適用 I2C 總線。需要較高傳輸速度的設備(如高分辨率彩色顯示屏)通常使用更高速度的連接方式(如 SPI)。
I2C 總線的引腳組成及電氣連接
一個 I2C 總線由兩條總線(Serial Clock, SCL 和 Serial Data, SDA)組成。I2C 總線上的設備都直接連接到這兩個總線上(如圖所示)。
I2C 總線的連接方式。μC 即單片機
所有連接到 I2C 總線的設備均使用開漏(Open-Drain,OD)連接。每個 I2C 設備的電路可以簡化為如下圖的結構:
開漏連接
可以將每個 P 溝道 MOSFET(MOSFET-P)想象為由單片機內部端口控制的“開關”:
開關
可以觀察到,如果 I2C 總線上只連接了設備,那么 I2C 總線不可能處于高電平(因為此時總線沒有連接到電源 Vdd)。我們需要在 SDA、SCL 與 Vdd 間各增加一個上拉電阻(如上圖 Rp),當“斷開開關”時,可以得到高電平;當“合上開關”時,可以得到低電平。
完整的連接示意圖
在下文中,我們將合上開關(使相應總線處于低電平)的動作稱為“拉低”;斷開開關的動作稱為“釋放”。由于所有設備都并聯在總線上,所以若總線上有任意設備拉低總線,總線即處于低電平狀態;只有當總線上的所有設備釋放總線時,總線才能處于高電平狀態。這就是所謂的 Wired-And。
I2C 通信協議概要
空閑狀態
I2C 總線處于空閑狀態時,所有設備都釋放總線,SCL 與 SDA 均處于高電平狀態。
起始條件
I2C 總線上的通信總是由主設備(Master)發起。當主設備希望通信時,它就會產生一個起始條件(Start Condition,S),作為開始通信的信號。
起始條件可以描述為:當 SCL 處于高電平時,SDA 由高電平向低電平轉換。即,在 I2C 總線空閑狀態下,主設備拉低 SDA,代表起始條件,開始一次通信。
幀
在 I2C 協議中,傳輸總是以幀(frame)為單位進行的。一幀為 8bit,即一字節。主設備和從設備都可以發送幀。
在發送幀時,發送方會逐位 (bit) 發送一字節 (byte) 數據,且先發送最高位(most significant bit,MSB)。例如,如果發送方需要發送 183 = 10110111,則按 1,0,1,1,0,1,1,1(從左到右)的順序發送。發送一位數據的過程如下:
主設備首先將 SCL 拉低。
發送方(主或從)在檢測到 SCL 被拉低后,使 SDA 處于相應的電平:如果要發送 0,就拉低 SDA;如果要發送 1,就釋放 SDA。
主設備等待一定的時長后,釋放 SCL;此時發送方不改變 SDA 狀態。
接收方在 SCL 為高電平時,讀取 SDA 的狀態,得到相應數據并存儲下來。
發送完一位后,主設備再次拉低 SCL,進入下一個循環,發送方發送下一位數據,接收方讀取下一位數據。如此循環 8 次,即完成發送一幀。
在發送完一幀的 8 字節后,主設備會將 SCL 再拉低一次。接收方在檢測到 SCL 第 9 次被拉低后:
如果接收當前幀成功,則會將 SDA 拉低,表示自己成功收到了數據,這稱作一個 ACK 信號(acknowledgement signal)。
如果沒有成功接收當前幀,則在 SCL 為低電平時,接收方不會作出任何動作,而使 SDA 保持在釋放狀態,這稱作一個 NACK 信號(not acknowledgement signal)。NACK 信號并不是“主動發出”的,只要接收方沒有作出任何反應,就代表一個 NACK 信號。
如果總線上沒有任何設備,或者相應的接收方沒有正常工作,則發送方會收到一個 NACK。
I2C 幀的傳輸流程
可以觀察到,在傳輸幀時,SDA 僅在 SCL 為低電平時發生變化。如果當 SCL 為高電平時 SDA 發生變化,則會構成起始條件或停止條件。
停止條件與重復起始條件
在傳輸完一幀后,主設備可以選擇繼續傳輸幀,也可以選擇停止傳輸,還可以選擇從頭開始一次新的傳輸。
如果它希望停止傳輸,則需要產生一個停止條件(Stop Condition,P),其可以描述為:當 SCL 處于高電平時,SDA 由低電平向高電平轉換。
如果它希望從頭開始新的傳輸,則需要產生一個重復起始條件(Repeated Start Condition,Sr)。重復起始條件與起始條件是相同的。
起始條件和停止條件
SCL、SDA 名稱的含義
有同學可能會對 Serial Clock 和 Serial Data 名稱的含義感到不解。
SCL 總是由主設備控制,且它以幾乎固定的頻率切換,因此它被稱作 clock。SDA 則負責傳輸數據,因此被稱作 data。
Serial 的含義是“串行”,即同一時間只能發送一位(one bit),而要傳輸的許多位數據“排隊”被傳輸。與“串行”(serial)相對應的是“并行”(parallel)。并行總線通常由多根數據線組成,它一次能夠發送多位數據。并行總線看似效率更高,但實際上它面臨電平問題和串擾問題。
目前的計算機板卡互聯協議中,串行協議占據統治地位。PCI-E、SATA 等都是串行傳輸的。一些較老的傳輸協議是并行協議,如 AGP、PCI 和 IDE。有關串行和并行傳輸方式的更多內容,可以參見這個知乎問題。
I2C 從設備地址
每個 I2C 從設備均有一個(在單個總線上)獨一無二的 7 位從設備地址(slave address),該地址由設備廠商決定,不過有時也可以由用戶自行定義其中的某些位,以允許在同一個 I2C 總線上同時存在相同的多個設備。具體的地址可以在芯片數據手冊中找到。
通常在從設備地址后會附加一個數據方向位(data direction bit),一共 8 位數據,構成一個完整的幀。通常數據方向位為 0 時表示主設備發送、從設備接收,稱為 WRITE;數據方向位為 1 時表示主設備接收、從設備發送,稱作 READ。
以藍橋杯開發板 CT107D 上的 PCF8591 芯片為例。該芯片是一個具有 I2C 功能的模數轉換芯片(Analog to Digital Converter,ADC),用于將模擬信號(analog signal,如通過光敏電阻的電流)轉換為數字信號(digital signal,由具體二進制表示的電壓大小),相當于一個電壓表(將電壓轉換為具體的讀數)。
PCF8591 完整腳位圖
在 PCF8591 數據手冊 8.1 Addressing 一節及 Table 5, 6 中,我們可以找到有關芯片地址的詳細信息。
如表格所示, PCF8591 的地址為 1001xxx,其中最后 3 位由 A2 – A0 腳(即腳位圖中的 5 – 7 腳)決定。如果相應的腳為低電平,則對應的位為 0;否則對應的位為 1。例如如果這三個腳都是高電平,則芯片的地址是 1001111。
一次完整的 I2C 傳輸
主設備產生起始條件,代表一次通信的開始。
主設備發送一幀,表示需要通信的從設備地址和數據方向位。如果相應地址的從設備存在,則從設備將 SDA 拉低,發出 ACK 信號;如果沒有相應地址的從設備存在,則主設備會收到 NACK 信號。
主設備和從設備以幀為單位進行通信;除最后一幀外,每幀傳送完后,接收方需發送 ACK 信號以確認。具體的通信過程需要參照相應設備的數據手冊,具體細節一般在數據手冊的 Functional description 中。PCF8591 數據手冊的第 8 節即為 Functional description。
在最后一幀傳送完后,接收方不發出 ACK,此時主設備作出以下動作:
若希望與其他從設備通信,則產生一個重復起始條件,然后繼續進行第 2 步;
若希望停止通信,則產生一個停止條件。產生停止條件后,兩條數據線均被釋放,I2C 總線進入空閑狀態。
接下來我們以 PCF8591 和 51 單片機為例,看看如何使用 I2C 總線通信。
(未完待續)
圖文|田韻豪
排版|李亦龍
出品|士諤書院X大班
總結
以上是生活随笔為你收集整理的合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 残疾人计算机高考试题,残疾人勇夺玉溪高考
- 下一篇: python实现采样函数_python中