《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > Linux教學(xué)——帶你快速對比SPI、UART,、I2C通信的區(qū)別與應(yīng)用,!

Linux教學(xué)——帶你快速對比SPI、UART,、I2C通信的區(qū)別與應(yīng)用,!

2022-08-17
作者:電子技術(shù)應(yīng)用專欄作家 一口Linux
來源:電子技術(shù)應(yīng)用專欄作家 一口Linux
關(guān)鍵詞: SPI UART I2C

  電子設(shè)備之間的通信就像人類之間的交流,雙方都需要說相同的語言,。在電子產(chǎn)品中,,這些語言稱為通信協(xié)議,。

  之前有單獨(dú)地分享了SPIUART,、I2C通信的文章,,這篇對它們做一些對比。

  串行 VS 并行

  電子設(shè)備通過發(fā)送數(shù)據(jù)位從而實(shí)現(xiàn)相互交談,。位是二進(jìn)制的,,只能是1或0。通過電壓的快速變化,,位從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備,。在以5V工作的系統(tǒng)中,“0”通過0V的短脈沖進(jìn)行通信,,而“1”通過5V的短脈沖進(jìn)行通信,。

  數(shù)據(jù)位可以通過并行或串行的形式進(jìn)行傳輸。另外也可以通過此視頻了解:視頻講解UART,、I2C,、SPI串口通信。在并行通信中,,數(shù)據(jù)位在導(dǎo)線上同時(shí)傳輸,。下圖顯示了二進(jìn)制(01000011)中字母“C”的并行傳輸:

  微信圖片_20220817162140.png

  在串行通信中,位通過單根線一一發(fā)送,。下圖顯示了二進(jìn)制(01000011)中字母“C”的串行傳輸:

  微信圖片_20220817162150.png

  SPI通信

  SPI是一種常見的設(shè)備通用通信協(xié)議,。它有一個(gè)獨(dú)特優(yōu)勢就是可以無中斷傳輸數(shù)據(jù),可以連續(xù)地發(fā)送或接收任意數(shù)量的位,。而在I2C和UART中,,數(shù)據(jù)以數(shù)據(jù)包的形式發(fā)送,有著限定位數(shù),。

  在SPI設(shè)備中,,設(shè)備分為主機(jī)與從機(jī)系統(tǒng)。主機(jī)是控制設(shè)備(通常是微控制器),,而從機(jī)(通常是傳感器,,顯示器或存儲(chǔ)芯片)從主機(jī)那獲取指令。

  一套SPI通訊共包含四種信號(hào)線:MOSI (Master Output/Slave Input) – 信號(hào)線,,主機(jī)輸出,,從機(jī)輸入。MISO (Master Input/Slave Output) – 信號(hào)線,,主機(jī)輸入,,從機(jī)輸出。SCLK (Clock) – 時(shí)鐘信號(hào)。SS/CS (Slave Select/Chip Select) – 片選信號(hào),。

  微信圖片_20220817162205.png

  SPI協(xié)議特點(diǎn)

  實(shí)際上,,從機(jī)的數(shù)量受系統(tǒng)負(fù)載電容的限制,它會(huì)降低主機(jī)在電壓電平之間準(zhǔn)確切換的能力,。

  時(shí)鐘信號(hào)

  每個(gè)時(shí)鐘周期傳輸一位數(shù)據(jù),,因此數(shù)據(jù)傳輸?shù)乃俣热Q于時(shí)鐘信號(hào)的頻率。 時(shí)鐘信號(hào)由于是主機(jī)配置生成的,,因此SPI通信始終由主機(jī)啟動(dòng),。

  設(shè)備共享時(shí)鐘信號(hào)的任何通信協(xié)議都稱為同步。SPI是一種同步通信協(xié)議,,還有一些異步通信不使用時(shí)鐘信號(hào),。 例如在UART通信中,雙方都設(shè)置為預(yù)先配置的波特率,,該波特率決定了數(shù)據(jù)傳輸?shù)乃俣群蜁r(shí)序,。

  片選信號(hào)

  主機(jī)通過拉低從機(jī)的CS/SS來使能通信。 在空閑/非傳輸狀態(tài)下,,片選線保持高電平,。在主機(jī)上可以存在多個(gè)CS/SS引腳,允許主機(jī)與多個(gè)不同的從機(jī)進(jìn)行通訊,。

  微信圖片_20220817162234.png

  如果主機(jī)只有一個(gè)片選引腳可用,,則可以通過以下方式連接這些從器件:

  微信圖片_20220817162435.png

       MOSI和MISO

  主機(jī)通過MOSI以串行方式將數(shù)據(jù)發(fā)送給從機(jī),從機(jī)也可以通過MISO將數(shù)據(jù)發(fā)送給主機(jī),,兩者可以同時(shí)進(jìn)行,。所以理論上,SPI是一種全雙工的通訊協(xié)議,。

  傳輸步驟

  1. 主機(jī)輸出時(shí)鐘信號(hào)

 微信截圖_20220817162514.png

  使用SPI有一些優(yōu)點(diǎn)和缺點(diǎn),,如果在不同的通信協(xié)議之間進(jìn)行選擇,則應(yīng)根據(jù)項(xiàng)目要求進(jìn)行充分考量,。

  SPI優(yōu)點(diǎn)

  SPI通訊無起始位和停止位,,因此數(shù)據(jù)可以連續(xù)流傳輸而不會(huì)中斷;沒有像I2C這樣的復(fù)雜的從站尋址系統(tǒng),,數(shù)據(jù)傳輸速率比I2C更高(幾乎快兩倍),。獨(dú)立的MISO和MOSI線路,可以同時(shí)發(fā)送和接收數(shù)據(jù),。

  SPI缺點(diǎn)

  SPI使用四根線(I2C和UART使用兩根線),,沒有信號(hào)接收成功的確認(rèn)(I2C擁有此功能),沒有任何形式的錯(cuò)誤檢查(如UART中的奇偶校驗(yàn)位等),。

  微信圖片_20220817162729.png

  UART代表通用異步接收器/發(fā)送器也稱為串口通訊,它不像SPI和I2C這樣的通信協(xié)議,而是微控制器中的物理電路或獨(dú)立的IC,。

  UART的主要目的是發(fā)送和接收串行數(shù)據(jù),,其最好的優(yōu)點(diǎn)是它僅使用兩條線在設(shè)備之間傳輸數(shù)據(jù)。UART的原理很容易理解,,但是如果您還沒有閱讀SPI 通訊協(xié)議,,那可能是一個(gè)不錯(cuò)的起點(diǎn)。

  UART通信

  在UART通信中,,兩個(gè)UART直接相互通信,。相關(guān)實(shí)例:按下按鍵,通過串口發(fā)送數(shù)據(jù)實(shí)例,。發(fā)送UART將控制設(shè)備(如CPU)的并行數(shù)據(jù)轉(zhuǎn)換為串行形式,,以串行方式將其發(fā)送到接收UART。只需要兩條線即可在兩個(gè)UART之間傳輸數(shù)據(jù),,數(shù)據(jù)從發(fā)送UART的Tx引腳流到接收UART的Rx引腳:

  微信圖片_20220817162754.png

  UART屬于異步通訊,,這意味著沒有時(shí)鐘信號(hào),取而代之的是在數(shù)據(jù)包中添加開始和停止位,。這些位定義了數(shù)據(jù)包的開始和結(jié)束,,因此接收UART知道何時(shí)讀取這些數(shù)據(jù)。

  當(dāng)接收UART檢測到起始位時(shí),,它將以特定波特率的頻率讀取,。波特率是數(shù)據(jù)傳輸速度的度量,以每秒比特?cái)?shù)(bps)表示,。兩個(gè)UART必須以大約相同的波特率工作,,發(fā)送和接收UART之間的波特率只能相差約10%。

  微信截圖_20220817162815.png

  UART工作原理

  發(fā)送UART從數(shù)據(jù)總線獲取并行數(shù)據(jù)后,,它會(huì)添加一個(gè)起始位,,一個(gè)奇偶校驗(yàn)位和一個(gè)停止位來組成數(shù)據(jù)包并從Tx引腳上逐位串行輸出,接收UART在其Rx引腳上逐位讀取數(shù)據(jù)包,。

  微信圖片_20220817162903.png

  UART數(shù)據(jù)包含有1個(gè)起始位,,5至9個(gè)數(shù)據(jù)位(取決于UART),一個(gè)可選的奇偶校驗(yàn)位以及1個(gè)或2個(gè)停止位:

  微信圖片_20220817162914.png

  起始位:

  UART數(shù)據(jù)傳輸線通常在不傳輸數(shù)據(jù)時(shí)保持在高電壓電平,。開始傳輸時(shí)發(fā)送UART在一個(gè)時(shí)鐘周期內(nèi)將傳輸線從高電平拉低到低電平,,當(dāng)接收UART檢測到高電壓到低電壓轉(zhuǎn)換時(shí),它開始以波特率的頻率讀取數(shù)據(jù)幀中的位,。

  數(shù)據(jù)幀:

  數(shù)據(jù)幀內(nèi)包含正在傳輸?shù)膶?shí)際數(shù)據(jù),。如果使用奇偶校驗(yàn)位,則可以是5位,,最多8位,。如果不使用奇偶校驗(yàn)位,,則數(shù)據(jù)幀的長度可以為9位。

  校驗(yàn)位:

  奇偶校驗(yàn)位是接收UART判斷傳輸期間是否有任何數(shù)據(jù)更改的方式,。接收UART讀取數(shù)據(jù)幀后,,它將對值為1的位數(shù)進(jìn)行計(jì)數(shù),并檢查總數(shù)是偶數(shù)還是奇數(shù),,是否與數(shù)據(jù)相匹配,。

  停止位:

  為了向數(shù)據(jù)包的結(jié)尾發(fā)出信號(hào),發(fā)送UART將數(shù)據(jù)傳輸線從低電壓驅(qū)動(dòng)到高電壓至少持續(xù)兩位時(shí)間,。

  傳輸步驟

  微信截圖_20220817163231.png

 微信截圖_20220817163254.png

  沒有任何通信協(xié)議是完美的,,但是UART非常擅長于其工作。以下是一些利弊,,可幫助您確定它們是否適合您的項(xiàng)目需求:

  優(yōu)點(diǎn)

  僅使用兩根電線

  無需時(shí)鐘信號(hào)

  具有奇偶校驗(yàn)位以允許進(jìn)行錯(cuò)誤檢查

  只要雙方都設(shè)置好數(shù)據(jù)包的結(jié)構(gòu)

  有據(jù)可查并得到廣泛使用的方法

  缺點(diǎn)

  數(shù)據(jù)幀的大小最大為9位

  不支持多個(gè)從屬系統(tǒng)或多個(gè)主系統(tǒng)

  每個(gè)UART的波特率必須在彼此的10%之內(nèi)

  I2C通信

  I2C總線是由Philips公司開發(fā)的一種簡單,、雙向二線制同步串行總線。相關(guān)文章:STM32開發(fā)中使用C語言實(shí)現(xiàn)IIC驅(qū)動(dòng),。它只需要兩根線即可傳送信息,。它結(jié)合了 SPI 和 UART 的優(yōu)點(diǎn),您可以將多個(gè)從機(jī)連接到單個(gè)主機(jī)(如SPI那樣),,也可以使用多個(gè)主機(jī)控制一個(gè)或多個(gè)從機(jī),。當(dāng)您想讓多個(gè)微控制器將數(shù)據(jù)記錄到單個(gè)存儲(chǔ)卡或?qū)⑽谋撅@示到單個(gè)LCD時(shí),這將非常有用,。

  微信圖片_20220817163714.png

  SDA (Serial Data) – 數(shù)據(jù)線,。

  SCL (Serial Clock) – 時(shí)鐘線。

  I2C是串行通信協(xié)議,,因此數(shù)據(jù)沿著SDA一點(diǎn)一點(diǎn)地傳輸,。與SPI一樣,I2C也需要時(shí)鐘同步信號(hào)且時(shí)鐘始終由主機(jī)控制,。

  微信圖片_20220817163727.png

  工作原理

  I2C的數(shù)據(jù)傳輸是以多個(gè)msg的形式進(jìn)行,,每個(gè)msg都包含從機(jī)的二進(jìn)制地址幀,以及一個(gè)或多個(gè)數(shù)據(jù)幀,,還包括開始條件和停止條件,,讀/寫位和數(shù)據(jù)幀之間的ACK / NACK位:

