SPI、I2C、UART 三种串行总线对比介绍
轉(zhuǎn)載自https://blog.csdn.net/oqqHuTu12345678/article/details/65445338
參考博客
https://blog.csdn.net/xiaodingqq/article/details/80342459
https://blog.csdn.net/weiqifa0/article/details/8845281
https://www.zhihu.com/question/22632011
http://www.360doc.cn/article/13253385_330564821.html
https://blog.csdn.net/zhuyongxin_6688/article/details/78001767(有圖,薦)
https://blog.csdn.net/Setul/article/details/78968242
目錄
一、名字
二、UART、SPI、I2C對比
三、串行外設(shè)接口:SPI
1、速覽點
2、數(shù)據(jù)傳輸
3、spi讀寫
四、IC之間總線:I2C
1、速覽點
2、詳細(xì)介紹
3、時序
4、代碼
五、通用異步收發(fā)器:UART
1、速覽點
2、通信協(xié)議
3、詳細(xì)介紹
4、代碼學(xué)習(xí)
六、心得體會
1、通信接口分為物理層(硬件)和協(xié)議層
2、關(guān)于總線的選擇問題
七、UART和RS232的聯(lián)系和區(qū)別
1、RS232
2、UART
3、TTL和RS232
4、嵌入式常用串口實物圖
一、名字
- SPI(Serial Peripheral Interface:串行外設(shè)接口),是Motorola公司提出的一種同步串行數(shù)據(jù)傳輸標(biāo)準(zhǔn)。
- I2C(INTER IC BUS:IC之間總線),是由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備,是微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn)。
- UART(Universal Asynchronous Receiver Transmitter:通用異步收發(fā)器),是電腦硬件的一部分,它把將要傳輸?shù)馁Y料在串行通信與并行通信之間加以轉(zhuǎn)換,UART通常被集成于其他通訊接口的連接上。UART即我們通常說的“串口”。
?
二、UART、SPI、I2C對比
| 對比項 | ? ? ? ? ?UART | ? ? ? ? ? ? ? ? ? ? ?SPI | ? ? ? ? ? ? I2C |
| 信號線數(shù)目 | 3根,RX、TX、GND | 4根,SDO、SDI、SCLK、SS | 2根,SDA、SCLK |
| 設(shè)備從屬關(guān)系 | ? ? ? ? ? ?—— | 存在主從設(shè)備。SPI用片選信號選擇從機? | 存在主從設(shè)備。IIC用地址選擇從機。 |
| 通信方式 | 全雙工通信 | 全雙工通信 | 半雙工通信 |
| 通信速率 | 速度慢 | 比I2C總線要快,速度可達到幾Mbps | I2C的速度比SPI慢 |
| 應(yīng)用領(lǐng)域 | 1、UART常用于控制計算機與串行設(shè)備的芯片 2、就是我們經(jīng)常所說的串口,基本都用于調(diào)試。 | 主要應(yīng)用在EEPROM,FLASH,實時時鐘,AD轉(zhuǎn)換器,還有數(shù)字信號處理器和數(shù)字信號解碼器之間 | I2C一般是用在同一個板子上的2個IC之間的通信 ,它可以替代標(biāo)準(zhǔn)的并行總線,連接各種集成電路和功能模塊。 |
| 傳輸距離 | ? | ? | I2C需要有雙向IO的支持,而且使用上拉電阻,抗干擾能力較弱,一般用于同一板卡上芯片之間的通信,較少用于遠(yuǎn)距離通信 |
| 通信特征 | 異步,一幀可以傳5/6/7/8位 | 同步,SPI允許數(shù)據(jù)一位一位的傳送,甚至允許暫停。從最高位開始傳。 | 同步,電平信號,一次連續(xù)8bit。從最高位開始傳 |
| 協(xié)議復(fù)雜度 | 結(jié)構(gòu)比較復(fù)雜 | SPI實現(xiàn)要比UART簡單,UART需要固定的波特率,就是說兩位數(shù)據(jù)的間隔要相等,而SPI則無所謂,因為它是有時鐘的協(xié)議。 | 協(xié)議比SPI復(fù)雜,但是連線比標(biāo)準(zhǔn)的SPI要少 |
| 對比 | ? | 在點對點的通信中,SPI接口不需要進行尋址操作,且為全雙工通信,顯得簡單高效。 在多個從器件的系統(tǒng)中,每個從器件需要獨立的使能信號,硬件上比I2C系統(tǒng)要稍微復(fù)雜一些。 | ? |
三、串行外設(shè)接口:SPI
1、速覽點
(1)四條信號線:串行時鐘(SCLK)、串行數(shù)據(jù)輸出(SDO)、串行數(shù)據(jù)輸入(SDI)、片選線(SS)。(所謂的進出,是針對信號進出主機而言)
(2)SPI總線可以實現(xiàn)多SPI設(shè)備互相連接。提供時鐘的SPI設(shè)備為主設(shè)備(Master),其他設(shè)備為從設(shè)備(Slave)。SCLK信號線只由主設(shè)備控制,從設(shè)備不能控制信號線。
(3)在SPI總線上,某一時刻可以出現(xiàn)多個從機,但只能存在一個主機。主機通過片選線來確定要通信的從機。這就要求從機的MISO口具有三態(tài)特性,使得該口線在器件未被選通時表現(xiàn)為高阻抗。
(4)主從設(shè)備間可以實現(xiàn)全雙工通信,收發(fā)獨立,操作簡單,數(shù)據(jù)傳輸速率較高,但需要占用主機較多的口線(每個從機都需要一根片選線),而且只支持單個主機,沒有指定的流控制,沒有應(yīng)答機制確認(rèn)是否接收到數(shù)據(jù)。
(5)數(shù)據(jù)輸出通過SDO線,數(shù)據(jù)在時鐘上沿或下沿時改變(即發(fā)送),在緊接著的下沿或上沿被讀取,從而完成一位數(shù)據(jù)傳輸。數(shù)據(jù)輸入也使用同樣原理。因此,8位數(shù)據(jù)的傳輸,至少需要8次時鐘信號的改變(上沿和下沿為一次)。
(6)普通的串行通訊一次連續(xù)傳送至少8位數(shù)據(jù),而SPI允許數(shù)據(jù)一位一位的傳送,甚至允許暫停,因為SCK時鐘線由主控設(shè)備控制,當(dāng)沒有時鐘跳變時,從設(shè)備不采集或傳送數(shù)據(jù)。也就是說,主設(shè)備通過對SCK時鐘線的控制可以完成對通訊的控制。
(7)SPI接口在CPU和外圍低速器件之間進行同步串行數(shù)據(jù)傳輸,在主器件的移位脈沖下,數(shù)據(jù)按位傳輸,高位在前(先傳?),低位在后,為全雙工通信。
2、數(shù)據(jù)傳輸
(1)SPI在數(shù)據(jù)傳輸?shù)臅r候,需要確定兩件事情:
- 其一,數(shù)據(jù)是在時鐘的上升沿采集還是下降沿采集;
- 其二,時鐘的初始(空閑)狀態(tài)是為高電平還是低電平。
- 對比:I2C空閑狀態(tài)時,時鐘線(不是數(shù)據(jù)線?)為高電平,數(shù)據(jù)采集時,時鐘線也為高電平,但SPI給出了更自由的方式。
(2)兩個概念
CPOL:時鐘極性,表示SPI在空閑時,時鐘信號是高電平還是低電平。
CPHA:時鐘相位,表示SPI設(shè)備是在在時鐘的上升沿采集還是下降沿采集。
則SPI數(shù)據(jù)傳輸就有四種可能---按照標(biāo)準(zhǔn)的說法,SPI數(shù)據(jù)傳輸就有四種模式。
(3)四種模式
| 模式 | CPOL | CPHA |
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 2 | 1 | 0 |
| 3 | 1 | 1 |
模式0(杠cs表示片選信號)
模式1
模式2
模式3
3、spi讀寫
(1)SPI在硬件設(shè)計上采用的雙數(shù)據(jù)線制,根據(jù)設(shè)計,在SPI通信過程中,主從設(shè)備之間會形成一個數(shù)據(jù)環(huán)形鏈路——即主設(shè)備向從設(shè)備寫一次數(shù)據(jù),從設(shè)備就會回一次數(shù)據(jù)(至于從設(shè)備回復(fù)的數(shù)據(jù)是否有效,則另當(dāng)別論——如果有效,主設(shè)備就把它讀入,否則丟棄)
(2)例子:假設(shè)上升沿發(fā)送、下降沿接收、高位先發(fā)送。
假設(shè)主機8位寄存器裝的是待發(fā)送的數(shù)據(jù)10101010
那么第一個上升沿時,數(shù)據(jù)將會是SDO=1,寄存器=0101010x
下降沿到來的時候,SDI上的電平將存到主機的寄存器中的最低位(最右邊),SDO上的電平將存到從機的寄存器的最低位(最右邊),則此時主機寄存器=0101010SDI(SDI表示1bit),從機寄存器=1010101SDO。
這樣在 8個時鐘脈沖以后,兩個寄存器的內(nèi)容互相交換一次,這樣就完成里一個spi時序。
假定主機和從機初始化就緒,并且主機的sbuff=0xaa=0b1010?1010,從機的sbuff=0x55=0b0101 0101?
下面將分步對SPI的8個時鐘周期的數(shù)據(jù)情況演示一遍
(1)上表示上升沿、下表示下降沿,SDI、SDO相對于主機而言的。
(2)ss引腳作為主機時,從機可以把它拉低,被動選為從機;作為從機時,可以作為片選腳用。
(3)根據(jù)以上分析,一個完整的傳送周期是16位。因為主機首先要發(fā)送命令過去,然后從機準(zhǔn)備數(shù)據(jù),主機在下一個8位時鐘周期才把數(shù)據(jù)讀回來。
?
四、IC之間總線:I2C
1、速覽點
(1)由圖可知
- 由兩條信號線組成:串行數(shù)據(jù)線(SDA)、串行時鐘線(SCL)。
- 由1,2箭頭指示可知,I2C器件內(nèi)部采用開漏的方法,總線被上拉。
- 那么總線狀態(tài)只能被下拉為0(當(dāng)MOS管輸入0的時候)。
- 只要有一方下拉了總線,總線狀態(tài)必定為0。
(2)任何一個設(shè)備都能像主控器一樣工作,并控制總線,但同一時刻只能有一個主控設(shè)備。
(3)總線上的每一個設(shè)備都有一個獨一無二的地址,根據(jù)設(shè)備的能力,作為發(fā)射器或接收器工作。
(4)在它的協(xié)議體系中,傳輸數(shù)據(jù)時都會帶上目的設(shè)備的設(shè)備地址,因此可以實現(xiàn)設(shè)備組網(wǎng)。
(5)連接到相同總線的IC?數(shù)量只受到總線的最大電容限制。
(6)SDA傳輸數(shù)據(jù)是大端傳輸(高位先傳,低位后傳?),是以字節(jié)為單位的。
?
2、詳細(xì)介紹
https://blog.csdn.net/oqqHuTu12345678/article/details/72356722
3、時序
https://blog.csdn.net/oqqHuTu12345678/article/details/72356722
https://blog.csdn.net/Mr_Lyoko/article/details/79598106
4、代碼
https://blog.csdn.net/oqqHuTu12345678/article/details/72358553
?
?
五、通用異步收發(fā)器:UART
1、速覽點
(1)UART由波特率產(chǎn)生器、UART接收器、UART發(fā)送器組成。
(2)由三條信號線組成:RX、TX、GND
(3)UART包括RS232、RS499、RS423、RS422和RS485等接口標(biāo)準(zhǔn)規(guī)范和總線標(biāo)準(zhǔn)規(guī)范。它們的主要區(qū)別在于其各自的電平范圍不相同。 嵌入式設(shè)備中常常使用到的是TTL、TTL轉(zhuǎn)RS232的這種方式。
2、通信協(xié)議
(1)起始位:先發(fā)出一個邏輯”0”的信號,表示傳輸字符的開始。
(2)數(shù)據(jù)位:緊接著起始位之后。數(shù)據(jù)位的個數(shù)可以是4、5、6、7、8等,構(gòu)成一個字符。通常采用ASCII碼。
(3)奇偶校驗位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗)或奇數(shù)(奇校驗),以此來校驗資料傳送的正確性。
(4)停止位:它是一個字符數(shù)據(jù)的結(jié)束標(biāo)志。可以是1位、1.5位、2位的高電平。
(5)空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路上沒有資料傳送。
(6)波特率:數(shù)據(jù)傳輸?shù)乃俾?。有以下幾個檔位:300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200。在數(shù)據(jù)傳輸和接收雙方,需要預(yù)先統(tǒng)一波特率,以便正確的傳輸數(shù)據(jù)。
3、詳細(xì)介紹
https://blog.csdn.net/oqqHuTu12345678/article/details/71597893
https://blog.csdn.net/oqqHuTu12345678/article/details/71597575
https://blog.csdn.net/xiaodingqq/article/details/80342459
4、代碼學(xué)習(xí)
https://blog.csdn.net/oqqHuTu12345678/article/details/71601785
?
六、心得體會
1、通信接口分為物理層和協(xié)議層
(1)物理層(硬件):如UART,PC和單片機通信,PC機的串口是232電平而單片機的串口是TTL電平,兩個設(shè)備之間通信如果電平不一致就相當(dāng)于語言不通,造成邏輯混亂。因此一般的單片機系統(tǒng)板上都會有一個串口模塊電路(串口控制器)用來進行電平轉(zhuǎn)換,將PC機的232電平轉(zhuǎn)化成單片機能識別的232電平,常用芯片如PL2303、CH340。
(2)協(xié)議層:就相當(dāng)于規(guī)定了一個標(biāo)準(zhǔn)或規(guī)則,比如SPI協(xié)議中,主機向從機發(fā)出一個數(shù)據(jù),從機接收到后會發(fā)出應(yīng)答信號,這就是協(xié)議規(guī)定的內(nèi)容,不需要人為干預(yù)。當(dāng)然有的單片機沒有這些協(xié)議的控制器(硬件),如51單片機和24c02通信,需要模擬IIC協(xié)議,用軟件來實現(xiàn)硬件的功能,這就增加了軟件的復(fù)雜度。
2、總線的選擇
(1)SPI總線有4根線,分別是SCK,SDO,SDI,SS,可以掛多個從設(shè)備,但是在掛多個從設(shè)備時,主設(shè)備端還需要做一個n選一的譯碼器,用于選擇將要訪問的從設(shè)備,因此,主設(shè)備上的管腳需求比較多。SPI總線在只有一個從設(shè)備時,只要用到SCK,SDO,SDI這三根線,此時選擇SPI比I2C總線占優(yōu)。
(2)I2C總線只有兩根線,SCL,SDA.,也可以掛多個從設(shè)備,對從設(shè)備的選擇直接依靠協(xié)議完成,無需增加物理連線。一般情況下,當(dāng)一塊電路板上有多個從設(shè)備時,往往選用I2C而非SPI,因為SPI增加了額外額硬件開銷以及電路板走線。
(3)I2C和SPI總線一般是讀取一些PROM等從設(shè)備用。 而串行通信接口SCI(UART?),主要應(yīng)用在兩個智能設(shè)備之間的互相通訊。有別于SPI和I2C總線的主從模式,SCI可以是主-主模式。
-----另一種說法
(1)總線拓?fù)浣Y(jié)構(gòu)/信號路由/硬件資源耗費
IIC 只需兩根信號線,而標(biāo)準(zhǔn)SPI至少四根信號,如果有多個從設(shè)備,信號需要更多。一些SPI變種雖然只使用三根線——SCLK, SS和雙向的MISO/MOSI,但SS線還是要和從設(shè)備一對一根。另外,如果SPI要實現(xiàn)多主設(shè)備結(jié)構(gòu),總線系統(tǒng)需額外的邏輯和線路。用IIC 構(gòu)建系統(tǒng)總線唯一的問題是有限的7位地址空間,但這個問題新標(biāo)準(zhǔn)已經(jīng)解決——使用10位地址。從第一點上看,IIC是明顯的大贏家。
(2)數(shù)據(jù)吞吐/傳輸速度
如果應(yīng)用中必須使用高速數(shù)據(jù)傳輸,那么SPI是必然的選擇。因為SPI是全雙工,IIC 的不是。SPI沒有定義速度限制,一般的實現(xiàn)通常能達到甚至超過10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式還需要額外的I/O緩沖區(qū),還并不是總是容易實現(xiàn)的。
(3)優(yōu)雅性
IIC 常被稱更優(yōu)雅于SPI。公正的說,我們更傾向于認(rèn)為兩者同等優(yōu)雅和健壯。IIC的優(yōu)雅在于它的特色——用很輕盈的架構(gòu)實現(xiàn)了多主設(shè)備仲裁和設(shè)備路由。但是對使用的工程師來講,理解總線結(jié)構(gòu)更費勁,而且總線的性能不高。SPI的優(yōu)點在于它的結(jié)構(gòu)相當(dāng)?shù)闹庇^簡單,容易實現(xiàn),并且有很好擴展性。SPI的簡單性不足稱其優(yōu)雅,因為要用SPI搭建一個有用的通信平臺,還需要在SPI之上構(gòu)建特定的通信協(xié)議軟件。也就是說要想獲得SPI特有而IIC沒有的特性——高速性能,工程師們需要付出更多的勞動。另外,這種自定的工作是完全自由的,這也說明為什么SPI沒有官方標(biāo)準(zhǔn)。IIC和SPI都對低速設(shè)備通信提供了很好的支持,不過,SPI適合數(shù)據(jù)流應(yīng)用,而IIC更適合“字節(jié)設(shè)備”的多主設(shè)備應(yīng)用。
(4)小結(jié)
在數(shù)字通信協(xié)議簇中,IIC和SPI常稱為“小”協(xié)議,相對Ethernet, USB, SATA, PCI-Express等傳輸速度達數(shù)百上千兆字節(jié)每秒的總線。但是,我們不能忘記的是各種總線的用途是什么。“大”協(xié)議是用于系統(tǒng)外的整個系統(tǒng)之間通信的,“小”協(xié)議是用于系統(tǒng)內(nèi)各芯片間的通信,沒有跡象表明“大”協(xié)議有必要取代“小”協(xié)議。IIC和SPI的存在和流行體現(xiàn)了“夠用就好”的哲學(xué)。
?
七、UART和RS232的聯(lián)系和區(qū)別
1、RS232
RS232是早期的一種串行通信標(biāo)準(zhǔn),它描述了使用RS-232標(biāo)準(zhǔn)進行通信時的電平要求(定義多少電平表示數(shù)據(jù)0和1)、接線要求、線材要求,其實更多的是電平標(biāo)準(zhǔn)。
2、UART
UART是通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),既然是“器”,顯然,它就是個設(shè)備而已,要完成一個特定功能的硬件。它最基本的功能是串并數(shù)據(jù)轉(zhuǎn)換。
另外UART還要控制數(shù)據(jù)的格式(波特率、起始位、數(shù)據(jù)位、校驗位、停止位等內(nèi)容),這表示它也是異步串行通信的一種方式,它本身不是協(xié)議,但具有協(xié)議的特征,然而比RS232協(xié)議更具一般性。
因此可以說,UART同時具有硬件和協(xié)議的范疇。
3、TTL和RS232
在嵌入式MCU中的UART使用TTL電平,而在PC中的UART使用的則是RS232電平。所以UART并沒有規(guī)范該使用什么電平,取決于你使用什么通信標(biāo)準(zhǔn)。即UART可以使用RS232規(guī)定的電平來通信,也可以用其他協(xié)議規(guī)定的電平來工作。
P.s:RS232與常見的TTL電平不同,RS232采用的是負(fù)邏輯,因此一般會使用MAX-232雙向轉(zhuǎn)化芯片。
TTL標(biāo)準(zhǔn):低電平為0,高電平為1(+5V電平,3.3V以上即可)
RS-232標(biāo)準(zhǔn):正電平為0,負(fù)電平為1(±15V電平)
------------------------------------------------------------------------
4、注意RS232不是接口標(biāo)準(zhǔn),DB9、DB25才叫接口標(biāo)準(zhǔn),現(xiàn)在RS232用的多的都是DB9。
5、接設(shè)備的時候,一般只接GND RX TX。不會接Vcc或者+3.3v的電源線,避免與目標(biāo)設(shè)備上的供電沖突。
6、PL2303、CP2102芯片是USB轉(zhuǎn)TTL串口的芯片,用USB來擴展串口(TTL電平)。
------------------------------------------------------------------------
4、嵌入式常用串口實物圖
(1)串口(嵌入式中指的是UART)、COM口
(兩者同概念?COM口有兩種物理標(biāo)準(zhǔn):D型9針插頭和?4針杜邦頭。左圖是UART,中間是4針杜邦頭COM口,右圖是D型9針插頭。由此可知,4針杜邦頭和UART是一樣的?另外D型9針插頭我們一般只接GND、RXD、TXD,因此其實和UART是一樣的)
? ? ? ? ? ? ? ? ??
(2)下圖是用PL2303芯片的USB轉(zhuǎn)TTL串口
下圖是用CP2102芯片的USB轉(zhuǎn)TTL串口
下圖是USB轉(zhuǎn)RS-232串口
?
總結(jié)
以上是生活随笔為你收集整理的SPI、I2C、UART 三种串行总线对比介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于,我读懂了所有Java集合——set
- 下一篇: 树状数组维护区间和的模型及其拓广的简单总