日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

最近一段時間工作上比較忙,一直沒有抽出空來寫文章與大家分享,這兩天騰出些時間靜下心來沉淀一番。看標題大家已經(jīng)知道了是來總結(jié)I2C總線,我相信大家或多或少的都接觸過I2C總線,這篇文章我們就由淺入深的仔細來研究研究,看看能不能挖掘些新東西,加深一下理解。

先說概念

I2C英文全稱Inter-Integrated Circuit,字面意思是集成電路之間,也就是我們常說的I方C總線—I2C bus。它是一種串行通訊總線,使用多主從架構(gòu),由飛利浦公司(恩智浦NXP的母公司)在80年代開發(fā),用于主板、嵌入式系統(tǒng)連接周邊低速設(shè)備。

I2C由兩條雙向開漏線組成,這是一個很大的優(yōu)勢,接線簡單。兩條線利用上拉電阻將電位上拉。典型電位為+3.3V或+5V。標準傳輸速率為100Kb/s,低速模式10Kb/s。

物理層

下圖為I2C總線的物理拓撲圖,大家可以看到一共只有兩條總線,一條SDA(serial data)數(shù)據(jù)線用來承載數(shù)據(jù)、一條SCL(serial clock line)時鐘線用來控制數(shù)據(jù)收發(fā)時序。所有I2C設(shè)備的SDA都接到了總線的SDA上,SCL都接到了總線的SCL上。每個設(shè)備都有自己的唯一地址,以保證設(shè)備之間訪問的準確性。

一篇文章講透I2C總線協(xié)議

I2C總線的物理拓撲圖

I2C在物理層的連接可以說是非常簡單,這也是它最大的優(yōu)勢,原理就是通過控制SDA和SCL線的高低電平時序,來產(chǎn)生I2C總線協(xié)議所需要的信號進行數(shù)據(jù)傳輸。在總線處于空閑狀態(tài)時SCL和SDA被上拉電阻拉高,保持高電平。

需要注意的是I2C的通訊方式為半雙工,因為只有一條數(shù)據(jù)線,某一時刻只可能單向通訊。這也說明了I2C不適合大數(shù)據(jù)量的傳輸應(yīng)用。

對于主機、從機的區(qū)分很簡單,發(fā)布主要命令的就是主機,接受命令的就是從機,同一條I2C總線允許多個主機的存在。

協(xié)議層

作為基礎(chǔ)我們先來了解幾個重要的小概念。

1、初始狀態(tài)(即空閑狀態(tài)):SDA與SCL均為上拉電阻所致的高電平時為初始狀態(tài);
2、開始信號:當SCL為高電平的時候,SDA被拉低,此為開始信號,表明通訊開始。
3、終止信號:當SCL為高電平的時候,SDA被拉高,此為終止信號,表明本次通訊結(jié)束。

一篇文章講透I2C總線協(xié)議

 

到這里大家有沒有發(fā)現(xiàn)點什么?當SCL處于高電平的時候,SDA電平一旦變化就會是一種信號,要么開始要么是終止。所以在數(shù)據(jù)傳輸過程中SCL處于高電平時,SDA必須保持狀態(tài)穩(wěn)定,只有SCL處于低電平時SDA才可以變化。

4、應(yīng)答信號:當發(fā)送器向接收器發(fā)送完一個字節(jié)/8位數(shù)據(jù)后,第9個時鐘周期內(nèi),接收器必須給發(fā)送器一個應(yīng)答信號,這樣數(shù)據(jù)才算傳輸成功。高電平表非應(yīng)答,低電平表應(yīng)答。

一篇文章講透I2C總線協(xié)議

 

我們了解這幾個信號狀態(tài)后,來一步一步看看數(shù)據(jù)是如何傳輸?shù)摹?/p>

1、向從機設(shè)備的某一個寄存器寫一個字節(jié)數(shù)據(jù):開始信號+設(shè)備地址(7位)+讀/寫(1位)+等待從機應(yīng)答+寄存器地址(8位)+等待從機應(yīng)答+要寫的數(shù)據(jù)(8位)+等待從機應(yīng)答+終止信號。下圖為24C02 EEPROM存儲器寫數(shù)據(jù)的時序圖。

