在電子通信領(lǐng)域,串口通信是一種常見且重要的通信方式,其中 UART、I2C、SPI 三種通信方式應(yīng)用廣泛。下面我們將詳細(xì)探討這三種串口通信的原理、特點(diǎn)及應(yīng)用。
串行通信是指數(shù)據(jù)位通過單根線一一發(fā)送。例如,二進(jìn)制 (01000011) 中字母 “C” 的串行傳輸,當(dāng)時(shí)鐘線為高電平時(shí),接收數(shù)據(jù)位,高電平代表 1,低電平代表 0。而并行通信則是數(shù)據(jù)位在導(dǎo)線中同時(shí)傳輸,同樣以字母 “C” 的二進(jìn)制 (01000011) 為例,當(dāng)時(shí)鐘線為高電平時(shí),8 個(gè)數(shù)據(jù)位同時(shí)接受數(shù)據(jù),高電平為 1,低電平為 0。UART、SPI、I2C 都屬于串口通信,因?yàn)樗鼈兙ㄟ^一根線作為數(shù)據(jù)線傳輸數(shù)據(jù)。
全雙工通信就像我們打電話時(shí)可以同時(shí)說話,雙方能夠在同一時(shí)間進(jìn)行雙向數(shù)據(jù)傳輸。UART 和 SPI 采用的就是全雙工通信方式,它們擁有兩根數(shù)據(jù)線,可實(shí)現(xiàn)同一時(shí)間 A 向 B 發(fā)送數(shù)據(jù),B 也能向 A 發(fā)送數(shù)據(jù)。半雙工通信雖然也能實(shí)現(xiàn)雙向通信,但同一時(shí)間只能進(jìn)行單方向的數(shù)據(jù)傳輸。例如 I2C 通信,由于只有一根數(shù)據(jù)線,所以無(wú)法在同一時(shí)間進(jìn)行雙向數(shù)據(jù)傳輸。
同步通信是阻塞模式,發(fā)送方發(fā)出數(shù)據(jù)后,需等待接收方發(fā)回響應(yīng)后才會(huì)發(fā)送下一個(gè)數(shù)據(jù)包。而異步通信是非阻塞模式,發(fā)送方發(fā)出數(shù)據(jù)后,無(wú)需等待接收方的響應(yīng),即可接著發(fā)送下一個(gè)數(shù)據(jù)包。SPI 和 I2C 屬于同步通信,因?yàn)樗鼈兌加袝r(shí)鐘線;UART 則是異步通信方式,它只有兩個(gè)數(shù)據(jù)線,發(fā)送完數(shù)據(jù)后不會(huì)確認(rèn)接收方是否接收到。
SPI 可以無(wú)中斷地連續(xù)發(fā)送或接收任意數(shù)量的位,而 I2C 和 UART 的數(shù)據(jù)是以數(shù)據(jù)包形式發(fā)送,且位數(shù)有限。在 SPI 設(shè)備中,分為主機(jī)控制設(shè)備(通常是微控制器)和從機(jī)設(shè)備(通常是傳感器、顯示器和存儲(chǔ)芯片),從機(jī)從主機(jī)獲取指令。SPI 信號(hào)線有四種:MOSI(主機(jī)輸出,從機(jī)輸入)、MISO(主機(jī)輸入,從機(jī)輸出)、SCLK(時(shí)鐘信號(hào))、SS/CS(片選信號(hào))。
SPI 通信的特點(diǎn)在于其數(shù)據(jù)傳輸速度取決于時(shí)鐘信號(hào)的頻率,且始終由主機(jī)啟動(dòng)。主機(jī)通過拉低從機(jī)的 CS/SS 來使能通信,并且可以通過多個(gè) CS/SS 引腳與多個(gè)從機(jī)進(jìn)行通信。SPI 的優(yōu)點(diǎn)是無(wú)起始位和停止位,數(shù)據(jù)可持續(xù)傳輸,傳輸速率快,且獨(dú)立的 MISO、MOSI 可同時(shí)收發(fā)數(shù)據(jù);缺點(diǎn)是使用四根線,沒有信號(hào)接收成功的確認(rèn),也沒有錯(cuò)誤檢查機(jī)制。
UART 是異步通信,僅需兩條線即可在兩個(gè) UART 之間傳輸信息。它會(huì)在數(shù)據(jù)包中增加開始和停止位,以定義數(shù)據(jù)包的起始和結(jié)束,接收方通過檢測(cè)起始位來確定何時(shí)讀取數(shù)據(jù)。UART 數(shù)據(jù)包包含起始位、5 到 9 個(gè)數(shù)據(jù)位(取決于 UART)、可選擇的奇偶檢驗(yàn)位以及一個(gè)或兩個(gè)停止位。
UART 的工作原理是發(fā)送 UART 從數(shù)據(jù)總線并行接收數(shù)據(jù),然后添加起始位、奇偶校驗(yàn)位和停止位,將整個(gè)數(shù)據(jù)包串行發(fā)送到接收 UART。接收 UART 以預(yù)先配置的波特率對(duì)數(shù)據(jù)線進(jìn)行采樣,丟棄起始位、奇偶校驗(yàn)位和停止位,再將串行數(shù)據(jù)轉(zhuǎn)換回并行數(shù)據(jù)并傳輸?shù)浇邮斩说臄?shù)據(jù)總線。UART 的優(yōu)點(diǎn)是僅使用兩根線,異步通信無(wú)需時(shí)鐘信號(hào),具有奇偶校驗(yàn)位可進(jìn)行錯(cuò)誤檢查,且只要雙方設(shè)置好數(shù)據(jù)包結(jié)構(gòu)即可;缺點(diǎn)是數(shù)據(jù)幀大小為 9 位,不支持多個(gè)從屬系統(tǒng)或多個(gè)系統(tǒng),每個(gè) UART 的波特率必須在彼此的 10% 之內(nèi)。
I2C 是半雙工通信,結(jié)合了 SPI 和 UART 的優(yōu)點(diǎn),可將多個(gè)從機(jī)連接到單個(gè)主機(jī),也可實(shí)現(xiàn)多個(gè)主機(jī)控制一個(gè)或多個(gè)從機(jī)。它使用 SDA(數(shù)據(jù)線)和 SCL(時(shí)鐘線),屬于串行通信協(xié)議,需要時(shí)鐘同步信號(hào)且由主機(jī)控制。
I2C 的數(shù)據(jù)傳輸以多個(gè) msg 的形式進(jìn)行,每個(gè) msg 包括從機(jī)二進(jìn)制地址幀、一個(gè)或多個(gè)數(shù)據(jù)幀、開始條件、停止條件、讀 / 寫位和 ACK/NACK 位。啟動(dòng)條件是當(dāng) SCL 為高電平時(shí),SDA 從高電平向低電平切換;停止條件是當(dāng) SCL 為高電平時(shí),SDA 由低電平向高電平切換。I2C 的優(yōu)點(diǎn)是僅使用兩根線,支持多個(gè)主機(jī)和從機(jī),硬件比 UART 更簡(jiǎn)單;缺點(diǎn)是數(shù)據(jù)傳輸比 SPI 慢,數(shù)據(jù)幀大小限制為 8 位。
綜上所述,在不同的應(yīng)用場(chǎng)景中,我們可以根據(jù)具體需求選擇合適的通信方式。例如,在對(duì)數(shù)據(jù)傳輸速度要求較高且對(duì)成本不太敏感的情況下,可選擇 SPI 通信;在需要簡(jiǎn)單的異步通信且對(duì)數(shù)據(jù)幀大小要求不高時(shí),UART 是不錯(cuò)的選擇;而當(dāng)需要連接多個(gè)設(shè)備且對(duì)硬件復(fù)雜度有要求時(shí),I2C 則更為合適。了解和掌握這些通信方式,對(duì)于電子工程師和相關(guān)技術(shù)人員來說至關(guān)重要。