I2C 基础原理详解
今天來(lái)學(xué)習(xí)下I2C通信~
I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之間的(Inter) 通信方式。如上圖所以有很多的周邊設(shè)備都是用I2C通信方式進(jìn)行通信的。
I2C(Inter-Intergrated Circuit)通信使用Clock Line(SCL:Serial Clock)和Data Line(SDA:Serial Data)。數(shù)據(jù)通過(guò)時(shí)鐘同步經(jīng)過(guò)數(shù)據(jù)線進(jìn)行傳輸。這里生成時(shí)鐘信號(hào)并輸出的設(shè)備便是Master, 時(shí)鐘信號(hào)作為輸入并接受數(shù)據(jù)的設(shè)備便是Slave。一般情況下Master便是MicroController,Slave便是周邊的設(shè)備,比如RTC, EEPROM, TOUCH等等。
上面我們提到I2C是同步通信的。同步通信需要獨(dú)立的時(shí)鐘線進(jìn)行同步傳輸數(shù)據(jù)。我們看上面的圖可以知道這里只有一根數(shù)據(jù)線。我們用一根數(shù)據(jù)線來(lái)同時(shí)進(jìn)行數(shù)據(jù)發(fā)送和數(shù)據(jù)接受。那么我們?yōu)槭裁葱枰O(shè)定通信速度呢?對(duì)于同步通信,有了獨(dú)立的時(shí)鐘信號(hào)進(jìn)行同步發(fā)送數(shù)據(jù)根本不需要匹配Bit Width的???為什么同步通信還要設(shè)置通信速度呢?
在I2C中我們說(shuō)的通信速度指的是Clock的最大速度(MAX SPEED),比方說(shuō)Slave最多只能在100KHz下工作,但是Master在400KHz的頻率下工作,這樣的話他們就不能進(jìn)行正常數(shù)據(jù)通信,所以我們需要設(shè)定設(shè)備時(shí)鐘的最大速度。
現(xiàn)在我們對(duì)I2C的基本通信情況是不是有了初步的了解了呢?
現(xiàn)在我們的Master想發(fā)送數(shù)據(jù)給Slave,但是周邊有很多的Slave,那么Master怎么把數(shù)據(jù)發(fā)送給自己向發(fā)送的設(shè)備呢?用Device Address(設(shè)備地址)!
Master為了能將數(shù)據(jù)發(fā)送給想發(fā)送的設(shè)備就需要能區(qū)分設(shè)備(slave)的方法。Master通過(guò)設(shè)備的地址來(lái)區(qū)分周邊的設(shè)備并進(jìn)行數(shù)據(jù)接發(fā)。也就是說(shuō)Master通過(guò)[設(shè)備地址&R/W+數(shù)據(jù)]形式的數(shù)據(jù)發(fā)送到I2C bus中,所有的設(shè)備讀取bus上的這些數(shù)據(jù),判斷是不是發(fā)送給自己的,如果是發(fā)送給自己的就給Master一個(gè)響應(yīng)。
前面我們一直提到I2C是通過(guò)同步時(shí)鐘在數(shù)據(jù)線(SDA)上進(jìn)行數(shù)據(jù)接發(fā)的。這里我們來(lái)邊看圖邊分析看看。一般情況下同步時(shí)鐘上升沿或者是下降沿來(lái)接受或者發(fā)送數(shù)據(jù)的。但是I2C是在高電平(HIGH)的區(qū)間里數(shù)據(jù)有效,低電平區(qū)間內(nèi)數(shù)據(jù)進(jìn)行轉(zhuǎn)換的。
前面我們通過(guò)硬件方式了解了下數(shù)據(jù)是怎么發(fā)送接收的。那么數(shù)據(jù)在發(fā)送接收之前數(shù)據(jù)接發(fā)的開(kāi)始標(biāo)記和結(jié)束標(biāo)記是如何通過(guò)硬件方式來(lái)規(guī)定的呢?數(shù)據(jù)接受發(fā)送的時(shí)候必須要知道開(kāi)始標(biāo)記和結(jié)束標(biāo)記才能進(jìn)行正常的數(shù)據(jù)接受對(duì)吧??
I2C的開(kāi)始標(biāo)記和結(jié)束正如圖所示。時(shí)鐘信號(hào)在高電平的情況下數(shù)據(jù)信號(hào)從高電平轉(zhuǎn)為低電平的話即為I2C通信的開(kāi)始標(biāo)記,時(shí)鐘信號(hào)在高電平的情況下數(shù)據(jù)信號(hào)有低電平轉(zhuǎn)為高電平的話即為I2C通信結(jié)束標(biāo)記。
現(xiàn)在我們基本了解了硬件形式下I2C的[START+DATA+STOP]是如果進(jìn)行工作的?,F(xiàn)在我們來(lái)了解下I2C通信的最小單位是怎樣的。Master在時(shí)鐘信號(hào)為高電平并且數(shù)據(jù)信號(hào)有高電平轉(zhuǎn)為低電平的時(shí)候開(kāi)始I2C通信。然后伴隨著時(shí)鐘的同步進(jìn)行8bit的數(shù)據(jù)傳送或者是接受。后面第9bit的數(shù)據(jù)(ACK)是用來(lái)確認(rèn)數(shù)據(jù)接發(fā)是否正常。最后時(shí)鐘信號(hào)高電平并且數(shù)據(jù)信號(hào)有低電平轉(zhuǎn)為高電平,即I2C通信終止結(jié)束。就是這樣I2C包含ACK總共9bit為通信的最小單位. 了解了這些,下面我們來(lái)看看上面提到過(guò)的[Device Address&R/W + data]形式的數(shù)據(jù)是如何傳輸?shù)摹?/p>
1. Master在時(shí)鐘信號(hào)->High并且數(shù)據(jù)信號(hào)由高電平轉(zhuǎn)為低電平,I2C通信開(kāi)始。
2. Maste伴隨著時(shí)鐘同步傳輸8bit的數(shù)據(jù)。這里說(shuō)的8bit數(shù)據(jù)指的是7bit的Device Address和1bit的R/W。
3. 這里的Device Address在我們用的設(shè)備DataSheet里面有說(shuō)明的。這里需要注意到是比方說(shuō)設(shè)備地址是1101000(0x68, 7bit),數(shù)據(jù)傳輸?shù)臅r(shí)候因?yàn)橐?bit的W/R一起,所以這里要將device address左移一位,然后和W/R進(jìn)行OR操作。
4. Master傳輸?shù)脑O(shè)備地址對(duì)應(yīng)的設(shè)備是否正確接發(fā)通過(guò)ACK進(jìn)行響應(yīng)確認(rèn)。
5. 如果Master只是以 START + data 8bit(device address&R/W) + ACK這種格式發(fā)送后就結(jié)束的話也可以。但是一般情況下在地址發(fā)送之后緊接著會(huì)發(fā)送數(shù)據(jù)。
6. Master能對(duì)特定的設(shè)備進(jìn)行數(shù)據(jù)發(fā)送或者是數(shù)據(jù)接受。在設(shè)備地址數(shù)據(jù)發(fā)送之后便可緊接著要發(fā)送的數(shù)據(jù)或者是要接受的數(shù)據(jù)。
7. Master在發(fā)送或者接受數(shù)據(jù)的時(shí)候不需要規(guī)定要發(fā)送或者接受多少bit 的數(shù)據(jù)。因?yàn)檫@個(gè)依據(jù)不同設(shè)備而不同,所以依據(jù)設(shè)備自己想要的格式進(jìn)行收發(fā)數(shù)據(jù)即可。
8. Master在時(shí)鐘信號(hào)為高電平并且數(shù)據(jù)信號(hào)有低電平轉(zhuǎn)為高電平的話便終止結(jié)束通信。
現(xiàn)在我們已經(jīng)了解了I2C整個(gè)通信過(guò)程中的數(shù)據(jù)格式以及通信方式。實(shí)際寫(xiě)代碼過(guò)程中依據(jù)Datasheet中說(shuō)明的Register情況來(lái)寫(xiě)就可以了。
I2C部分到此結(jié)束~
未經(jīng)允許不得轉(zhuǎn)載:浩瀚先森?I2C 基礎(chǔ)原理詳解
總結(jié)
以上是生活随笔為你收集整理的I2C 基础原理详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PHP和PHPINFO
- 下一篇: 家庭wifi,如何组网最合适