一篇文章講透I2C總線協(xié)議

 

2、寫我們見識了,那讀一個試試:下圖為讀取24C02當前地址一個字節(jié)數(shù)據(jù)的時序圖,是不是一目了然了。值得注意的是當讀的時候地址7位后的讀寫狀態(tài)位為1。這里說一下為什么最后是NO ACK,在“讀”這個操作下,主機為接收器,主機的NO ACK表示停止接收24C02的數(shù)據(jù),不然24C02會繼續(xù)發(fā)。

一篇文章講透I2C總線協(xié)議

 

3、我們再讀一個長一點的:下圖為讀取24C02任意地址一個字節(jié)數(shù)據(jù)的時序圖。開始信號+設(shè)備地址(7位)+寫(1位)+等待從機應(yīng)答+數(shù)據(jù)地址(8位)+等待從機應(yīng)答。前面這一步為假寫,目的是告訴24C02要讀哪個地址的數(shù)據(jù)。繼續(xù),開始信號+設(shè)備地址(7位)+讀(1位)+等待從機應(yīng)答+讀到的數(shù)據(jù)(8位)+等待主機(接收機)應(yīng)答+終止信號

一篇文章講透I2C總線協(xié)議

 

補點干貨

1、設(shè)備的地址。I2C設(shè)備的地址為8位,但是時序操作時最后一位不屬于地址,而是讀or寫狀態(tài)位。這就是為什么arduino的SH1106庫里操作的地址不是0x7-而是0x3-,因為有用的是前7位,地址整體右移一位處理了。再一個設(shè)備地址的前四位是固定死的,是廠家用來表示設(shè)備類型的,比如接口為I2C的溫度傳感器類設(shè)備地址前四位一般為1001即9X、EEPROM存儲器地址前四位一般為1010即AX、oled屏地址前四位一般為0111即7X等等。

2、I2C接口的致命缺點就是傳輸距離近同時速度慢。大家在使用I2C總線接口的時候切記不要長線傳輸,盡量只在PCB板內(nèi)傳輸,不然偶爾丟數(shù)據(jù)甚至讀不到數(shù)據(jù)會讓人崩潰,不要問我是怎么知道的,問只有眼淚。

3、關(guān)于兩線為什么設(shè)計成開漏,這個問題我記得我之前在寫《STM32單片機I/O的8種工作模式》時給大家埋下過伏筆。今天就來說一下具體原因。主要有兩點①防止短路:大家想想如果不設(shè)為開漏,而設(shè)為推挽,幾個設(shè)備連在同一條總線上,這時某一設(shè)備的某個IO輸出高電平,另有一臺設(shè)備的某一個IO輸出低電平,這時你會發(fā)現(xiàn)這兩個IO的VCC和GND短路了;但是開漏就不會有這個問題,如下圖示:

一篇文章講透I2C總線協(xié)議

 

第二個原因是“線與”,我們想個場景:如果總線上的一個A設(shè)備將SDA拉高,這時總線上另一個B設(shè)備已將SDA拉低,這時由于1&0=0,所以A設(shè)備檢查SDA的時候會發(fā)現(xiàn)不是高電平而是低電平,這就表明總線上已經(jīng)有其他設(shè)備占用總線了,A只好放棄,如果檢測是高電平那就可以使用。如下圖示為24C02芯片內(nèi)部圖,可以看到狀態(tài)檢測腳。

一篇文章講透I2C總線協(xié)議

 

總結(jié)

I2C總線作為一個常見的總線協(xié)議,是非常值得我們來仔細研究琢磨的,通透以后我們再使用任意I2C接口的設(shè)備時就可以信手拈來了。我一直覺得在學(xué)習(xí)的過程中,“會使用”不一定就是我們追求的終點,會用的同時把一些更深的東西搞懂搞透會收獲意想不到的喜悅。

分享到:
標簽:總線 協(xié)議 I2C
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定