九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
I2C詳解

1 I2C接口簡(jiǎn)介

I2C全稱:Inter-Integrated Circuit,是一種同步、半雙工的通信總線。

同步:發(fā)送接收端要嚴(yán)格同步,一般有同步時(shí)鐘線。

半雙工:I2C只有一條數(shù)據(jù)線,所以master發(fā)數(shù)據(jù)與收數(shù)據(jù)不能同時(shí)進(jìn)行。

I2C通信速率:

模式速率

標(biāo)準(zhǔn)模式

100 kbps

快速模式

400 kbps

高速模式

3.4 Mbps

I2C誕生的背景:

最初的嵌入系統(tǒng)是使用內(nèi)存映射(memory-mapped I/O)的方式來互連微控制器和外圍設(shè)備的。要實(shí)現(xiàn)內(nèi)存映射,設(shè)備必須并行連入微控制器的數(shù)據(jù)線和地址線,也就意味著:如果要連接一款新的外圍設(shè)備,需在設(shè)計(jì)芯片時(shí)候確定好。所以很不靈活并且成本高。

1982年,Philips實(shí)驗(yàn)室開發(fā)了I2C,方便CPU與外設(shè)之間通信。

1.1 I2C原理簡(jiǎn)介

我理解的是:I2C設(shè)計(jì)時(shí)的理念是:信號(hào)線盡量少并且速率要盡量高。

信號(hào)線少,可以減少引腳占用,這對(duì)早期的芯片(引腳很少)的很重要。

當(dāng)然,如果單純說減少信號(hào)線,1-wire總線只使用1根線通信(比如DS18B20、DHT11等都是使用這種協(xié)議),但是1-wire總線是異步通信,所以1-wire總線速率不可能太高(1-wire總線傳輸速率一般為16.3Kbit/s,最大可達(dá)142 Kbit/s,通常情況下采用100Kbit/s以下的速率傳輸數(shù)據(jù))。

標(biāo)準(zhǔn)的I2C需要兩根信號(hào)線:

SCL(Serial Clock):時(shí)鐘線,時(shí)鐘都是有master提供的

SDA(Serial Data):雙向數(shù)據(jù)線,發(fā)數(shù)據(jù)或者收數(shù)據(jù)(收發(fā)不能同時(shí))

I2C多master多slave示意圖:

圖中是2個(gè)master+2個(gè)slave的示意,同一時(shí)刻只有一個(gè)master與一個(gè)slave通信。

若想實(shí)現(xiàn)這個(gè)效果:

1 多個(gè)master-slave 時(shí)鐘、數(shù)據(jù)線連在一起,需要實(shí)現(xiàn)信號(hào)的“線與”邏輯(所以SDA、SCL 被設(shè)計(jì)為漏極開路結(jié)構(gòu),外加上拉電阻實(shí)現(xiàn)“線與”)

2 需要實(shí)現(xiàn) “時(shí)鐘同步”和“總線仲裁”,引腳在輸出信號(hào)的同時(shí)還能對(duì)引腳上的電平進(jìn)行檢測(cè),檢測(cè)是否與剛才輸出一致,為 “時(shí)鐘同步”和“總線仲裁”提供硬件基礎(chǔ)。

3 I2C在讀寫時(shí)需要帶上設(shè)備地址,這樣不使用多的信號(hào)線就可指定特定的slave(而SPI通信需要多的片選線)

1.2 I2C的讀寫

I2C的寫過程:

Master發(fā)起START

Master發(fā)送I2C addr(7bit)和W(寫)操作0(1bit),等待ACK

Slave發(fā)送ACK

Master發(fā)送reg addr(8bit),等待ACK

Slave發(fā)送ACK

Master發(fā)送data(8bit),即要寫入寄存器中的數(shù)據(jù),等待ACK

Slave發(fā)送ACK

第6步和第7步可以重復(fù)多次,即順序?qū)懚鄠€(gè)寄存器

Master發(fā)起STOP結(jié)束傳輸

I2C的讀過程:

Master發(fā)起START

Master發(fā)送I2C addr(7bit)和r(讀)操作1(1bit),等待ACK

Slave發(fā)送ACK

Slave發(fā)送data(8bit),即寄存器里的值

Master發(fā)送ACK

第7步和第8步可以重復(fù)多次,即順序讀多個(gè)寄存器

當(dāng)master接收完想要的數(shù)據(jù)后,由Master發(fā)送NACK,告知slave停止發(fā)送數(shù)據(jù)