微信圖片_20220817163738.png

  啟動(dòng)條件:當(dāng)SCL是高電平時(shí),SDA從高電平向低電平切換,。

  停止條件:當(dāng)SCL是高電平時(shí),,SDA由低電平向高電平切換。

  微信圖片_20220817164018.png

  地址幀:每個(gè)從屬設(shè)備唯一的7位或10位序列,,用于主從設(shè)備之間的地址識(shí)別,。

  讀/寫位:一位,如果主機(jī)是向從機(jī)發(fā)送數(shù)據(jù)則為低電平,,請求數(shù)據(jù)則為高電平,。

  ACK/NACK:消息中的每個(gè)幀后均帶有一個(gè)ACK/NACK位,。如果成功接收到地址幀或數(shù)據(jù)幀,接收設(shè)備會(huì)返回一個(gè)ACK位用于表示確認(rèn),。

  尋址

  由于I2C沒有像SPI那樣的片選線,,因此它需要使用另一種方式來確認(rèn)某一個(gè)從設(shè)備,而這個(gè)方式就是 —— 尋址 ,。

  主機(jī)將要通信的從機(jī)地址發(fā)送給每個(gè)從機(jī),然后每個(gè)從機(jī)將其與自己的地址進(jìn)行比較,。如果地址匹配,,它將向主機(jī)發(fā)送一個(gè)低電平ACK位。如果不匹配,,則不執(zhí)行任何操作,,SDA線保持高電平。

  讀/寫位

  地址幀的末尾包含一個(gè)讀/寫位,。如果主機(jī)要向從機(jī)發(fā)送數(shù)據(jù),,則為低電平。如果是主機(jī)向從機(jī)請求數(shù)據(jù),,則為高電平,。

  數(shù)據(jù)幀

  當(dāng)主機(jī)檢測到從機(jī)的ACK位后,就可以發(fā)送第一個(gè)數(shù)據(jù)幀了,。數(shù)據(jù)幀始終為8位,,每個(gè)數(shù)據(jù)幀后緊跟一個(gè)ACK / NACK位,來驗(yàn)證接收狀態(tài),。當(dāng)發(fā)送完所有數(shù)據(jù)幀后,,主機(jī)可以向從機(jī)發(fā)送停止條件來終止通信。

  傳輸步驟

  1. 在SCL線為高電平時(shí),,主機(jī)通過將SDA線從高電平切換到低電平來啟動(dòng)總線通信,。

  2. 主機(jī)向總線發(fā)送要與之通信的從機(jī)的7位或10位地址,以及讀/寫位:

  微信圖片_20220817164054.png

  3. 每個(gè)從機(jī)將主機(jī)發(fā)送的地址與其自己的地址進(jìn)行比較,。如果地址匹配,,則從機(jī)通過將SDA線拉低一位返回一個(gè)ACK位。如果主機(jī)的地址與從機(jī)的地址不匹配,,則從機(jī)將SDA線拉高,。

