用vue做的網(wǎng)站模板seo網(wǎng)站推廣如何做
一、簡(jiǎn)介
I2C(Inter IC Bus)是有飛利浦公司開發(fā)的一種通用數(shù)據(jù)總線,主要通過兩個(gè)通信線SCL和SDA進(jìn)行通信,其中SCL(Serial Clock)是時(shí)鐘線,用于收發(fā)雙方同步數(shù)據(jù),SDA(Serial Data)是數(shù)據(jù)線,用于傳輸數(shù)據(jù)。是一種同步半雙工的數(shù)據(jù)總線,其有數(shù)據(jù)應(yīng)答功能,支持在總線上掛載多個(gè)設(shè)備。 不少的設(shè)備,比如說常用的0.42寸的OLED顯示器,MPU6050加速度傳感器,AT24C02存儲(chǔ)器模塊,DS3231實(shí)時(shí)時(shí)鐘模塊等,都是用I2C協(xié)議
二、硬件電路分析
I2C典型電路如下:
- 所有I2C設(shè)備的SCL連在一起,SDA連在一起
- 設(shè)備的SCL和SDA都需要設(shè)置為開漏輸出模式
- SCL和SDA各配置一個(gè)上拉電阻,阻值一般為4.7k歐姆
在I2C中,支持總線掛載多設(shè)備,主要有一主多從,多主多從兩個(gè)模式。在主從控制中,CPU作為總線的主機(jī)的權(quán)利很大,一般掌握著SCL和SDA的控制,而從機(jī)只有在申請(qǐng)發(fā)送數(shù)據(jù)或做出應(yīng)答的時(shí)候,才能從主機(jī)中獲取到SDA的控制權(quán),而SCL的控制權(quán)任何時(shí)刻都是在主機(jī)手里的。
由于主機(jī)擁有SCL的絕對(duì)控制權(quán),主機(jī)的SC應(yīng)該L配置成推挽輸出,而從機(jī)的SCL設(shè)置為浮空輸入或者上拉輸入,時(shí)鐘信號(hào)由主機(jī)發(fā)送,所有從機(jī)負(fù)責(zé)接收并且對(duì)齊時(shí)鐘信號(hào)。 對(duì)于SDA,主機(jī)和從機(jī)都可能會(huì)在輸入和輸出之間切換,而如果時(shí)鐘同步?jīng)]做好,可能會(huì)出現(xiàn)兩個(gè)設(shè)備同時(shí)對(duì)SDA進(jìn)行操作的情況,如果其中一個(gè)輸出高電平,另外一個(gè)輸出低電平,則會(huì)導(dǎo)致線路短路,另外,協(xié)調(diào)電路中各個(gè)設(shè)備,使得只有一個(gè)設(shè)備在發(fā)送信息,是一件很麻煩的事情。為了避免這種情況,I2C禁止所有設(shè)備輸出強(qiáng)上拉的高電平,采用外置的弱上拉電阻加開漏輸出的電路結(jié)構(gòu),這也是上述典型電路中的1、2點(diǎn)。
對(duì)于開漏輸出,實(shí)際上的引腳的內(nèi)部結(jié)構(gòu)是只有下拉接負(fù)極的開關(guān)管,而沒有接正極的上拉開關(guān)管,因此引腳只能輸出0電平或者浮空,而由于外置了上拉電阻,則在浮空的時(shí)候,SDA會(huì)被外置電阻弱上拉為高電平,從而避免了同時(shí)有強(qiáng)下拉和強(qiáng)上拉的情況。這樣子就杜絕了電源短路的情況。
并且這個(gè)設(shè)計(jì)開漏加弱上拉的模式,同時(shí)兼具了輸入和輸出的功能:如果需要輸出,則直接使用開漏輸出進(jìn)行操作,而想要輸入的時(shí)候,則不做操作,直接觀察電平高低。另外,這個(gè)設(shè)計(jì)還有一個(gè)“線與”的性質(zhì),也就是只要有任意電路輸出低電平,SDA總線就會(huì)處于低電平,這可以讓CPU執(zhí)行多主機(jī)模式下的時(shí)鐘同步和總線仲裁,這是多主多從模式的基礎(chǔ)。同時(shí),如果發(fā)送SDA總線處于低電平狀態(tài),則表明有人正在占用SDA
總之,這個(gè)設(shè)計(jì)有三個(gè)優(yōu)點(diǎn):
- 避免線路短路
- 兼顧輸入和輸出
- 可實(shí)現(xiàn)多主多從
三、I2C時(shí)序基本單元
3.1 發(fā)送和接收數(shù)據(jù)
I2C規(guī)定,I2C的起始條件和終止條件如下:
起始和終止都是由主機(jī)控制,空閑的時(shí)候所有從設(shè)備都需要保持端口浮空。
發(fā)送一個(gè)字節(jié):
SCL低電平期間,主機(jī)將數(shù)據(jù)一次放在SDA總線上,然后釋放SCL,從機(jī)將在SCL高電平期間讀取數(shù)據(jù)位,所以SCL高電平期間SDA不允許有數(shù)據(jù)變化,依次重復(fù)八次,則發(fā)送一個(gè)字節(jié)。比如說首先主機(jī)拉低SCL,然后將SDA也拉低,表示發(fā)送一個(gè)0,然后保持SDA低電平,釋放SCL,此時(shí)各個(gè)從設(shè)備負(fù)責(zé)讀取SDA電平狀態(tài)0,以此往復(fù)。如果主機(jī)進(jìn)中斷了,停止操作SCL和SDA,那么SCL和SDA則會(huì)保持當(dāng)前狀態(tài),傳輸暫停,不會(huì)導(dǎo)致傳輸丟失的情況,這是同步時(shí)序的好處。
接收一個(gè)字節(jié):
SCL低電平期間,從機(jī)將數(shù)據(jù)一次放在SDA線上,然后主機(jī)釋放SCL,主機(jī)會(huì)在SCL高電平期間讀取數(shù)據(jù)。所以SCL高電平期間SDA不允許有數(shù)據(jù)變化,依次重復(fù)八次,則主機(jī)接收一個(gè)字節(jié)
主機(jī)接收和發(fā)送的區(qū)別是,主機(jī)接受之前需要釋放SDA,而發(fā)送之前需要拉低SDA
3.2 發(fā)送和接收應(yīng)答
發(fā)送應(yīng)答:主機(jī)接受完一個(gè)字節(jié)之后,在下一個(gè)時(shí)鐘發(fā)送一位數(shù)據(jù),數(shù)據(jù)0表示應(yīng)答,1表示非應(yīng)答
接收應(yīng)答:主機(jī)在發(fā)送完一個(gè)字節(jié)之后,在下一個(gè)時(shí)鐘接收一位數(shù)據(jù),判斷從機(jī)是否應(yīng)答,數(shù)據(jù)0表示應(yīng)答,數(shù)據(jù)1表示非應(yīng)答。主機(jī)在接受前需要釋放SDA
3.3 數(shù)據(jù)幀分析
有了上面六個(gè)切片,我們就可以將它們組成一個(gè)完整的數(shù)據(jù)幀了。
指定地址寫
主機(jī)首先需要發(fā)送一個(gè)字節(jié)確定發(fā)送的對(duì)象,該字節(jié)是從機(jī)的地址。從機(jī)地址分為7位地址和10位地址,其中7位地址是廠商按芯片型號(hào)賦值的,而后三位則是可變地址,使得在掛載多個(gè)相同型號(hào)的芯片的時(shí)候可以做出區(qū)分。這個(gè)就是指定從機(jī)步驟。而一個(gè)字節(jié)有8個(gè)位,其中7位用于標(biāo)識(shí)從機(jī),另外一位是讀寫位,用于表示主機(jī)要進(jìn)行讀操作還是寫操作。
主機(jī)發(fā)送指定從機(jī)字節(jié)后,目標(biāo)從機(jī)會(huì)立馬對(duì)主機(jī)進(jìn)行應(yīng)答,也就是主機(jī)發(fā)送完指定從機(jī)字節(jié)之后,主機(jī)會(huì)釋放SDA,此時(shí)目標(biāo)從機(jī)立馬下拉SDA,表示應(yīng)答,而主機(jī)在下一個(gè)SCL高電平的時(shí)候讀SDA,發(fā)現(xiàn)自己釋放SDA后,SDA仍是低電平,根據(jù)線與設(shè)計(jì),證明電路中有設(shè)備對(duì)SDA進(jìn)行了下拉操作,也就是有設(shè)備做出了應(yīng)答。
一般來說,指定地址寫在從機(jī)應(yīng)答后,主機(jī)寫的第一個(gè)字節(jié)是指定寫入從機(jī)的哪一個(gè)寄存器,接著再下一個(gè)字節(jié)是寫入的值
指定地址讀
接下來,則根據(jù)讀寫位,進(jìn)行主機(jī)的讀寫操作。如果主機(jī)發(fā)送主機(jī)讀命令,那么在指定從機(jī)之后,會(huì)立馬進(jìn)入主機(jī)讀狀態(tài),但是此時(shí)還不知道主機(jī)需要讀的是從機(jī)哪一個(gè)寄存器中的值,這怎么辦呢?在支持I2C的設(shè)備中,寄存器地址一般都是線性緊挨排布的。而其中會(huì)有一個(gè)地址指針(假設(shè)位于0x19),用于指向寄存器,每次讀一次,指針就會(huì)自增一次。因此比如要讀取0xAA的寄存器,那么首先對(duì)指定從機(jī)發(fā)送一個(gè)寫請(qǐng)求,將0x19的內(nèi)存單元寫為0xA9,然后終止。再發(fā)起一次主機(jī)讀,然后指定從機(jī)接收到請(qǐng)求后,0x19自增1,變成0xAA,然后讀出0xAA寄存器中的值。這個(gè)操作被稱為**“指定地址讀”**