Master發(fā)送STOP結(jié)束傳輸

但實(shí)際上,I2C讀過程之前需要知道讀取的寄存器地址。所以讀過程之前需要master寫寄存器的操作,告知slave后面讀取寄存器的起始地址。

完整I2C讀過程 = 寫過程 + 讀過程,其中涉及到讀寫方向的轉(zhuǎn)變。

1.3 I2C的幾個(gè)狀態(tài)

上節(jié)幾個(gè)圖描述了讀寫數(shù)據(jù)流,圖中的幾個(gè)狀態(tài)需要與實(shí)際信號(hào)一一對(duì)應(yīng)起來。

1 總線空閑狀態(tài):

SDA和SCL同時(shí)處于高電平時(shí),規(guī)定為總線的空閑狀態(tài)。此時(shí)各個(gè)器件的輸出級(jí)場(chǎng)效應(yīng)管均處在截止?fàn)顟B(tài),即釋放總線,由兩條信號(hào)線各自的上拉電阻把電平拉高。

2 總線START:

SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。

3 總線STOP:

SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。

4 總線Restart:

SCL為高電平時(shí),SDA由高電平向低電平跳變,本質(zhì)上也是START信號(hào),用在完整I2C讀過程中的讀階段,在首次發(fā)送停止信號(hào)之前,master通過發(fā)送Restart信號(hào),可以轉(zhuǎn)換與當(dāng)前slave的通信模式(從寫模式到讀模式),或是切換到與另一個(gè)slave通信。

5 數(shù)據(jù)階段:

在IIC總線上傳送的每一位數(shù)據(jù)都有一個(gè)時(shí)鐘脈沖相對(duì)應(yīng)(或同步控制),即在SCL串行時(shí)鐘的配合下,在SDA上逐位地串行傳送每一位數(shù)據(jù)。進(jìn)行數(shù)據(jù)傳送時(shí),在SCL呈現(xiàn)高電平期間,SDA上的電平必須保持穩(wěn)定。只有在SCL為低電平期間,才允許SDA上的電平改變狀態(tài)。簡(jiǎn)單的說就是,數(shù)據(jù)在SCL下降會(huì)被采樣,所以SDA需要在SCL為高電平時(shí)保持穩(wěn)定。

6 ACK與NACK信號(hào):

IIC總線上的所有數(shù)據(jù)都是以8位字節(jié)傳送的,發(fā)送器每發(fā)送一個(gè)字節(jié),就在第9個(gè)時(shí)鐘脈沖期間釋放數(shù)據(jù)線,由接收器反饋一個(gè)應(yīng)答信號(hào)。應(yīng)答信號(hào)為低電平時(shí),規(guī)定為有效應(yīng)答位(ACK簡(jiǎn)稱應(yīng)答位),表示接收器已經(jīng)成功地接收了該字節(jié);應(yīng)答信號(hào)為高電平時(shí),規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。

這段話再說細(xì)一點(diǎn):

在寫階段,master寫了一字節(jié)數(shù)據(jù),在第9個(gè)時(shí)鐘脈沖期間釋放數(shù)據(jù)線,由slave反饋應(yīng)答信號(hào),ACK(低)表示數(shù)據(jù)成功接收,NACK(高)表示該字節(jié)沒有接收成功;

在讀階段,master向slave收數(shù)據(jù),slave寫了一字節(jié)數(shù)據(jù),在第9個(gè)時(shí)鐘脈沖期間釋放數(shù)據(jù)線,由master反饋應(yīng)答信號(hào),ACK(低)表示數(shù)據(jù)成功接收,NACK(高)表示該字節(jié)沒有接收成功。

還有一種特殊情況:當(dāng)master決定不再接收數(shù)據(jù)時(shí),應(yīng)向slave發(fā)送NACK信號(hào),高速slave不再發(fā)送。

以下情況會(huì)導(dǎo)致出現(xiàn)NACK位:

接收器沒有發(fā)送機(jī)響應(yīng)的地址,接收端沒有任何ACK發(fā)送給發(fā)送器

由于接收器正在忙碌處理實(shí)時(shí)程序?qū)е陆訜o法接收或者發(fā)送

傳輸過程中,接收機(jī)器別不了發(fā)送機(jī)的數(shù)據(jù)或命令

接收器無法接收

master接收完成讀取數(shù)據(jù)后,要發(fā)送NACK結(jié)束告知slave。

當(dāng)master接收到slave的NACK信號(hào)后,可以STOP這次傳輸,也可以重新START。

