SPI、I2C、UART 三種串行總線對比介紹

轉載自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對比

三、串行外設接口:SPI

1、速覽點

2、數據傳輸

3、spi讀寫

四、IC之間總線:I2C

1、速覽點

2、詳細介紹

3、時序

4、代碼

五、通用異步收發器:UART

1、速覽點

2、通信協議

3、詳細介紹

4、代碼學習

六、心得體會

1、通信接口分為物理層(硬件)和協議層

2、關于總線的選擇問題

七、UART和RS232的聯系和區別

1、RS232

2、UART

3、TTL和RS232

4、嵌入式常用串口實物圖


一、名字

  • SPI(Serial Peripheral Interface:串行外設接口),是Motorola公司提出的一種同步串行數據傳輸標準。
  • I2C(INTER IC BUS:IC之間總線),是由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備,是微電子通信控制領域廣泛采用的一種總線標準。
  • UART(Universal Asynchronous Receiver Transmitter:通用異步收發器),是電腦硬件的一部分,它把將要傳輸的資料在串行通信與并行通信之間加以轉換,UART通常被集成于其他通訊接口的連接上。UART即我們通常說的“串口”。

?

二、UART、SPI、I2C對比

UART、SPI、I2C對比表格
對比項? ? ? ? ?UART? ? ? ? ? ? ? ? ? ? ?SPI? ? ? ? ? ? I2C
信號線數目3根,RX、TX、GND4根,SDO、SDI、SCLK、SS2根,SDA、SCLK
設備從屬關系? ? ? ? ? ?——存在主從設備。SPI用片選信號選擇從機?存在主從設備。IIC用地址選擇從機。
通信方式全雙工通信全雙工通信半雙工通信
通信速率速度慢比I2C總線要快,速度可達到幾MbpsI2C的速度比SPI慢
應用領域

1、UART常用于控制計算機與串行設備的芯片

2、就是我們經常所說的串口,基本都用于調試。

主要應用在EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間I2C一般是用在同一個板子上的2個IC之間的通信 ,它可以替代標準的并行總線,連接各種集成電路和功能模塊。
傳輸距離??I2C需要有雙向IO的支持,而且使用上拉電阻,抗干擾能力較弱,一般用于同一板卡上芯片之間的通信,較少用于遠距離通信
通信特征異步,一幀可以傳5/6/7/8位同步,SPI允許數據一位一位的傳送,甚至允許暫停。從最高位開始傳。同步,電平信號,一次連續8bit。從最高位開始傳
協議復雜度結構比較復雜SPI實現要比UART簡單,UART需要固定的波特率,就是說兩位數據的間隔要相等,而SPI則無所謂,因為它是有時鐘的協議。協議比SPI復雜,但是連線比標準的SPI要少
對比?

在點對點的通信中,SPI接口不需要進行尋址操作,且為全雙工通信,顯得簡單高效。

在多個從器件的系統中,每個從器件需要獨立的使能信號,硬件上比I2C系統要稍微復雜一些。

?


三、串行外設接口:SPI

1、速覽點

(1)四條信號線:串行時鐘(SCLK)、串行數據輸出(SDO)、串行數據輸入(SDI)、片選線(SS)。(所謂的進出,是針對信號進出主機而言)

(2)SPI總線可以實現多SPI設備互相連接。提供時鐘的SPI設備為主設備(Master),其他設備為從設備(Slave)。SCLK信號線只由主設備控制,從設備不能控制信號線。

(3)在SPI總線上,某一時刻可以出現多個從機,但只能存在一個主機。主機通過片選線來確定要通信的從機。這就要求從機的MISO口具有三態特性,使得該口線在器件未被選通時表現為高阻抗。

(4)主從設備間可以實現全雙工通信,收發獨立,操作簡單,數據傳輸速率較高,但需要占用主機較多的口線(每個從機都需要一根片選線),而且只支持單個主機,沒有指定的流控制,有應答機制確認是否接收到數據

(5)數據輸出通過SDO線,數據在時鐘上沿或下沿時改變(即發送),在緊接著的下沿或上沿被讀取,從而完成一位數據傳輸。數據輸入也使用同樣原理。因此,8位數據的傳輸,至少需要8次時鐘信號的改變(上沿和下沿為一次)。

