一、UART
UART,全稱UniversalAsynchrONous Receiver/Transmitter,譯為通用異步收發器(異步串行通信口),比SPI、I2C這兩種同步串口的結構要復雜很多,一般由波特率產生器(產生的波特率等于傳輸波特率的16倍)、UART接收器、UART發送器組成。硬件上有兩根線,一根用于發送,一根用于接收。數據是異步傳輸的,對雙方的時序要求比較嚴格。串口按位(bit)發送和接收字節,盡管比按字節(byte)的并行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。在多機通信上面用的最多。如果用GPIO口模擬UART總線,則需一個輸入口,一個輸出口。
1、UART幾個相關的概念
部分參考,GPIO,I2C,SPI,UART,USART,USB的區別_步印的博客-CSDN博客_spi和gpio的區別
UART包括了RS232、RS499、RS423、RS422和RS485等接口標準規范和總線標準規范,即UART是異步串行通信口的總稱。而RS232、RS499、RS423、RS422和RS485等,是對應各種異步串行通信口的接口標準和總線標準,它規定了通信口的電氣特性、傳輸速率、連接特性和接口的機械特性等內容。是屬于通信網絡OSI模型中的物理層?的概念。具體可以看《嵌入式硬件通信接口協議-UART(二)不同電氣規范下的標準》這篇文章。
UART的電平信號由MCU芯片決定,TTL/CMOS,是嵌入式硬件系統的信號電平。日常的開發過程中,MCU管腳上的UART通信電平就是TTL/CMOS電平信號。TTL電平,邏輯“0”等于0V電壓,邏輯“1”等于+5V電壓。CMOS電平,邏輯“0”接近0V電壓,邏輯“1”接近電源電壓(3.3V或其他)。TTL電路與CMOS電路比較,TTL電路是電流控制器件,而CMOS電路是電壓控制器件;TTL的速度快,傳輸延遲時間短(5-10ns),但是功耗大。CMOS電路的速度慢,傳輸延遲時間長(25-50ns),但功耗低。CMOS電路本身的功耗與輸入信號的脈沖頻率有關,頻率越高,芯片即越熱,這是正常現象。
COM口是PC(個人計算機)上,異步串行通信口的簡寫。在PC等操作系統上,COM口區別于USB、SATA接口的串行接口,定義了在操作系統中的規范。由于歷史原因,IBM的PC外部接口配置為RS232,成為實際上的PC界默認標準。所以,現在PC機的COM口均為RS232。若配有多個異步串行通信口,則分別稱為COM1、COM2等等,但由于串口(COM)不支持熱插拔及傳輸速率較低,目前部分新主板和大部分便攜電腦已開始取消該接口。目前串口多用于工控和測量設備以及部分通信設備中。
UART多應用兩個設備之間的通信,如用單片機的設備和計算機的通信。這樣的通信可以做長距離的。UART速度比SPI、I2C兩者者快,最高達100K左右,用與計算機與設備或者計算機和計算之間通信,但有效范圍不會很長,約10米左右,UART優點是支持面廣,程序設計結構很簡單,隨著USB的發展,UART也逐漸走向下坡。
我們常說的串口,是指使用RS232標準進行傳輸的UART接口(9針)。
2、UART通訊需要配置的參數
1)波特率
波特率部分文章參考,DigCore:嵌入式硬件通信接口協議-UART(一)協議基礎
由于UART屬于異步通信,在通信過程中沒有同步時鐘CLK來提供給接收方,接收方也就無法同步地確定每個bit的寬度,也就無法對每個bit進行正確的采樣。因此接收方必須依靠設置與發送方相同的波特率參數,這樣接收方對信號管腳進行采樣和解碼時,才能正確判斷每個bit的值是“1”還是“0”,這也就是異步通信的特點。
在各類MCU的UART配置中,常用的波特率值有:4800Bd、9600Bd、19200Bd、115200Bd,單位Bd。
在維基百科的介紹中,可看到,波特率的值,直接以bit/s的單位取倒數后得到單位s/bit。在示波器端對UART發出的波形進行抓取實驗,可見每bit的寬度在誤差允許范圍內基本就是波特率的倒數值。
在百度百科的詞條介紹中
調制速率,指的是有效數據信號調制載波的速率,即單位時間內載波調制狀態變化的次數。它是對符號傳輸速率的一種度量,1波特即指每秒傳輸1個符號,而通過不同的調制方式,可以在一個碼元符號上負載多個bit位信息。單位“波特”本身就已經是代表每秒的調制數,以“波特每秒”(Baud per second)為單位是一種常見的錯誤。
它代表的是信號的變化,而不是傳輸數據的多少。它表示每秒鐘內通信線路狀態改變的次數。如果數據不壓縮,波特等于每秒鐘傳輸的數據位數,如果數據進行了壓縮。那么每秒鐘傳輸的數據位數通常大于調制速率,使得交換使用波特和比特/秒有時會產生錯誤。
但是在現代的實際使用中,多數情況下,配置了MCU的波特率后,對輸出信號進行觀測發現,此時波特率就等于比特率。也正是因為此時傳輸的符號即8bit一個Byte的數據量,從而波特率等于比特率。
其中,fck為 USART 時鐘。USARTDIV 是一個存放在波特率寄存器(USART_BRR)的一個無符號定點數。DIV_Mantissa[11:0]位定義 USARTDIV 的整數部分,DIV_Fraction[3:0]位定義 USARTDIV 的小數部分。例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時 USART_BRR 值為0x18A;那么USARTDIV的小數位10/16=0.625;整數位24,最終USARTDIV的值為24.625。
如果拿到一塊板子或者一套設備,但沒有源碼程序,純靠硬件抓取通信串口的數據內容,首先利用示波器觀測每個bit的寬度,后換算成比特率,這時候比特率基本上就是波特率了。利用串口助手模塊,在PC端下載個串口助手,設置匹配的波特率進行數據抓取。
比如抓到波形116us/bit, 直接轉換得:1bit/116us = 1 bit/(116/1000000)s = 8620.68 bit/s,此時配置串口助手的波特率,利用串口助手模塊與被測信號管腳進行連接,即可實現串口數據的抓取。
2)數據格式
起始位:數據線空閑狀態為高電平,要發送數據時將其拉低一個時鐘周期表示起始位。
數據位:使用校驗位時,數據位可以有5~8位;如果不使用校驗位,數據位可以達9位。
校驗位:奇偶校驗,保證包括校驗位和數據位在內的所有位中1的個數為奇數或偶數。
停止位:為了表示數據包發送的結束,發送端需要將信號線從低電平變為高電平,并至少保持2個時鐘周期。
3)流控制
流控制,俗話說就是“握手”。流控制的作用,在不同處理性能的設備之間,數據傳輸之前,接收方會以“流控制”來通知發送方,是否可以繼續進行接下來的數據傳輸。這樣的應用場景多見于計算機與低性能的微控制器通信,也可見于PC與打印機之間進行的數據傳輸,該特點都是接收方的接收緩存已滿或處理事務較慢時,從而需要流控制來告知發送方稍后再發送。
流控制的方式分別有軟件和硬件兩種。
軟件的流控制方式,在UART通信中,只需RxD、TxD、GND三根即可,數據在傳輸過程中,依靠代碼的判斷處理,并通過收發雙方進行的數據交互完成控制,在現有通信物理信號線基礎上,使用控制字符(ASCII表中的0x00~0x0x1F、0x7F)完成控制指令的交互。一般在私有協議下也會定義一些特殊字符設為控制指令。
硬件的流控制方式,即在原有的RxD、TxD、GND三根信號線的基礎上,再增加RTS/CTS和DTR/DSR這兩組信號線。第一組線是RTS(Request toSend)和CTS(Clear toSend)。當接收方準備好接收數據,它置高RTS線表示它準備好了,如果發送方也就緒,它置高CTS,表示它即將發送數據。第二組線是DTR(DataTerminal Ready)和DSR(Data SetReady)。這些線主要用于Modem通信。使得串口和Modem通信他們的狀態。例如:當Modem已經準備好接收來自PC的數據,它置高DTR線,表示和電話線的連接已經建立。讀取DSR線置高,PC機開始發送數據。一個簡單的規則是DTR/DSR用于表示系統通信就緒,而RTS/CTS用于單個數據包的傳輸。
3、UART的優缺點
1)優點
只使用兩根電線,不需要時鐘信號。有一個奇偶校驗位,只要雙方設置后,就可以改變數據包的結構
2)缺點
數據幀的大小限制為最多9位,不支持多個從屬或多個主系統,每個UART的波特率必須在10%之內
二、SPI
參考文章,?SPI、I2C、UART、CAN_一只大笨貓的博客-CSDN博客
SPI,Serial Peripheral interface,顧名思義就是串行外圍設備接口,是Motorola首先在其MC68HCXX系列處理器上定義的。SPI總線是微控制器四線的外部總線(相對于內部總線)。與IIC不同,SPI沒有明文標準,只是一種事實標準,對通信操作的實現只作一般的抽象描述,芯片廠商與驅動開發者通過data sheets和application notes溝通實現上的細節。
SPI接口主要應用在EEPROM、FLASH、實時時鐘、AD轉換器,還有數字信號處理器和數字信號解碼器之間。SPI是一種高速,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便,正是出于這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議,比如AT91RM9200。
SPI分為主、從兩種模式,一個SPI通訊系統需要包含一個(且只能是一個)主設備,一個或多個從設備。SPI接口的讀寫操作,都是由主設備發起。當存在多個從設備時,通過各自的片選信號進行管理。
1、SPI使用的四根信號線
SCLK: Serial Clock (output from master):串行時鐘,用來同步數據傳輸,由主機輸出;
MOSI SIMO: Master Output, Slave Input(output from master):主機輸出從機輸入數據線,通常先傳輸MSB;
MISO SOMI: Master Input, Slave Output(output from slave):主機輸入從機輸出數據線,通常先傳輸LSB;
SS: Slave Select (active low, output from master):片選線,低電平有效,由主機輸出。
SSCS:控制芯片是否被選中的,也就是說只有片選信號為預先規定的使能信號時(一般默認為低電位),對此芯片的操作才有效,這就允許在同一總線上連接多個SPI設備成為可能。也就是說:當有多個從設備的時候,因為每個從設備上都有一個片選引腳接入到主設備機中,當我們的主設備和某個從設備通信時將需要將從設備對應的片選引腳電平拉低。
2、SPI的四種操作模式
SPI的四種操作模式,它們的區別是定義了在時鐘脈沖的哪條邊沿轉換(toggles)輸出信號,哪條邊沿采樣輸入信號,還有時鐘脈沖的穩定電平值(就是時鐘信號無效時是高還低)。
對于STM32等MCU自帶的硬件SPI外設來說,可能沒有那么重要,只需要配置一下模式就行了,但是對于使用使用GPIO模擬或者FPGA來實現SPI的時序,這一點是非常非常重要的。
Master 設備會根據將要交換的數據來產生相應的時鐘脈沖(Clock Pulse),時鐘脈沖組成了時鐘信號(Clock Signal) ,每種模式由時鐘信號中的時鐘極性(clock polarity)CPOL與時鐘周期(clock phase)CPHA來定義。
不同的從設備可能在出廠是就是配置為某種模式,這是不能改變的,但我們的通信雙方必須是工作在同一模式下,所以我們可以對我們的主設備的SPI模式進行配置,從而實現主從通訊。
時鐘極性CPOL是用來配置SCLK的電平出于哪種狀態時是空閑態或者有效態;時鐘相位CPHA是用來配置數據采樣是在第幾個邊沿。
CPOL=0,表示當SCLK=0時處于空閑態,所以有效狀態就是SCLK處于高電平時;
CPOL=1,表示當SCLK=1時處于空閑態,所以有效狀態就是SCLK處于低電平時;
CPHA=0,表示數據采樣是在第1個邊沿,數據發送在第2個邊沿;
CPHA=1,表示數據采樣是在第2個邊沿,數據發送在第1個邊沿。
在高電平有效狀態時,第一邊沿為上升沿,第二邊沿為下降沿;在低電平有效狀態時,第一邊沿為下降沿,第二邊沿為上升沿
具體四種模式如下:
CPOL = 0,CPHA = 0:時鐘高電平時為有效狀態,時鐘上升沿(第一個邊沿)采樣。
CPOL = 0,CPHA = 1:時鐘高電平時為有效狀態,時鐘下降沿(第二個邊沿)采樣。
CPOL = 1,CPHA = 0:時鐘低電平時為有效狀態,時鐘下降沿(第一個邊沿)采樣。
CPOL = 1,CPHA = 1:時鐘低電平時為有效狀態,時鐘上升沿(第二個邊沿)采樣。
3、SPI的數據交換
參考文章,不撐了不撐了:SPI通信協議介紹
SPI可分為主、從兩種模式,并且支持全雙工模式,所以這也就導致STM32的SPI接口比較復雜。比如:配置SPI為主模式、配置SPI為從模式、配置SPI為單工通信、配置SPI為雙工通信等等。
在每個 Clock 周期內,SPI 設備都會發送并接收一個 bit 大小的數據(不管主設備還是從設備),相當于該設備有一個 bit 大小的數據被交換了。
1)主從機的選擇:
SPI 規定了兩個 SPI 設備之間通信必須由主設備 (Master) 來控制次設備 (Slave)。一個 Master 設備可以通過提供 Clock 以及對 Slave 設備進行片選 (Slave Select) 來控制多個 Slave 設備,當我們的主設備和某個從設備通信時將需要將從設備對應的片選引腳電平拉低或者是拉高。SPI 協議還規定 Slave 設備的 Clock 由 Master 設備通過 SCK 管腳提供給 Slave 設備, Slave 設備本身不能產生或控制 Clock,沒有 Clock 則 Slave 設備不能正常工作。
2)數據交換的流程:
參考文章:曾小慶:SPI通信協議詳解(spi總線)
主機和從機都有一個串行移位寄存器(SSPSR)?。它的主要作用是根據?SPI 時鐘信號狀態,往 SSPBUF 里移入或者移出數據,每次移動的數據大小由 Bus-Width 以及 Channel-Width 所決定。Bus-Width 的作用是指定地址總線到 Master(主)設備之間數據傳輸的單位。Channel-Width 的作用是指定 Master(主)設備與 Slave(從)設備之間數據傳輸的單位。
主機通過向它的SPI串行寄存器寫入一個字節來發起一次傳輸。串行移位寄存器通過MOSI信號線將字節傳送給從機,同時從機也將自己的串行移位寄存器中的內容通過MISO信號線返回給主機。這樣,兩個移位寄存器中的內容就被交換。外設的寫操作和讀操作是同步完成的。如果只進行寫操作,主機只需忽略接收到的字節;反之,若主機要讀取從機的一個字節,就必須發送一個空字節來引發從機的傳輸。
SPI的時序其實很簡單,主要是在SCLK的控制下,數據按照從高位到低位的方式依次移出主機寄存器和從機寄存器,并且依次移入從機寄存器和主機寄存器。當寄存器中的內容全部移出時,相當于完成了兩個寄存器內容的交換。
假設主機的8位寄存器裝的是待發送的數據10101010,上升沿發送、下降沿接收、高位先發送。那么第一個上升沿來的時候,主機將會通過MOSI信號線傳輸給從機最高位1,自身寄存器變成0101010x。同時,MISO信號線會從從機處返回一個數據給主機,那么這時寄存器為0101010MISO,這樣在 8個時鐘脈沖以后,兩個寄存器的內容互相交換一次。這樣就完成里一個SPI時序。
主機和從機的發送數據是同時完成的,兩者的接收數據也是同時完成的。也就是說,當上升沿主機發送數據的時候,從機也發送了數據。所以為了保證主從機正確通信,應使得它們的SPI具有相同的時鐘極性和時鐘相位。
3)SPI的傳輸速率:
參考文章;王超:一文看懂SPI協議
SCLK的速率就是SPI的傳輸速率,SPI協議沒有一個固定的速率,不像I2C標準模式100K,快速模式400K,高速模式3.4M,SPI的傳輸速率取決于器件本身支持多高的速率。最初的標準定義總線速度為100kbps。經歷幾次修訂,主要是1995年的400kbps,1998的3.4Mbps。
4)SPI的傳輸的特點:
參考文章:對三種總線SPI、UART、I2C分析理解 - 接口/總線/驅動 - 電子發燒友網
SCLK時鐘線存在使得數據是一位一位傳輸的。由SCLK提供時鐘脈沖,SDI、SDO則基于此脈沖完成數據傳輸。數據輸出通過 SDO線,數據在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位數據傳輸,輸入也使用同樣原理。這樣的傳輸方式有一個優點,與普通的串行通訊不同,普通的串行通訊一次連續傳送至少8位數據,而SPI允許數據一位一位的傳送,甚至允許暫停,因為SCLK時鐘線由主控設備控制,當沒有時鐘跳變時,從設備不采集或傳送數據。也就是說,主設備通過對SCLK時鐘線的控制可以完成對通訊的控制。
主從設備必須使用相同的工作參數——SCLK、CPOL 和 CPHA,才能正常工作。如果有多個從設備,并且它們使用了不同的工作參數,那么主設備必須在讀寫不同從設備間重新配置這些參數。
參考文章:?華清遠見:史上講得最清楚的I2C和SPI總線協議
SPI也沒規定通信應答機制,沒有規定流控制規則。事實上,SPI主設備甚至并不知道指定的從設備是否存在。這些通信控制都得通過SPI協議以外自行實現。例如,要用SPI連接一支命令-響應控制型?解碼芯片,則必須在SPI的基礎上實現更高級的通信協議。SPI并不關心物理接口的電氣特性,例如信號的標準電壓。在最初,大多數SPI應用都是使用間斷性時鐘脈沖和以字節為單位傳輸數據的,但現在有很多變種實現了連續性時間脈沖和任意長度的數據幀。
三、IIC
參考文章:SPI、I2C、UART、CAN_一只大笨貓的博客-CSDN博客_i2c spi
IIC(Inter-Integrated Circuit)開發于1982年,當時是為了給電視機內的CPU和外圍芯片提供更簡易的互聯方式。電視機是最早的嵌入式系統之一,而最初的嵌入系統是使用內存映射(memory-mapped I/O)的方式來互聯微控制器和外圍設備的。要實現內存映射,設備必須并聯入微控制器的數據線和地址線,這種方式在連接多個外設時需大量線路和額外地址解碼芯片,很不方便并且成本高。為了節省微控制器的引腳和和額外的邏輯芯片,使印刷電路板更簡單,成本更低,位于荷蘭的Philips實驗室開發了IIC ,一種只使用二根線接連所有外圍芯片的總線協議。
IIC 是多主設備的總線,IIC沒有物理的芯片選擇信號線,沒有仲裁邏輯電路,只使用serial data (SDA)數據線?和?serial clock(SCL)時鐘線兩條信號線,數據線用來傳輸數據,時鐘線用來同步數據收發。兩根信號線都是雙向傳輸的,這兩條線都是漏極開路或者集電極開路結構,使用時需要外加上拉電阻,可以掛載多個設備。
1、IIC的傳輸流程
參考文章:Kevin Zhang:硬件知識——IIC傳輸
IIC協議標準規定發起通信的設備稱為主設備,主設備發起一次通信后,其它設備均為從設備。
1)IIC 通信過程大致如下
首先,主設備發一個START信號。然后其它設備開始監聽總線以準備接收數據。當START起始信號產生后,I2C總線就處于被占用的狀態,當停止信號產生后,總線就處于空閑狀態。
接著,主設備發送一個8位的數據幀(IIC規定數據幀大小必須為8位的字節),包括7位設備地址數據幀(每一個IIC設備都有一個唯一的七位設備地址)和?1位的讀寫操作的數據幀(讀/寫位用于確定主設備是向從設備發送數據還是主設備從從設備接受數據,0代表寫,1代表讀)。
當所有設備接收到數據后,比對地址自己是否為目標設備。如果比對不符,設備進入等待狀態,等待STOP信號的來臨;如果比對相符,該設備會發送一個應答信號ACKNOWLEDGE作回應。這時主設備就和該從設備建立了連接。
當主設備收到應答后便開始傳送或接收數據。數據幀大小為8位,尾隨一位的應答信號。主設備發送數據,從設備應答;相反主設備接收數據,主設備應答。
當數據傳送完畢,主設備發送一個STOP信號,向其它設備宣告釋放總線,其它設備回到初始狀態。
2)兩條數據線在各個通訊過程中高低電平的狀態
參考文章:Serendipity:Linux驅動篇(七)——I2C(一)
空閑時SDA和SCL被拉高,處于高電平的位置。連到IIC總線上的任一設備輸出低電平都會把總線信號拉低,即各器件的SDA和SCL都是與的關系。根據這兩條線的高低電平、上升沿、下降沿就可以實現主機與I2C設備的通訊。
開始與結束:當SCL保持高電平期間,SDA從高電平跳變到低電平,即為開始條件START。當SCL保持高電平期間,SDA從低電平跳變到高電平,即為結束條件STOP。
傳輸:IIC總線標準規定SDA線的數據轉換必須在SCL線的低電平期。在SCL線的高電平期,SDA線的上數據是穩定不變的。數據傳輸時先傳數據位。
主設備在SCL線上產生每個時鐘脈沖的過程中將在SDA線上傳輸一個數據位,當一個字節按數據位從高位到低位的順序傳輸完后,緊接著,從設備在每個字節后的第9個時鐘周期將SDA保持低電平進行確認數據,回傳給主設備一個ACK,此時才認為一個字節真正的被傳輸完成。
當然,并不是所有的字節傳輸都必須有一個ACK,比如:當從設備不能再接收主設備發送的數據時,從設備將回傳一個否定ACK,SDA線為高表示否定ACK。
應答:當IIC主機(不一定是發送端還是接受端)將8位數據或命令傳出后,會將SDA信號設置為輸入,等待從機應答(等待SDA由高電平拉為低電平)。若從機正確應答,表明數據或者命令傳輸成功,否則傳輸失敗,注意,應答信號是數據接收方發送給數據發送方的。
3、IIC的一些拓展知識
參考文章:華清遠見:史上講得最清楚的I2C和SPI總線協議
1)10位設備地址
任何IIC設備都有一個7位地址,理論上,現實中只能有127種不同的IIC設備。實際上,已有IIC的設備種類遠遠多于這個限制,在一條總線上出現相同的地址的IIC設備的概率相當高。為了突破這個限制,很多設備使用了雙重地址——7位地址加引腳地址(external configuration pins)。IIC 標準也預知了這種限制,提出10位的地址方案。
2)設備沖突的解決辦法
如果有兩個設備同時向SCL線和SDA線發送信息,基于IIC總線的設計,線路上不可能出現電平沖突現象。如果一支設備發送邏輯0,其它發送邏輯1,那么線路看到的只有邏輯0。也就是說,如果出現電平沖突,發送邏輯0的始終是“贏家”。
總線的物理結構亦允許主設備在往總線寫數據的同時讀取數據。這樣,任何設備都可以檢測沖突的發生。當兩支主設備競爭總線的時候,“贏家”并不知道競爭的發生,只有“輸家”發現了沖突——當它寫一個邏輯1,卻讀到0時——而退出競爭。
3)IIC的傳輸速率
IIC 數據傳輸速率有標準模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些變種實現了低速模式(10 kbps)和快速+模式(1 Mbps)。
四、三種通訊方式的特點與區別:
同步通訊:I2C,SPI 異步通訊:UART
采集數據是否用的是時鐘的沿,如果是時鐘沿采數據,同步傳輸,如果電平采集數據是異步。串口接受數據其實就是一個串轉并的過程。
SPI和UART可以實現全雙工,但I2C不行
IIC 和 SPI 這兩種通信協議非常適合近距離低速芯片間通信。通信方式都是短距離的,芯片和芯片之間或者其他元器件如傳感器和芯片之間的通信。SPI和IIC是板上通信,IIC有時也會做板間通信,不過距離甚短,不過超過一米,例如一些觸摸屏,手機液晶屏那些薄膜排線很多用IIC,IIC能用于替代標準的并行總線,能連接的各種集成電路和功能模塊。
I2C是多主控總線,所以任何一個設備都能像主控器一樣工作,并控制總線。總線上每一個設備都有一個獨一無二的地址,根據設備它們自己的能力,它們可以作為發射器或接收器工作。多路微控制器能在同一個I2C總線上共存這兩種線屬于低速傳輸。
編輯:黃飛
?
評論