所以:NACK并不只是表示字節(jié)沒有成功接收,也可以表示master告訴slave不再需要發(fā)送數(shù)據(jù)。

1.4 I2C通信中的幾個(gè)問題

1 總線沖突和總線仲裁

I2C總線上的仲裁分兩部分:SCL線的同步和SDA線的仲裁。

SDA仲裁:

這段話摘自《IIC總線解析》,見參考。

假如在某IIC總線系統(tǒng)中存在兩個(gè)主器件節(jié)點(diǎn),分別記為主器件1和主器件2,其輸出數(shù)據(jù)分別為DATA1和DATA2,它們都有控制總線的能力,這就存在著發(fā)生總線沖突(即寫沖突)的可能性。

假設(shè)在某一瞬間兩者相繼向總線發(fā)出了啟動(dòng)信號(hào),鑒于:I2C總線的“線與”特性,使得在數(shù)據(jù)線SDA上得到的信號(hào)波形是DATA1和DATA2兩者相與的結(jié)果

在總線被啟動(dòng)后,主器件1企圖發(fā)送數(shù)據(jù)“101……”,主器件2企圖發(fā)送數(shù)據(jù)“100……”。

兩個(gè)主器件在每次發(fā)出一個(gè)數(shù)據(jù)位的同時(shí)都要對(duì)自己輸出端的信號(hào)電平進(jìn)行抽檢,只要抽檢的結(jié)果與它們自己預(yù)期的電平相符,就會(huì)繼續(xù)占用總線,總線控制權(quán)也就得不到裁定結(jié)果。

主器件1的第3位期望發(fā)送“1”,也就是在第3個(gè)時(shí)鐘周期內(nèi)送出高電平。在該時(shí)鐘周期的高電平期間,主器件1進(jìn)行例行抽檢時(shí),結(jié)果檢測(cè)到一個(gè)不相匹配的電平“0”,這時(shí)主器件1只好決定放棄總線控制權(quán)(主器件1切為slave模式,不再產(chǎn)生時(shí)鐘,等主器件2完成傳輸,總線恢復(fù)空閑狀態(tài)時(shí),又重新啟動(dòng)主器件1的傳輸);因此,主器件2就成了總線的惟一主宰者,總線控制權(quán)也就最終得出了裁定結(jié)果,從而實(shí)現(xiàn)了總線仲裁的功能。

從以上總線仲裁的完成過程可以得出:仲裁過程主器件1和主器件2都不會(huì)丟失數(shù)據(jù);各個(gè)主器件沒有優(yōu)先級(jí)別之分,總線控制權(quán)是隨機(jī)裁定的。

系統(tǒng)實(shí)際上遵循的是“低電平優(yōu)先”的仲裁原則,將總線判給在數(shù)據(jù)線上先發(fā)送低電平的主器件,而其他發(fā)送高電平的主器件將失去總線控制權(quán)。

SCL時(shí)鐘同步:

如果在某一I2C總線系統(tǒng)中存在兩個(gè)主器件節(jié)點(diǎn),分別記為主器件1和主器件2,其時(shí)鐘輸出端分別為CLK1和CLK2,它們都有控制總線的能力。

假設(shè)在某一期間兩者相繼向SCL線發(fā)出了波形不同的時(shí)鐘脈沖序列CLK1和CLK2,在總線控制權(quán)還沒有裁定之前這種現(xiàn)象是可能出現(xiàn)的。

鑒于IIC總線的“線與”特性,使得時(shí)鐘線SCL上得到的時(shí)鐘信號(hào)波形,既不像主器件1所期望的CLK1,也不像主器件2所期望的CLK2,而是兩者進(jìn)行邏輯與的結(jié)果(注意數(shù)據(jù)在SCL為高電平時(shí)有效,所以為SCL為低電平并不影響SDA仲裁)。

CLKI和CLK2的合成波形作為共同的同步時(shí)鐘信號(hào),一旦總線控制權(quán)裁定給某一主器件,則總線時(shí)鐘信號(hào)將會(huì)只由該主器件產(chǎn)生。

2 I2C總線死鎖

正常I2C通信肯定不會(huì)出現(xiàn)死鎖的,死鎖即是I2C在某一特殊時(shí)刻出現(xiàn)了異常。

死鎖的表現(xiàn):SCL一直為高,SDA一直為低