(6)普通的串行通訊一次連續傳送至少8位數據,而SPI允許數據一位一位的傳送,甚至允許暫停,因為SCK時鐘線由主控設備控制,當沒有時鐘跳變時,從設備不采集或傳送數據。也就是說,主設備通過對SCK時鐘線的控制可以完成對通訊的控制。

(7)SPI接口在CPU和外圍低速器件之間進行同步串行數據傳輸,在主器件的移位脈沖下,數據按位傳輸,高位在前(先傳?),低位在后,為全雙工通信。

2、數據傳輸

(1)SPI在數據傳輸的時候,需要確定兩件事情:

  • 其一,數據是在時鐘的上升沿采集還是下降沿采集;
  • 其二,時鐘的初始(空閑)狀態是為高電平還是低電平。
  • 對比:I2C空閑狀態時,時鐘線(不是數據線?)為高電平,數據采集時,時鐘線也為高電平,但SPI給出了更自由的方式。

(2)兩個概念

CPOL:時鐘極性,表示SPI在空閑時,時鐘信號是高電平還是低電平。

CPHA:時鐘相位,表示SPI設備是在在時鐘的上升沿采集還是下降沿采集。

則SPI數據傳輸就有四種可能---按照標準的說法,SPI數據傳輸就有四種模式

(3)四種模式

模式CPOLCPHA
000
101
210
311

模式0(杠cs表示片選信號)

模式1

模式2

模式3

3、spi讀寫

(1)SPI在硬件設計上采用的雙數據線制,根據設計,在SPI通信過程中,主從設備之間會形成一個數據環形鏈路——即主設備向從設備寫一次數據,從設備就會回一次數據(至于從設備回復的數據是否有效,則另當別論——如果有效,主設備就把它讀入,否則丟棄)

(2)例子:假設上升沿發送、下降沿接收、高位先發送。

假設主機8位寄存器裝的是待發送的數據10101010

那么第一個上升沿時,數據將會是SDO=1,寄存器=0101010x

下降沿到來的時候,SDI上的電平將存到主機的寄存器中的最低位(最右邊),SDO上的電平將存到從機的寄存器的最低位(最右邊),則此時主機寄存器=0101010SDI(SDI表示1bit),從機寄存器=1010101SDO。

這樣在 8個時鐘脈沖以后,兩個寄存器的內容互相交換一次,這樣就完成里一個spi時序。

假定主機和從機初始化就緒,并且主機的sbuff=0xaa=0b1010?1010,從機的sbuff=0x55=0b0101 0101?

下面將分步對SPI的8個時鐘周期的數據情況演示一遍

(1)上表示上升沿、下表示下降沿,SDI、SDO相對于主機而言的。

(2)ss引腳作為主機時,從機可以把它拉低,被動選為從機;作為從機時,可以作為片選腳用。

(3)根據以上分析,一個完整的傳送周期是16位。因為主機首先要發送命令過去,然后從機準備數據,主機在下一個8位時鐘周期才把數據讀回來。

?

四、IC之間總線:I2C

1、速覽點

(1)由圖可知

  • 由兩條信號線組成:串行數據線(SDA)、串行時鐘線(SCL)。
  • 由1,2箭頭指示可知,I2C器件內部采用開漏的方法,總線被上拉。
  • 那么總線狀態只能被下拉為0(當MOS管輸入0的時候)。
  • 只要有一方下拉了總線,總線狀態必定為0。

(2)任何一個設備都能像主控器一樣工作,并控制總線,但同一時刻只能有一個主控設備。

(3)總線上的每一個設備都有一個獨一無二的地址,根據設備的能力,作為發射器或接收器工作。

(4)在它的協議體系中,傳輸數據時都會帶上目的設備的設備地址,因此可以實現設備組網。

(5)連接到相同總線的IC?數量只受到總線的最大電容限制。

(6)SDA傳輸數據是大端傳輸(高位先傳,低位后傳?),是以字節為單位的。

?

2、詳細介紹

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

?

?

五、通用異步收發器:UART

1、速覽點

(1)UART由波特率產生器、UART接收器、UART發送器組成。

(2)由三條信號線組成:RX、TX、GND

