IIC 簡介
IIC(Inter-Integrated Circuit)總線是一種由NXP(原PHILIPS)公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。多用于主控制器和從器件間的主從通信,在小數據量場合使用,傳輸距離短,任意時刻只能有一個主機等特性。
在 CPU 與被控 IC 之間、IC 與 IC 之間進行雙向傳送,高速 IIC 總線一般可達 400kbps 以上。
PS:這里要注意IIC是為了與低速設備通信而發明的,所以IIC的傳輸速率比不上SPI
?
IIC的物理層
IIC一共有只有兩個總線:一條是雙向的串行數據線SDA,一條是串行時鐘線SCL
SDA(Serial data)是數據線,D代表Data也就是數據,Send Data 也就是用來傳輸數據的
SCL(Serial clock line)是時鐘線,C代表Clock 也就是時鐘 也就是控制數據發送的時序的
所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。I2C總線上的每個設備都自己一個唯一的地址,來確保不同設備之間訪問的準確性。
IIC主要特點:
通常我們為了方便把IIC設備分為主設備和從設備,基本上誰控制時鐘線(即控制SCL的電平高低變換)誰就是主設備。**
IIC主設備功能:主要產生時鐘,產生起始信號和停止信號
IIC的一個優點是它支持多主控(multimastering), 其中任何一個能夠進行發送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。
支持不同速率的通訊速度,標準速度(最高速度100kHZ),快速(最高400kHZ)
SCL和SDA都需要接上拉電阻 (大小由速度和容性負載決定一般在3.3K-10K之間) 保證數據的穩定性,減少干擾。
IIC是半雙工,而不是全雙工 ,同一時間只可以單向通信
為了避免總線信號的混亂,要求各設備連接到總線的輸出端時必須是漏極開路(OD)輸出或集電極開路(OC)輸出。這一點在等下我們會講解
IIC的高阻態
漏極開路(Open Drain)即高阻狀態,適用于輸入/輸出,其可獨立輸入/輸出低電平和高阻狀態,若需要產生高電平,則需使用外部上拉電阻
高阻狀態:高阻狀態是三態門電路的一種狀態。邏輯門的輸出除有高、低電平兩種狀態外,還有第三種狀態——高阻狀態的門電路。電路分析時高阻態可做開路理解。
我們知道IIC的所有設備是接在一根總線上的,那么我們進行通信的時候往往只是幾個設備進行通信,那么這時候其余的空閑設備可能會受到總線干擾,或者干擾到總線,怎么辦呢?
為了避免總線信號的混亂,IIC的空閑狀態只能有外部上拉, 而此時空閑設備被拉到了高阻態,也就是相當于斷路, 整個IIC總線只有開啟了的設備才會正常進行通信,而不會干擾到其他設備。
IIC器件地址:每一個IIC器件都有一個器件地址,有的器件地址在出廠時地址就設定好了,用戶不可以更改,比如OV7670的地址為0x42。有的器件例如EEPROM,前四個地址已經確定為1010,后三個地址是由硬件鏈接確定的,所以一IIC總線最多能連8個EEPROM芯片。
IIC物理層總結:
I2C 總線在物理連接上非常簡單,分別由SDA(串行數據線)和SCL(串行時鐘線)及上拉電阻組成。通信原理是通過對SCL和SDA線高低電平時序的控制,來產生I2C總線協議所需要的信號進行數據的傳遞。在總線空閑狀態時,SCL和SDA被上拉電阻Rp拉高,使SDA和SCL線都保持高電平。
I2C通信方式為半雙工,只有一根SDA線,同一時間只可以單向通信,485也為半雙工,SPI和uart通信為全雙工。
主機和從機的概念:
主機就是負責整個系統的任務協調與分配,從機一般是通過接收主機的指令從而完成某些特定的任務,主機和從機之間通過總線連接,進行數據通訊。
發布主要命令的稱為主機
接受命令的稱為從機
半雙工和全雙工:
IIC的協議層
I2C 總線在傳送數據過程中共有三種類型信號, 它們分別是:開始信號、結束信號和應答信號。
開始信號:SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送數據。
結束信號:SCL 為高電平時,SDA 由低電平向高電平跳變,結束傳送數據。
應答信號:接收數據的 IC 在接收到 8bit 數據后,向發送數據的 IC 發出特定的低電平脈沖,表示已收到數據。CPU 向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU 接收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。
這些信號中,起始信號是必需的,結束信號和應答信號,都可以不要。
IIC 總線時序圖
下面我們來詳細的介紹下IIC的通信協議流程:
初始(空閑)狀態
因為IIC的 SCL 和SDA 都需要接上拉電阻,保證空閑狀態的穩定性
所以IIC總線在空閑狀態下SCL 和SDA都保持高電平
代碼:
開始信號:
SCL保持高電平,SDA由高電平變為低電平后,延時(>4.7us),SCL變為低電平。
代碼表示:
停止信號
停止信號:SCL保持高電平。SDA由低電平變為高電平。
在起始條件產生后,總線處于忙狀態,由本次數據傳輸的主從設備獨占,其他I2C器件無法訪問總線;而在停止條件產生后,本次數據傳輸的主從設備將釋放總線,總線再次處于空閑狀態。
數據有效性
IIC信號在數據傳輸過程中,當SCL=1高電平時,數據線SDA必須保持穩定狀態,不允許有電平跳變,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。
SCL=1時 數據線SDA的任何電平變換會看做是總線的起始信號或者停止信號。
也就是在IIC傳輸數據的過程中,SCL時鐘線會頻繁的轉換電平,以保證數據的傳輸
應答信號
每當主機向從機發送完一個字節的數據,主機總是需要等待從機給出一個應答信號,以確認從機是否成功接收到了數據,
應答信號:主機SCL拉高,讀取從機SDA的電平,為低電平表示產生應答
應答信號為低電平時,規定為有效應答位(ACK,簡稱應答位),表示接收器已經成功地接收了該字節;
應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。
**每發送一個字節(8個bit)**在一個字節傳輸的8個時鐘后的第九個時鐘期間,接收器接收數據后必須回一個ACK應答信號給發送器,這樣才能進行數據傳輸。
應答出現在每一次主機完成8個數據位傳輸后緊跟著的時鐘周期,低電平0表示應答,1表示非應答,
?
?
等待應答信號:
IIC數據傳送
數據傳送格式
SDA線上的數據在SCL時鐘“高”期間必須是穩定的,只有當SCL線上的時鐘信號為低時,數據線上的“高”或“低”狀態才可以改變。輸出到SDA線上的每個字節必須是8位,數據傳送時,先傳送最高位(MSB),每一個被傳送的字節后面都必須跟隨一位應答位(即一幀共有9位)。
當一個字節按數據位從高位到低位的順序傳輸完后,緊接著從設備將拉低SDA線,回傳給主設備一個應答位ACK, 此時才認為一個字節真正的被傳輸完成 ,如果一段時間內沒有收到從機的應答信號,則自動認為從機已正確接收到數據。
IIC寫數據:
?
?
多數從設備的地址為7位或者10位,一般都用七位。
八位設備地址=7位從機地址+讀/寫地址,
再給地址添加一個方向位位用來表示接下來數據傳輸的方向,
0表示主設備向從設備(write)寫數據,
1表示主設備向從設備(read)讀數據
IIC的每一幀數據由9bit組成,
如果是發送數據,則包含 8bit數據+1bit ACK,
如果是設備地址數據,則8bit包含7bit設備地址 1bit方向
在起始信號后必須傳送一個從機的地址(7位) 1~7位為7位接收器件地址,第8位為讀寫位,用“0”表示主機發送數據(W),“1”表示主機接收數據 (R), 第9位為ACK應答位,緊接著的為第一個數據字節,然后是一位應答位,后面繼續第2個數據字節。
IIC發送一個字節數據:
IIC讀取一個字節數據:
IIC發送數據
?
?
?
?
Start: IIC開始信號,表示開始傳輸。
DEVICE_ADDRESS:: 從設備地址,就是7位從機地址
R/W:W(write)為寫,R(read)為讀
ACK:應答信號
WORD_ADDRESS :從機中對應的寄存器地址 比方說訪問 OLED中的 某個寄存器
DATA: 發送的數據
STOP: 停止信號。結束IIC
主機要向從機寫數據時:
主機首先產生START信號
然后緊跟著發送一個從機地址,這個地址共有7位,緊接著的第8位是數據方 向位(R/W),0表示主機發送數據(寫),1表示主機接收數據(讀)
主機發送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,若相同,則認為自己正在被主機尋址,根據R/T位將自己確定為發送器和接收器
這時候主機等待從機的應答信號(A)
當主機收到應答信號時,發送要訪問從機的那個地址, 繼續等待從機的應答信號
當主機收到應答信號時,發送N個字節的數據,繼續等待從機的N次應答信號,
主機產生停止信號,結束傳送過程。
IIC讀數據:
?
?
主機要從從機讀數據時
主機首先產生START信號
然后緊跟著發送一個從機地址,注意此時該地址的第8位為0,表明是向從機寫命令,
這時候主機等待從機的應答信號(ACK)
當主機收到應答信號時,發送要訪問的地址,繼續等待從機的應答信號,
當主機收到應答信號后,主機要改變通信模式(主機將由發送變為接收,從機將由接收變為發送)所以主機重新發送一個開始start信號,然后緊跟著發送一個從機地址,注意此時該地址的第8位為1,表明將主機設 置成接收模式開始讀取數據,
這時候主機等待從機的應答信號,當主機收到應答信號時,就可以接收1個字節的數據,當接收完成后,主機發送非應答信號,表示不在接收數據
主機進而產生停止信號,結束傳送過程。
以AT24C02為例子
24C02是一個2K Bit的串行EEPROM存儲器(掉電不丟失),內部含有256個字節。在24C02里面有一個8字節的頁寫緩沖器。
A0,A1,A2:硬件地址引腳
WP:寫保護引腳,接高電平只讀,接地允許讀和寫
SCL和SDA:IIC總線
可以看出對于不同大小的24Cxx,具有不同的從器件地址。由于24C02為2k容量,也就是說只需要參考圖中第一行的內容:
芯片的尋址:
AT24C設備地址為如下,前四位固定為1010,A2~A0為由管腳電平。AT24CXX EEPROM Board模塊中默認為接地。A2~A0為000,最后一位表示讀寫操作。所以AT24Cxx的讀地址為0xA1,寫地址為0xA0。
也就是說如果是
寫24C02的時候,從器件地址為10100000(0xA0);
讀24C02的時候,從器件地址為10100001(0xA1)。
片內地址尋址:
芯片尋址可對內部256B中的任一個進行讀/寫操作,其尋址范圍為00~FF,共256個尋址單位。
?
?
對應的修改 A2A1A0 三位數據即可
向AT24C02中寫數據
操作時序:
MCU先發送一個開始信號(START)啟動總線
接著跟上首字節,發送器件寫操作地址(DEVICE ADDRESS)+寫數據(0xA0)
等待應答信號(ACK)
發送數據的存儲地址。24C02一共有256個字節的存儲空間,地址從0x00~0xFF,想把數據存儲>在哪個位置,此刻寫的就是哪個地址。
發送要存儲的數據第一字節、第二字節、…注意在寫數據的過程中,E2PROM每個字節都會>回應一個“應答位0”,老告訴我們寫E2PROM數據成功,如果沒有回應答位,說明寫入不成功。
發送結束信號(STOP)停止總線
注意:
在寫數據的過程中,每成功寫入一個字節,E2PROM存儲空間的地址就會自動加1,當加到0xFF后,再寫一個字節,地址就會溢出又變成0x00。
寫數據的時候需要注意,E2PROM是先寫到緩沖區,然后再“搬運到”到掉電非易失區。所以這個過程需要一定的時間,AT24C02這個過程是不超過5ms!
所以,當我們在寫多個字節時,寫入一個字節之后,再寫入下一個字節之前,必須延時5ms才可以
從AT24C02中讀數據
讀當前地址的數據
?
?
2、讀隨機地址的數據
?
?
MCU先發送一個開始信號(START)啟動總線
接著跟上首字節,發送器件寫操作地址(DEVICE ADDRESS)+寫數據(0xA0)
注意:這里寫操作是為了要把所要讀的數據的存儲地址先寫進去,告訴E2PROM要讀取哪個地址的數據。
發送要讀取內存的地址(WORD ADDRESS),通知E2PROM讀取要哪個地址的信息。
重新發送開始信號(START)
發送設備讀操作地址(DEVICE ADDRESS)對E2PROM進行讀操作 (0xA1)
E2PROM會自動向主機發送數據,主機讀取從器件發回的數據,在讀一個字節后,MCU會回應一個應答信號(ACK)后,E2PROM會繼續傳輸下一個地址的數據,MCU不斷回應應答信號可以不斷讀取內存的數據
如果不想讀了,告訴E2PROM不想要數據了,就發送一個“非應答位NAK(1)”。發送結束信號(STOP)停止總線
3、連續讀數據
?
?
E2PROM支持連續寫操作,操作和單個字節類似,先發送設備寫操作地址(DEVICE ADDRESS),然后發送內存起始地址(WORD ADDRESS),MCU會回應一個應答信號(ACK)后,E2PROM會繼續傳輸下一個地址的數據,MCU不斷回應應答信號可以不斷讀取內存的數據。E2PROM的地址指針會自動遞增,數據會依次保存在內存中。不應答發送結束信號后終止傳輸。
軟件IIC和硬件IIC
IIC分為軟件IIC和硬件IIC
軟件IIC:軟件IIC通信指的是用單片機的兩個I/O端口模擬出來的IIC,用軟件控制管腳狀態以模擬I2C通信波形,軟件模擬寄存器的工作方式。
硬件IIC:一塊硬件電路,硬件I2C對應芯片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管腳也是專用的,硬件(固件)I2C是直接調用內部寄存器進行配置。
硬件I2C的效率要遠高于軟件的,而軟件I2C由于不受管腳限制,接口比較靈活。
審核編輯:黃飛
?
評論
查看更多