微信圖片_20220817164106.png

  4. 主機(jī)發(fā)送或接收數(shù)據(jù)幀:

  微信圖片_20220817164119.png

  5. 傳輸完每個(gè)數(shù)據(jù)幀后,接收設(shè)備將另一個(gè)ACK位返回給發(fā)送方,,以確認(rèn)已成功接收到該幀:

  微信圖片_20220817164131.png

  6. 隨后主機(jī)將SCL切換為高電平,,然后再將SDA切換為高電平,從而向從機(jī)發(fā)送停止條件,。

  單個(gè)主機(jī)VS多個(gè)從機(jī)

  由于I2C使用尋址功能,,可以通過一個(gè)主機(jī)控制多個(gè)從機(jī),。使用7位地址時(shí),最多可以使用128(27)個(gè)唯一地址,。使用10位地址并不常見,,但可以提供1,024(210)個(gè)唯一地址。如果要將多個(gè)從機(jī)連接到單個(gè)主機(jī)時(shí),,請使用4.7K歐的上拉電阻將它們連接,,例如將SDA和SCL線連接到Vcc:

微信圖片_20220817164148.png

  多個(gè)主機(jī)VS多個(gè)從機(jī)

  I2C支持多個(gè)主機(jī)同時(shí)與多個(gè)從機(jī)相連,當(dāng)兩個(gè)主機(jī)試圖通過SDA線路同時(shí)發(fā)送或接收數(shù)據(jù)時(shí),,就會(huì)出現(xiàn)問題,。因此每個(gè)主機(jī)都需要在發(fā)送消息之前檢測SDA線是低電平還是高電平。如果SDA線為低電平,,則意味著另一個(gè)主機(jī)正在控制總線,。如果SDA線高,則可以安全地發(fā)送數(shù)據(jù),。如果要將多個(gè)主機(jī)連接到多個(gè)從機(jī),,請使用4.7K歐的上拉電阻將SDA和SCL線連接到Vcc:

  微信圖片_20220817164210.png

  與其他協(xié)議相比,I2C可能聽起來很復(fù)雜,。以下是一些利弊,,可幫助您確定它們是否適合您的項(xiàng)目需求:

  I2C優(yōu)點(diǎn)

  僅使用兩根電線

  支持多個(gè)主機(jī)和多個(gè)從機(jī)

  每個(gè)UART的波特率必須在彼此的10%之內(nèi)

  硬件比UART更簡單

  眾所周知且被廣泛使用的協(xié)議

  I2C缺點(diǎn)

  數(shù)據(jù)傳輸速率比SPI慢

  數(shù)據(jù)幀的大小限制為8位


  更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<

微信圖片_20210517164139.jpg

微信圖片_20220701092006.jpg

電子技術(shù)應(yīng)用專欄作家 一口Linux

原文鏈接:https://mp.weixin.qq.com/s/m-CNG1R1LBtXA9fEy6G1Eg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。