(3)UART包括RS232、RS499、RS423、RS422和RS485等接口標準規范和總線標準規范。它們的主要區別在于其各自的電平范圍不相同。 嵌入式設備中常常使用到的是TTL、TTL轉RS232的這種方式。

2、通信協議

(1)起始位:先發出一個邏輯”0”的信號,表示傳輸字符的開始。

(2)數據位:緊接著起始位之后。數據位的個數可以是4、5、6、7、8等,構成一個字符。通常采用ASCII碼。

(3)奇偶校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。

(4)停止位:它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。

(5)空閑位:處于邏輯“1”狀態,表示當前線路上沒有資料傳送。

(6)波特率:數據傳輸的速率。有以下幾個檔位:300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200。在數據傳輸和接收雙方,需要預先統一波特率,以便正確的傳輸數據。

3、詳細介紹

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、代碼學習

https://blog.csdn.net/oqqHuTu12345678/article/details/71601785

?

六、心得體會

1、通信接口分為物理層和協議層

(1)物理層(硬件):如UART,PC和單片機通信,PC機的串口是232電平而單片機的串口是TTL電平,兩個設備之間通信如果電平不一致就相當于語言不通,造成邏輯混亂。因此一般的單片機系統板上都會有一個串口模塊電路(串口控制器)用來進行電平轉換,將PC機的232電平轉化成單片機能識別的232電平,常用芯片如PL2303、CH340。

(2)協議層:就相當于規定了一個標準或規則,比如SPI協議中,主機向從機發出一個數據,從機接收到后會發出應答信號,這就是協議規定的內容,不需要人為干預。當然有的單片機沒有這些協議的控制器(硬件),如51單片機和24c02通信,需要模擬IIC協議,用軟件來實現硬件的功能,這就增加了軟件的復雜度。

2、總線的選擇

(1)SPI總線有4根線,分別是SCK,SDO,SDI,SS,可以掛多個從設備,但是在掛多個從設備時,主設備端還需要做一個n選一的譯碼器,用于選擇將要訪問的從設備,因此,主設備上的管腳需求比較多。SPI總線在只有一個從設備時,只要用到SCK,SDO,SDI這三根線,此時選擇SPI比I2C總線占優。

(2)I2C總線只有兩根線,SCL,SDA.,也可以掛多個從設備,對從設備的選擇直接依靠協議完成,無需增加物理連線。一般情況下,當一塊電路板上有多個從設備時,往往選用I2C而非SPI,因為SPI增加了額外額硬件開銷以及電路板走線。

(3)I2C和SPI總線一般是讀取一些PROM等從設備用。 而串行通信接口SCI(UART?),主要應用在兩個智能設備之間的互相通訊。有別于SPI和I2C總線的主從模式,SCI可以是主-主模式。

-----另一種說法

(1)總線拓撲結構/信號路由/硬件資源耗費

IIC 只需兩根信號線,而標準SPI至少四根信號,如果有多個從設備,信號需要更多。一些SPI變種雖然只使用三根線——SCLK, SS和雙向的MISO/MOSI,但SS線還是要和從設備一對一根。另外,如果SPI要實現多主設備結構,總線系統需額外的邏輯和線路。用IIC 構建系統總線唯一的問題是有限的7位地址空間,但這個問題新標準已經解決——使用10位地址。從第一點上看,IIC是明顯的大贏家。

(2)數據吞吐/傳輸速度

如果應用中必須使用高速數據傳輸,那么SPI是必然的選擇。因為SPI是全雙工,IIC 的不是。SPI沒有定義速度限制,一般的實現通常能達到甚至超過10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式還需要額外的I/O緩沖區,還并不是總是容易實現的。

(3)優雅性

IIC 常被稱更優雅于SPI。公正的說,我們更傾向于認為兩者同等優雅和健壯。IIC的優雅在于它的特色——用很輕盈的架構實現了多主設備仲裁和設備路由。但是對使用的工程師來講,理解總線結構更費勁,而且總線的性能不高。SPI的優點在于它的結構相當的直觀簡單,容易實現,并且有很好擴展性。SPI的簡單性不足稱其優雅,因為要用SPI搭建一個有用的通信平臺,還需要在SPI之上構建特定的通信協議軟件。也就是說要想獲得SPI特有而IIC沒有的特性——高速性能,工程師們需要付出更多的勞動。另外,這種自定的工作是完全自由的,這也說明為什么SPI沒有官方標準。IIC和SPI都對低速設備通信提供了很好的支持,不過,SPI適合數據流應用,而IIC更適合“字節設備”的多主設備應用。

