ARM芯片(S5PV210芯片)——串口通信详解
1、電子通信的基本概念
1.1、同步通信和異步通信
1.同步通信:通信雙方有統一的工作節拍,一般需要發送方給接收方發送信息的同時發送時鐘信號,接收方根據發送方給它的時鐘信號來安排自己的工作節奏。同步通信用在通信雙方信息交換頻率固定,或者通信頻率比較高的場景。
2.異步通信:又叫異步通知,簡單來說就是發送方不必考慮接收方,想發信息就發信息,沒有固定的工作節拍。但是需要遵循一定的通信協議,比如發送方發送信息時,需要先發起始位通知接收方,然后發送數據,數據發送完成要發結束位表示一幀數據發送完成。
區別:
(1)同步通信有統一工作節拍,異步通信沒有統一工作節拍。一般來說,同步通信的連接線里有一根是時鐘信號線。
(2)同步通信適合通信頻率固定或者通信頻率較高的場景;異步通信適合通信頻率不固定或者通信頻率較低的場景。
1.2、電平信號和差分信號
1.電平信號:電平信號有一根是參考電平線,信號線的信號值有信號線和參考電平線之間的電壓差決定;
2.差分信號:差分信號沒有參考電平線,傳輸一路數據需要兩根信號線,信號線的信號值由兩根信號線的電壓差決定。
區別:
(1)信號值的表示不同:電平信號的信號值是信號線和參考電平線的電壓差決定;差分信號的信息值是由兩條信號線的電壓差決定;
(2)傳輸相同路數的信號,電平信號用的數據線根數比差分信號少。比如傳輸3路信號,電平信號需要1根參考電平+3根數據線;而差分信號需要2x3=6根數據線;
(3)現在通信大部分是差分信號,因為差分信號的抗干擾性更強,可以在更短的周期傳輸一個數據。
1.3、并行接口和串行接口
并行接口:一次可以發送過個bit位數據。
串行接口:一次只能發送一個bit位數據。
區別:
(1)并行接口和串行接口一次發送的bit位不相同,串行一次只能發一個bit數據,并行接口可以一次發多位bit數據;
(2)并行接口的抗干擾性比串行接口差,雖然并行接口一次發送的數據位比串行接口多,但是因為抗干擾性差的原因,并行接口的發送頻率不能很高,串行接口的通信速率是可能比并行接口更快的;
(3)串行接口比并行接口更省信號線;
1.4、單工通信、雙工通信、半雙共通信
單工通信:只能單向發送消息,只能A向B發消息,B不能向A發消息;
雙工通信:A和B可以互相發消息,并且互不排斥,可以同時給對方發消息;
半雙工通信:A和B可以互相發消息,但是同一時間只能一方發消息,另一方收消息,算是單工通信和雙工通信的結合體;
2、串口通信介紹
2.1、串口通信的特點
串口通信:異步、電平信號、串行、雙工。
異步:串口的接收方和發送方沒有統一的時鐘信號;
電平信號:串口通信出現比較早,傳輸的距離比較近,所有用的電平信號。后期出現的通信協議,都改成了差分信號;
串行:每次只能傳輸一個二進制位;
雙工:通信雙方可以同時接收和發送信號。
2.2、波特率
指的就是串口的通信速率,也就是串口每秒能傳輸多少個二進制位。比如常用的波特率115200,也就是指串口每秒發送115200個二進制位。接收和發送必須使用相同的波特率,不然會通信紊亂,導致不能正常收發數據。
2.3、起始位、數據位、奇偶校驗位、停止位
(1)起始位:接收方收到該數據位就表示發送方馬上要發送數據了;
(2)數據位:本次傳輸周期里要傳輸的有效數據,可配置;
(3)奇偶校驗位:防止數據出錯的,可配置;
(4)停止位:表示本次傳輸周期結束,可配置;
總結:串口通信時,是以周期為單位進行收發數據的,既然是周期性的收發數據,那就要規定好周期的開啟和結束,也就是要提前商量好通信協議,上面的位定義就是通信
協議,在建立串口通信時要收發雙方配置一致;
2.4、通信線:Rx、Tx、GND
(1)Rx、Tx、GND是串口的通信線,Rx是接收數據的信號線,Tx是發送數據的信號線,GND是參考電平線,串口是全雙工通信;
(2)通信線的解法:發送方Rx–接收方Tx、發送方Tx–接收方Rx、發送方GND–接收方GND。
2.5、DB9接口、USB轉串口、4腳接口
(1)DB9接口:串口通信早期比較常用的規范化接口,有9根線,其中就包括Rx、Tx、GND,其余的6根線和流控有關。現在的串口通信一般都沒有
用流控,所以這6根線基本沒用,現在筆記本電腦上已經沒有DB9接口;
(2)4腳接口:現在的嵌入式設備上大多也沒有DB9接口,但是會引出來一個4腳的串口來輸出信息,方便調試。4腳串口就是在原來Rx、Tx、GND的基礎上,多了一根電源正極線。4腳的串口通常會會通過一個電路板來轉成DB9接口來對外通信;
(3)USB轉串口:現在的電腦可能沒有DB9接口,所以要使用USB轉串口線來連接開發板;
2.6、自動流控(AFC:Auto flow control)
自動流控和串口安全通信有關的,因為串口在早期是作為設備間數據交互的通路,必須確保通信數據的正確性。但是在現在串口大多作為打印信息輸出,并且通信速度也不快,就取消了自動流控。自動流控的細節就不講了,反正現在也用不上,在建立串口通信時記得把自動流控取消掉,就是不要勾選RTS/CTS。
3、串口工作原理框圖
(1)時鐘總線:串口屬于低速外設,掛載在PCLK_PSYS(Peripheral BUS)時鐘線上;
(2)組成:控制單元(control unit)、波特率發生器(Buad-rate Generator)、發送緩沖寄存器(Transmit Buffer Register)、發送移位器(Transmit Shifter)、
接收緩沖寄存器(Receive Buffer Register)、接收移位器(Receive Register);
(3)控制單元:控制整個串口的通信過程,什么時候發數據,什么時候收數據;
(4)波特率發生器:產生串口通信需要的波特率,和時鐘頻率有關,需要配置;
(5)發送緩沖寄存器:把要發送的數據寫到發送緩沖寄存器;
(6)發送移位器:把發送緩沖寄存器里的數據一位一位的發送到數據線上,這是硬件自動的;
(7)接收緩沖寄存器:保存接收到的數據;
(8)接收移位器:把數據線上接收到的數據一位一位的寫到接收緩沖寄存器里;
4、串行通信模式
4.1、FIFO模式
普通模式下串口只有一個發送緩沖寄存器和一個接收緩沖寄存器,CPU要不斷切換上下文去處理串口通信,這會導致效率低下,浪費CPU的性能。FIFO模式就是擴大緩沖寄存器的數量,從一個寄存器擴大到64個寄存器。這樣以前要一個字節處理一次串口通信變成64個字節才處理一次串口通信,
降低了CPU處理串口通信的頻率。這只是在一定程度上解決,當有大量數據要發送時FIFO模式還是不能滿足需求,于是就有了DMA模式。(每個串口的FIFO模式擴充的緩沖寄存器數量可能是不同的,有256、64、16,具體看數據手冊說明)
補充:
(1)FIFO(First In First Out)其實是一種數據結構的名字,數據按照先進先出的原則進行處理。叫FIFO模式是因為擴大的緩沖區類似FIFO這種數據結構,也是先進先出;
(2)FIFO模式在策略上就不能解決大量數據通信,因為不能無限的擴大緩沖寄存器的數量,在CPU中寄存器是有限且珍貴的;
4.2、DMA模式
DMA(direct memory access)模式是為了解決串口大量數據傳輸的,DMA模式下緩沖區不再是寄存器,而是劃定一塊內存用作緩沖區,這樣CPU就不用再頻繁去處理串口通信。
4.3、IrDA模式
(1)IrDA(Infrared)就是紅外線通信,電視機、空調的遙控器就是紅外線通信。紅外通信是發送方固定間隔向接收方發送紅外信號,這和串口通信是類似的,所以可以用串口通信來實現紅外通信;
(2)不是每個串口都支持IrDA模式,具體要查數據手冊;并且需要外部硬件支持,至少你得有一個紅外線的發送、模塊吧。
5、串行通信工作模式:輪詢模式、中斷模式
(1)輪詢方式::CPU不斷去查詢串口控制器的狀態位,當緩沖區空/滿時就去填充/獲取數據。這樣比較耗費CPU性能,但是程序簡單。
(2)中斷模式:當緩沖區空/滿時串口控制器會發出中斷信號,通知CPU去處理串口緩沖區的數據。這樣會降低CPU處理串口的頻率,但是需要用到終端,程序要復雜些。
總結:兩種方式各有優劣,串口通信是異步的,更契合中斷模式,但是輪詢方式勝在簡單。在uboot階段的串口通信時,我所接觸到的就是使用的輪詢模式,因為當uboot
進入到shell界面時,uboot就等著接受指令,CPU也不著急做其他的事情,浪費CPU性能也無所謂。
6、串行控制器的時鐘框圖
右邊虛線框里是UART的時鐘框圖,主要包括Clock_Selection、UCLK_Generator、Clock_Selection:可以通過UCON寄存器的10bit位選擇時鐘來源;UCLK_Generator:對上一步的時鐘源進行分頻,產生合適的波特率;分頻系數需要根據時鐘頻率和波特率進行計算,將計算好的分頻系數填到UBDIV和UDIVSLOT寄存器中。
7、串行通信的配置寄存器
7.1、ULCONn
配置校驗位、數據位、停止位、決定是否用IrDA模式。
7.2、UCONn寄存器
選擇是輪詢模式還是中斷模式、選擇時鐘來源
7.3、UMCONn寄存器
禁止modem、afc
7.4、UFCONn寄存器
FIFO模式的相關配置
7.5、UBRDIVn寄存器
UBRDIV寄存器的bit0-bit15保存的是串口時鐘的分頻系數整數部分;
7.6、UDIVSLOTn寄存器
UDIVSLOT寄存器的bit0-bit15保存的分頻系數的小數部分,但不是直接將小數部分寫入,而是要查表來確認寫入的值。
7.7、UTXHn寄存器
將要發送的數據寫到該寄存器;
7.8、URXHn寄存器
接收到的數據會保存到該寄存器;
8.1、波特率計算
(1) 分頻系數的計算公式:DIV_VAL = (PCLK / (bps x 16)) -1;
(2) 串口的時鐘來源是PCLOCK_PSYS=66MHZ,如果要將波特率設置成115200,根據上面的公式可得,DIV_VAL=(66000000/(115200x16)-1)=34.8;
(3) 于是UBRDIVn的值是34,小數部分是0.8,要根據小數來計算UDIVSLOTn的值;
8.2、UDIVSLOTn值計算
(1)UDIVSLOTn中的值滿足關系:UDIVSLOTn中1的個數除以16等于上面計算出的DIV_VAL的小數部分值。
(2)上面計算得小數部分是0.8,于是UDIVSLOTn中1的個數為0.8*16=12(向下取整),查表可知UDIVSLOTn應該填0XDDDD;
(3)按照上面的計算公式,只要知道UBRDIVn中有幾個1,UBRDIVn的值在滿足條件的情況下是任意的,但是實際卻是固定的,需要查表來轉換。這是因為這里計算分頻系數不是純數學計算,是要依賴具體的物理器件,物理器件有自己的物理特性,芯片開發工程師很了解,在表格里給了建議值,我們查表即可。
總結
以上是生活随笔為你收集整理的ARM芯片(S5PV210芯片)——串口通信详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM芯片的时钟系统详解(S5PV210
- 下一篇: 揭秘:微信解封一单30元纯利润的项目