轉載自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 |
信號線數目 | 3根,RX、TX、GND | 4根,SDO、SDI、SCLK、SS | 2根,SDA、SCLK |
設備從屬關系 | ? ? ? ? ? ?—— | 存在主從設備。SPI用片選信號選擇從機? | 存在主從設備。IIC用地址選擇從機。 |
通信方式 | 全雙工通信 | 全雙工通信 | 半雙工通信 |
通信速率 | 速度慢 | 比I2C總線要快,速度可達到幾Mbps | I2C的速度比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)四種模式
模式 | CPOL | CPHA |
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
模式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串口
?