(4)小結

在數字通信協議簇中,IIC和SPI常稱為“小”協議,相對Ethernet, USB, SATA, PCI-Express等傳輸速度達數百上千兆字節每秒的總線。但是,我們不能忘記的是各種總線的用途是什么。“大”協議是用于系統外的整個系統之間通信的,“小”協議是用于系統內各芯片間的通信,沒有跡象表明“大”協議有必要取代“小”協議。IIC和SPI的存在和流行體現了“夠用就好”的哲學。

?

七、UART和RS232的聯系和區別

1、RS232

RS232是早期的一種串行通信標準,它描述了使用RS-232標準進行通信時的電平要求(定義多少電平表示數據0和1)、接線要求、線材要求,其實更多的是電平標準。

2、UART

UART是通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),既然是“器”,顯然,它就是個設備而已,要完成一個特定功能的硬件。它最基本的功能是串并數據轉換。

另外UART還要控制數據的格式(波特率、起始位、數據位、校驗位、停止位等內容),這表示它也是異步串行通信的一種方式,它本身不是協議,但具有協議的特征,然而比RS232協議更具一般性。

因此可以說,UART同時具有硬件和協議的范疇。

3、TTL和RS232

在嵌入式MCU中的UART使用TTL電平,而在PC中的UART使用的則是RS232電平。所以UART并沒有規范該使用什么電平,取決于你使用什么通信標準。即UART可以使用RS232規定的電平來通信,也可以用其他協議規定的電平來工作。

P.s:RS232與常見的TTL電平不同,RS232采用的是負邏輯,因此一般會使用MAX-232雙向轉化芯片。

TTL標準:低電平為0,高電平為1(+5V電平,3.3V以上即可)

RS-232標準:正電平為0,負電平為1(±15V電平)

------------------------------------------------------------------------

4、注意RS232不是接口標準,DB9、DB25才叫接口標準,現在RS232用的多的都是DB9

5、接設備的時候,一般只接GND RX TX。不會接Vcc或者+3.3v的電源線,避免與目標設備上的供電沖突。

6、PL2303、CP2102芯片是USB轉TTL串口的芯片,用USB來擴展串口(TTL電平)。

------------------------------------------------------------------------

4、嵌入式常用串口實物圖

(1)串口(嵌入式中指的是UART)、COM口

(兩者同概念?COM口有兩種物理標準:D型9針插頭和?4針杜邦頭。左圖是UART,中間是4針杜邦頭COM口,右圖是D型9針插頭。由此可知,4針杜邦頭和UART是一樣的?另外D型9針插頭我們一般只接GND、RXD、TXD,因此其實和UART是一樣的)

? ? ? ? ? ? ? ? ??

(2)下圖是用PL2303芯片的USB轉TTL串口

下圖是用CP2102芯片的USB轉TTL串口

下圖是USB轉RS-232串口


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444193.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode1045. 買下所有產品的客戶(SQL)

Customer 表: ---------------------- | Column Name | Type | ---------------------- | customer_id | int | | product_key | int | ---------------------- product_key 是 Product 表的外鍵。 Product 表: ---------------------- | C…

Oracle利用序列實現自動增長列