場(chǎng)景1:在寫階段的ACK階段,SDA被slave拉低作為ACK,master突然復(fù)位了,SCL也被復(fù)位為高電平,這樣:master檢查到SDA為低,會(huì)認(rèn)為I2C總線被占用,會(huì)一直等待SCL和SDA信號(hào)變?yōu)楦唠娖?,而slave不知道m(xù)aster異常復(fù)位,還在傻傻等待SCL拉低,然后結(jié)束ACK信號(hào),這樣master與slave互相等待,造成死鎖。

場(chǎng)景2:當(dāng)I2C進(jìn)行讀操作時(shí),slave應(yīng)答后輸出數(shù)據(jù),如果在這個(gè)時(shí)刻master異常復(fù)位而此時(shí)slave輸出的數(shù)據(jù)位正好為0,也會(huì)導(dǎo)致I2C總線進(jìn)入死鎖狀態(tài)。

總的說來:SDA為低時(shí),期待一個(gè)SCL的下降沿驅(qū)動(dòng),但是master由于異常復(fù)位導(dǎo)致SCL一直為高,這樣就產(chǎn)生了死鎖。

解決死鎖的方法:

最好用模擬I2C實(shí)現(xiàn),則不會(huì)死鎖

將從機(jī)的電源設(shè)計(jì)為可控,當(dāng)發(fā)生總線死鎖的時(shí)將從機(jī)復(fù)位

可以在從機(jī)的程序中加入監(jiān)測(cè)功能,如果總線長時(shí)間被拉低則釋放對(duì)總線的控制

在主機(jī)中增加I2C總線恢復(fù)程序。每次主機(jī)復(fù)位后,如果檢測(cè)到SDA被拉低,則控制SCL產(chǎn)生<=9個(gè)時(shí)鐘脈沖(針對(duì)8位數(shù)據(jù)的情況),每發(fā)送一個(gè)時(shí)鐘脈沖就檢測(cè)SDA是否被釋放,如果SDA已經(jīng)被釋放就再模擬產(chǎn)生一個(gè)停止信號(hào),這樣從機(jī)就可以完成被掛起的讀寫操作,從死鎖狀態(tài)中恢復(fù)過來。這種方法有一定的局限性,因?yàn)榇蟛糠种鳈C(jī)的I2C模塊由內(nèi)置的硬件電路來實(shí)現(xiàn),軟件并不能夠直接控制SCL信號(hào)模擬產(chǎn)生需要的時(shí)鐘脈沖。

1.5 I2C與SPI對(duì)比

I2C是單雙工(只有SDA一根數(shù)據(jù)線),標(biāo)準(zhǔn)SPI是全雙工(有MOSI和MISO兩根數(shù)據(jù)線)。

SPI沒有指定的流控制,沒有應(yīng)答機(jī)制確認(rèn)是否收到數(shù)據(jù)。

I2C時(shí)序很多方面規(guī)定死了(如:只支持8bit數(shù)據(jù),只支持優(yōu)先發(fā)送MSB,在SCL為高電平數(shù)據(jù)有效等),而SPI則更“靈活”。

2 軟件代碼

2.1 GPIO模擬I2C

2.2 Linux I2C

3 I2C擴(kuò)展

問題:兩個(gè)嵌入式芯片怎么通過I2C通信?

如果被控器需要延遲下一個(gè)數(shù)據(jù)字節(jié)開始傳送的時(shí)間,則可以通過把時(shí)鐘線SCL電平拉低并且保持,使主控器進(jìn)入等待狀態(tài)。一旦被控器釋放時(shí)鐘線,數(shù)據(jù)傳輸就得以繼續(xù)下去,這樣就使得被控器得到足夠時(shí)間轉(zhuǎn)移已經(jīng)收到的數(shù)據(jù)字節(jié),或者準(zhǔn)備好即將發(fā)送的數(shù)據(jù)字節(jié)。

帶有CPU的被控器在對(duì)收到的地址字節(jié)做出應(yīng)答之后,需要一定的時(shí)間去執(zhí)行中斷服務(wù)子程序,來分析或比較地址碼,其間就把SCL線鉗位在低電平上,直到處理妥當(dāng)后才釋放SCL線,進(jìn)而使主控器繼續(xù)后續(xù)數(shù)據(jù)字節(jié)的發(fā)送。(需要從機(jī)能夠拉住SCL,用gpio模擬較方便)

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
I2C
i2c- sda掛死分析
I2C和SPI總線對(duì)比
I2C總線傳輸協(xié)議
i2c通信的詳細(xì)講解
IIC總線
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服