串口是傳感器、外設(shè)常用的接口,在低速器件中可以通過串口傳輸數(shù)據(jù)。高速復(fù)雜的器件,往往內(nèi)部存在很多寄存器,這些寄存器的配置一般也是采用串口通信,可以節(jié)省IO口。
常用串口大致分為UART、IIC、SPI三種,其中IIC時序稍微復(fù)雜,卻是最好用的串行接口。如下圖所示,主機(jī)通過兩根數(shù)據(jù)線,就可以與多個外設(shè)通信。
圖1 主機(jī)控制多個外設(shè)
主機(jī)想要通過UART與N個外設(shè)雙向通信,一般需要2*N個IO口。主機(jī)想要通過SPI與N個外設(shè)雙向通信,一般需要使用N+3個IO口。而如果使用IIC接口,那么只需要2個IO口。
因此IIC對于節(jié)省IO有較大優(yōu)勢,劣勢在于UART可以全雙工通信,SPI的時鐘線與數(shù)據(jù)線分開,傳輸速度最快,且UART和SPI的驅(qū)動設(shè)計一般比較簡單。而IIC由于只靠兩根線驅(qū)動多個傳感器,所以需要確認(rèn)主機(jī)與哪個傳感器建立連接(傳輸器件地址),然后在對器件內(nèi)部寄存器進(jìn)行讀寫,導(dǎo)致通信速度不可能很高。
01I2C硬件接口
IIC主機(jī)或者從機(jī)的硬件接口如下圖所示,使用一個開漏/開集(如果是MOS管則漏極開路,如果是三極管則集電極開路)開路,在同一條線上有一個輸入緩沖區(qū),允許數(shù)據(jù)線用于雙向傳輸數(shù)據(jù)。
圖2 IIC硬件接口
三角形代表輸入緩沖器,準(zhǔn)確的說該接口只能通過FET輸出低電平,高電平依靠外部上拉電阻完成。
下圖是該接口輸出低電平的信號示意圖,當(dāng)需要輸出低電平時,F(xiàn)ET導(dǎo)通,VBUS下拉與GND連接,此時總線呈現(xiàn)低電平,如圖中紅色部分。
圖3 輸出低電平
當(dāng)從機(jī)或主機(jī)希望發(fā)送邏輯高電平時,只能通過關(guān)閉下拉場效應(yīng)管來釋放總線。使得總線浮動,上拉電阻將把電壓拉到電壓軌,表現(xiàn)為高電平。
圖4 輸出高電平
02I2C通信
IIC總線是一個標(biāo)準(zhǔn)的雙向接口,除非從機(jī)已被主機(jī)尋址,否則從機(jī)不能傳輸數(shù)據(jù)。IIC總線上的每個設(shè)備都有一個特定的設(shè)備地址,以區(qū)分同一IIC總線上的其他設(shè)備。許多從設(shè)備在啟動時需要配置來設(shè)置設(shè)備的行為,通常是在主機(jī)訪問從機(jī)的內(nèi)部寄存器時完成。
物理IIC接口由串行時鐘(SCL)和串行數(shù)據(jù)(SDA)線組成,SDA和SCL線路都必須通過上拉電阻連接到VCC。只有當(dāng)總線空閑時才可以開始數(shù)據(jù)傳輸,如果SDA和SCL線在停止條件后都為高電平,則總線空閑。
先總體看下經(jīng)典的IIC讀、寫器件寄存器時序,然后在具體分析起始位、停止位、應(yīng)答、傳輸數(shù)據(jù)的SCL和SDA波形。
下圖是主機(jī)通過IIC寫從機(jī)寄存器數(shù)據(jù)的步驟,首先主機(jī)向從機(jī)發(fā)送起始位,然后發(fā)送7位從機(jī)器件地址,之后會發(fā)送一位讀寫操作信號,從機(jī)應(yīng)答主機(jī)(ACK為低電平)后,向從機(jī)發(fā)送寄存器地址(這個寄存器地址為8位,但是有的器件可能會有16位或者24位寄存器地址,就需要發(fā)送三次這種時序)。等待從機(jī)應(yīng)答之后,主機(jī)把需要寫入寄存器的數(shù)據(jù)輸出,等待從機(jī)應(yīng)答后,主機(jī)發(fā)送停止條件,結(jié)束本次通信。注意不管是器件地址還是寄存器地址,亦或者是數(shù)據(jù),都是先傳輸高位數(shù)據(jù)。
圖5 IIC主機(jī)向從機(jī)寄存器寫入數(shù)據(jù)
上圖中灰色方塊表示主機(jī)發(fā)送數(shù)據(jù),白色表示從機(jī)發(fā)送數(shù)據(jù)。
下圖是主機(jī)通過IIC讀取從機(jī)寄存器數(shù)據(jù)的步驟,主機(jī)依次向從機(jī)發(fā)送起始位、器件地址、寄存器地址,等待從機(jī)應(yīng)答之后,在次向從機(jī)發(fā)送起始信號,然后發(fā)送器件地址,此時讀寫位位高電平,表示讀出數(shù)據(jù),然后從機(jī)就會把該器件該寄存器地址的數(shù)據(jù)依次輸出,數(shù)據(jù)接收完成后,主機(jī)向從機(jī)發(fā)送不應(yīng)答指令(如果發(fā)送應(yīng)答指令,則從機(jī)會把下個寄存器地址的數(shù)據(jù)繼續(xù)輸出到總線上,實(shí)現(xiàn)連續(xù)讀取寄存器數(shù)據(jù)),然后發(fā)送停止位,完成寄存器數(shù)據(jù)的讀取。
圖6 IIC主機(jī)向從機(jī)寄存器讀出數(shù)據(jù)
上圖中灰色方塊表示主機(jī)發(fā)送數(shù)據(jù),白色表示從機(jī)發(fā)送數(shù)據(jù)。
在了解了讀寫寄存器的步驟后,在來查看IIC的一些細(xì)節(jié)時序,由于主機(jī)和從機(jī)都會在時鐘SCL的高電平采集SDA的狀態(tài),因此在傳輸數(shù)據(jù)時,SDA在SCL的低電平的時候更新數(shù)據(jù),在SCL高電平階段盡量保持不變。
只有兩種情況,SDA會在SCL的高電平期間電平發(fā)生變化,即起始位和停止位,時序圖如下所示:
圖7 IIC通信的起始位和停止位時序圖
起始位:SCL為高電平,SDA從高電平變?yōu)榈碗娖奖硎酒鹗嘉唬ㄒ驗(yàn)榭臻e時SDA是高電平,SDA變?yōu)榈碗娖酱黹_始傳輸數(shù)據(jù))。
停止位:SCL為高電平時,SDA從低電平變?yōu)楦唠娖奖硎就V刮弧?/p>
重復(fù)起始條件(圖6中紅色字體的時序):時序與起始條件一樣,用于代替連續(xù)的停止然后開始條件。當(dāng)總線未空閑時,主機(jī)希望啟動新的通信,但不希望發(fā)送停止信號釋放總線,就可以直接發(fā)送重復(fù)起始條件,開啟信號通信。因?yàn)橥V箺l件有可能使主機(jī)失去對總線的控制(在多主機(jī)環(huán)境中)。
如圖8所示,在SCL的每個時鐘脈沖期間傳輸一個數(shù)據(jù)位,每次傳輸8位數(shù)據(jù)后需要從機(jī)應(yīng)。8位數(shù)據(jù)可以是設(shè)備地址、寄存器地址,也可以是寫入或讀取從機(jī)的數(shù)據(jù)。
數(shù)據(jù)首先傳輸最高有效位(MSB)。在START和STOP條件之間,可以將任意字節(jié)的數(shù)據(jù)從主機(jī)傳輸?shù)綇臋C(jī)。在傳輸數(shù)據(jù)過程中SDA必須在SCL低電平時更新狀態(tài),在SCL為高電平時SDA線上的數(shù)據(jù)必須保持穩(wěn)定,因?yàn)楫?dāng)SCL高時,SDA的變化被解釋為控制命令(START或STOP)。
圖8 單字節(jié)數(shù)據(jù)傳輸時序圖
每個字節(jié)(包括地址字節(jié))后面都有一個來自接收方的ACK位,ACK位允許接收方與發(fā)送方通信,表明該字節(jié)已成功接收,并且可以發(fā)送下一個字節(jié)數(shù)據(jù)。
在接收方發(fā)送ACK之前,發(fā)送方必須釋放SDA線。如下圖9所示,為了發(fā)送ACK位,接收方需要在ACK/NACK相關(guān)時鐘周期(周期9)的低電平期間拉低SDA線,使SDA線在ACK/ NACK相關(guān)時鐘周期的高相位穩(wěn)定在低電平。設(shè)置和保持時間必須考慮在內(nèi)。
圖9 NACK波形
當(dāng)SDA在與ACK/NACK相關(guān)的時鐘周期內(nèi)保持高位時,則不應(yīng)答(NACK)。有幾個條件會導(dǎo)致NACK的產(chǎn)生:
從機(jī)無法接收或發(fā)送,因?yàn)樗趫?zhí)行一些實(shí)時功能,還沒有準(zhǔn)備好開始與主機(jī)通信。
在傳輸過程中,接收方接收到它不理解的數(shù)據(jù)或命令。
在傳輸過程中,接收方不能再接收任何數(shù)據(jù)字節(jié)。
主機(jī)讀取從機(jī)寄存器數(shù)據(jù)后,通過NACK表示終止從機(jī)寄存器數(shù)據(jù)的讀取。
03總結(jié)
IIC接口是開漏/開集輸出的硬件接口,只能主動輸出低電平。當(dāng)需要輸出高電平時,會釋放總線(對外表現(xiàn)高阻態(tài)),被外部上拉電阻上拉到VCC,從而實(shí)現(xiàn)高電平,所以上拉電阻必須存在。
SDA在傳輸數(shù)據(jù)時只能在SCL的低電平期間變化,如果SCL為高電平,SDA從高電平變?yōu)榈碗娖?,則表示起始位或者重復(fù)起始位,SDA從低電平變?yōu)楦唠娖絼t便是停止位。
每當(dāng)傳輸一字節(jié)數(shù)據(jù)后,接收方需要產(chǎn)生一個應(yīng)答位(ACK低電平表示應(yīng)答),之后發(fā)送方才能傳輸下一字節(jié)數(shù)據(jù)。
在起始位和停止位之間,可以傳輸任意字節(jié)數(shù)據(jù),數(shù)據(jù)可以是器件地址、寄存器地址、寫入或讀取從機(jī)的數(shù)據(jù)。
上述的總結(jié)來自于TI的IIC總線手冊,需要該手冊的可以在公眾號后臺回復(fù)“I2C手冊”(不包括引號)。
聲明:本文轉(zhuǎn)載自數(shù)字站公眾號
-
傳感器
+關(guān)注
關(guān)注
2552文章
51272瀏覽量
755045 -
寄存器
+關(guān)注
關(guān)注
31文章
5358瀏覽量
120771 -
I2C
+關(guān)注
關(guān)注
28文章
1490瀏覽量
124080 -
串口
+關(guān)注
關(guān)注
14文章
1557瀏覽量
76711 -
IIC總線
+關(guān)注
關(guān)注
1文章
66瀏覽量
20330
原文標(biāo)題:I2C基礎(chǔ)協(xié)議詳解
文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論