在SQL Server以及MySql中都有相應的自動增長列類型,而Oracle中則沒有此類型,那如果要實現自動增長列需要怎么辦呢. 我們可以利用序列來實現.插入數據時候,可以像sql以及mysql一樣,不用顯示指定需要自動增長的列的值. 代碼實現如下: CREATE TABLE SYS_ROLES ( ID integer NOT NU…

C++ new和malloc的區別

這里先對new和delete簡單進行一下總結,然后再細說new和malloc的區別。 一、new和delete C語言提供了malloc和free兩個系統函數,完成對堆內存的申請和釋放。而C則提供了兩個關鍵字new和delete; 1.1 規則 new/delete是關鍵字,效率…

leetcode620. 有趣的電影(SQL)

某城市開了一家新的電影院,吸引了很多人過來看電影。該電影院特別注意用戶體驗,專門有個 LED顯示板做電影推薦,上面公布著影評和相關電影描述。 作為該電影院的信息部主管,您需要編寫一個 SQL查詢,找出所有影片描述為…

leetcode1050. 合作過至少三次的演員和導演(SQL)

ActorDirector 表: ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是這張表的主鍵. 寫一條SQL查詢語句獲取合作…

linux內核相關知識

參考https://www.cnblogs.com/xdyixia/p/9248240.html linux內核啟動過程 一個嵌入式 Linux 系統從軟件角度看可以分為四個部分:引導加載程序(Bootloader),Linux 內核,文件系統,應用程序。其中 Bootloade…

棧與堆的區別(內存分配與數據結構)

參考自https://blog.csdn.net/K346K346/article/details/80849966/ 堆(Heap)與棧(Stack)包含兩層含義: 程序內存布局場景下的內存管理方式數據結構中的兩種常見的數據結構 1. 程序內存分配中的堆與棧 1.1 棧介紹 …

leetcode10. 正則表達式匹配 一道沒有解釋的字符串dp困難題

給你一個字符串 s 和一個字符規律 p,請你來實現一個支持 . 和 * 的正則表達式匹配。 . 匹配任意單個字符 * 匹配零個或多個前面的那一個元素 所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。 說明: s 可能為空,且只包含…

string相關庫函數

char *strcat(char *dest, const char *src) 功能 把 src 所指向的字符串追加到 dest 所指向的字符串的結尾。 參數: dest – 指向目標數組,該數組包含了一個 C 字符串,且足夠容納追加后的字符串。 src – 指向要追加的字符串,該…

leetcode44. 通配符匹配 又是一道沒有解釋的字符串dp困難題

給定一個字符串 (s) 和一個字符模式 (p) ,實現一個支持 ? 和 * 的通配符匹配。 ? 可以匹配任何單個字符。 * 可以匹配任意字符串(包括空字符串)。 兩個字符串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫…

深入學習卷積神經網絡(CNN)的原理知識

轉載自https://www.cnblogs.com/wj-1314/p/9754072.html 在深度學習領域中,已經經過驗證的成熟算法,目前主要有深度卷積網絡(DNN)和遞歸網絡(RNN),在圖像識別,視頻識別,語…

java中如何生成隨機數?

java中如何生成隨機數? package com.test.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; public class CharacterUtils {/*** 第一種方法;length為產生的位數*/public static String getRandomString(int…

leetcode132. 分割回文串 II

給定一個字符串 s,將 s 分割成一些子串,使每個子串都是回文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個回文子串。 思路:dp[i]…

為什么需要智能指針

參考自https://www.cnblogs.com/round1/p/12906648.html 主要為了避免以下Bug: 內存泄露 :對象無法被釋放,最常見的問題。野指針 : 指針指向未知。重復釋放 : 顧名思義。 (一)內存泄露 : 1. 拋出異常&…

leetcode1068. 產品銷售分析 I(SQL)

銷售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- (sale_id, year) 是銷售表…

多進程與多線程通信同步機制

多進程通信方式 管道pipe:管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關…

leetcode1069. 產品銷售分析 II(SQL)

銷售表:Sales -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是這個表的主鍵。…

leetcode1070. 產品銷售分析 III(SQL)

銷售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是此表的主鍵。 …

C/C++中static的用法全局變量與局部變量

轉載自C/C中static的用法全局變量與局部變量 1.什么是static? static 是C/C中很常用的修飾符,它被用來控制變量的存儲方式和可見性。 1.1static的引入 我們知道在函數內部定義的變量,當程序執行到它的定義處時,編譯器為它在棧上分配空間&…

查看商品圖片,鼠標懸浮圖片放大js實現

2010-06-07 10:18:46|分類&#xff1a;Javascript|字號訂閱 <%pagelanguage"java"import"java.util.*"pageEncoding"UTF-8"%> <%pageimport"com.pojo.Products"%> <% String path request.getContextPath(); String b…