1. 程式人生 > >九.ARM裸機學習之串列埠通訊詳解1(串列埠通訊介面及原理框圖詳解)

九.ARM裸機學習之串列埠通訊詳解1(串列埠通訊介面及原理框圖詳解)

一.串列埠通訊的基本概念及原理理解 2017/11/12 22:52 1.同步通訊和非同步通訊: 非同步通訊:指通訊的傳送與接收裝置使用各自的時鐘控制資料的傳送和接收過程。為使雙方的收發協調,要求傳送和接收裝置的時鐘儘可能一致,即傳送方和接收方沒有統一的時鐘節拍、而各自按照自己的節拍工作。 非同步通訊是以字元(構成的幀)為單位進行傳輸,字元與字元之間的時間間隔是任意的,但每個字元中的各位是以固定的時間傳送的,即字元之間不一定有“位間隔”的整數倍的關係,但同一字元內的各位之間的距離均為“位間隔”的整數倍。如下圖所示。
同步通訊時要建立傳送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。此時,傳輸資料的位之間的距離均為“位間隔”的整數倍,同時傳送的字元間不留間隙,即
保持位同步關係,也保持字元同步關係。以上圖非同步通訊傳輸示意圖做參考。 2.電平訊號和差分訊號 (1)、電平訊號和差分訊號是用來描述通訊線路傳輸方式的。也就是說如何在通訊線路上表達1和0. (2)、電平訊號的傳輸線中有一個參考電平線(一般是GND),然後訊號線上的訊號值是由訊號線電平和參考電平線的電壓差決定。 (3)、差分訊號的傳輸線中沒有參考電平,所有都是訊號線。然後1和0的表達靠訊號線之間的電壓差。 總結:電平訊號的2根通訊線之間的電平差異容易受到干擾,傳輸容易失敗;差分訊號不容易受到干擾因此傳輸質量比較穩定,現代通訊一般都使用差分訊號,電平訊號幾乎沒有了。 總結2:看起來似乎相同根數的通訊線下,電平訊號要比差分訊號要快;但是實際還是差分訊號快,因為差分訊號抗干擾能力強,因此1個傳送週期更短。
3.並行序列通訊概念及特點 (1)並行通訊是指資料的各位同時在多根資料線上傳送或接收. 序列通訊是指使用一條資料線,將資料一位一位地依次傳輸,每一位資料佔據一個固定的時間長度。其只需要少數幾條線就可以。 (2)並行特點:控制簡單、傳輸速度快;由於傳輸線較多,長距離傳送時成本高且接收方的各位同時接收存在困難.訊號線佔用多。 (3)在系統間交換資訊,特別適用於計算機與計算機、計算機與外設之間的遠距離通訊. 序列特點:傳輸線少,長距離傳送時成本低,但資料的傳送控制比並行通訊複雜. 總結:其實這麼多年發展,最終勝出的是:非同步、序列、差分,譬如USB和網路通訊。 4.串列埠通訊的基本概念 4.1 串列埠通訊的特點:非同步、電平訊號、序列
(1)、非同步:串列埠通訊的傳送方和接收方之間是沒有統一的時鐘訊號的。 (2)、電平訊號:串列埠通訊出現的時間較早,速率較低,傳輸的距離較近,所以干擾還不太明顯,因此當時使用了電平訊號傳輸。後期出現的傳輸協議都改成差分訊號傳輸了。 (3)、序列通訊:串列埠通訊每次同時只能傳輸1個二進位制位。 4.2 RS232電平和TTL電平 (1)電平訊號是用訊號線電平減去參考線電平得到電壓差,這個電壓差決定傳輸值是1或0. (2)在電平訊號時多少V代表1,多少V代表0不是固定的,取決於電平標準。譬如RS232電平中-3V~-15V表示1;+3~+15V表示0;TTL電平則是+5V表示1,0V表示0. (3)不管哪種電平都是為了在傳輸線上表示1和0.區別在於適用的環境和條件不同。RS232的電平定義比較大,適合干擾大、距離遠的情況;TTL電平電壓範圍小,適合距離近且干擾小的情況。 總結:串列埠通訊時因為是非同步通訊,所以通訊雙方必須事先約定好通訊引數,這些通訊引數包括:波特率、資料位、奇偶校驗位、停止位(串列埠通訊中起始位定義是唯一的,所以一般不用選擇) 4.3 序列通訊的制式 單工:單向的(或者是收或者是發) 半雙工:(序列通訊)收/發不可同時進行 全雙工:(序列通訊)收/發可同時進行 如圖所示:
串列埠通訊線最少需要2根(GND和訊號線),可以實現單工通訊,也可以使用3根通訊線(Tx、Rx、GND)來實現全雙工。 5.S5PV210序列通訊介面詳解 5.1S5PV210的串列埠控制器工作原理框圖
(1)transmitter由傳送緩衝區和傳送移位器構成。我們要傳送資訊時,首先將資訊進行編碼(一般用ASCII碼)成二進位制流,然後將一幀資料(一般是8位)寫入傳送緩衝區(從這裡以後程式就不用管了,剩下的傳送部分是硬體自動的),傳送移位器會自動從傳送緩衝區中讀取一幀資料,然後自動移位(移位的目的是將一幀資料的各個位分別拿出來)將其傳送到Tx通訊線上。 (2)receiver由接收緩衝區和接收移位器構成。當有人通過串列埠線向我傳送資訊時,資訊通過Rx通訊線進入我的接收移位器,然後接收移位器自動移位將該二進位制位儲存入我的接收緩衝區,接收完一幀資料後receiver會產生一箇中斷給CPU,CPU收到中斷後即可知道receiver接收滿了一幀資料,就會來讀取這幀資料。 (3)串列埠控制器中有一個波特率發生器作用是產生串列埠傳送/接收的節拍時鐘。波特率發生器其實就是個時鐘分頻器,它的工作需要源時鐘(APB匯流排來),然後內部將源時鐘進行分頻(軟體設定暫存器來配置)得到目標時鐘,然後再用這個目標時鐘產生波特率(硬體自動的)。 5.2S5PV210序列通訊介面擴充套件功能詳解 FIFO模式及其作用 (1)典型的串列埠設計,傳送/接收緩衝區只有1位元組,每次傳送/接收只能處理1幀資料。這樣在微控制器中沒什麼問題,但是到複雜SoC中(一般有作業系統的)就會有問題,會導致效率低下,因為CPU需要不斷切換上下文。 (2)解決方案就是想辦法擴充套件串列埠控制器的傳送/接收緩衝區,譬如將傳送/接收緩衝器設定為64位元組,CPU一次過來直接給傳送緩衝區64位元組的待發送資料,然後transmitter慢慢發,發完再找CPU再要64位元組。但是串列埠控制器本來的傳送/接收緩衝區是固定的1位元組長度的,所以做了個變相的擴充套件,就是FIFO。 FIFO(資料結構中的先入先出佇列,這裡這個大的緩衝區叫FIFO是因為這個緩衝區的工作方式類似於FIFO這種資料結構。,例如OV7670等攝像頭的FIFO晶片,原理也一樣。 DMA模式及其作用 (1)DMA direct memory access,直接記憶體訪問。DMA本來是DSP中的一種技術,DMA技術的核心就是在交換資料時不需要CPU參與,模組可以自己完成。例如STM32的內部DMA暫存器 (2)DMA模式要解決的問題和上面FIFO模式是同一個問題,就是串列埠傳送/接收要頻繁的折騰CPU造成CPU反覆切換上下文導致系統效率低下。 (3)傳統的串列埠工作方式(無FIFO無DMA)效率是最低的,適合低端微控制器;高階微控制器上CPU事物繁忙所以都需要串列埠能夠自己完成大量資料傳送/接收。這時候就需要FIFO或者DMA模式。FIFO模式是一種輕量級的解決方案,DMA模式適合大量資料迸發式的傳送/接收時。 IrDA模式及其用法 (1)IrDA其實就是紅外線通訊 (2)紅外通訊的原理是傳送方固定間隔時間向接收方傳送紅外訊號(表示1或0)或者不傳送紅外訊號(表示0或者1),接收方每隔固定時間去判斷有無紅外線訊號來接收1和0. (3)分析可知,紅外通訊和串列埠通訊非常像,都是每隔固定時間傳送1或者0(判斷1或0的物理方式不同)給接收方來通訊。因此210就利用串列埠通訊來實現了紅外發送和接收。 (4)210的某個串列埠支援IrDA模式,開啟紅外模式後,我們只需要向串列埠寫資料,這些資料就會以紅外光的方式向外發射出去(當然是需要一些外部硬體支援的),然後接收方接收這些紅外資料即可解碼得到我們的傳送資訊。 5.3S5PV210序列通訊與中斷與時鐘設計 5.3.1、序列通訊與中斷的關係 (1)傳送方可以選擇使用中斷,也可以選擇不使用中斷。
  • 使用中斷:傳送方先設定好中斷並繫結一箇中斷處理程式,然後傳送方丟一幀資料給transmitter,transmitter傳送耗費一段時間來發送這一幀資料,這段時間內傳送方CPU可以去做別的事情,等transmitter傳送完成後會產生一個TXD中斷,該中斷會導致事先繫結的中斷處理程式執行,在中斷處理程式中CPU會切換回來繼續給transmitter放一幀資料,然後CPU切換離開;
  • 不使用中斷:傳送方事先禁止TXD中斷(當然也不需要給相應的中斷處理程式了),傳送方CPU給一幀資料到transmitter,然後transmitter耗費一段時間來發送這幀資料,這段時間CPU在這等著(CPU沒有切換去做別的事情),待發送方傳送完成後CPU再給它一幀資料繼續傳送直到所有資料發完。CPU是怎麼知道transmitter已經發送完了?有一個狀態暫存器,狀態暫存器中有一個位叫傳送緩衝區空標誌,transmitter傳送完成(傳送緩衝區空了)就會給這個標誌位置位,CPU就是通過不斷查詢這個標誌位為1還是0來指導傳送是否已經完成的。
(2)因為串列埠通訊是非同步的,非同步的意思就是說傳送方佔主導權。也就是說傳送方隨時想發就能發,但是接收方只有時刻等待才不會丟失資料。所以這個差異就導致傳送方可以不用中斷,而接收方不得不使用中斷模式 5.3.2、210序列通訊介面的時鐘設計 (1)在S5PV210的串列埠控制器工作原理框圖中,串列埠控制器中有一個波特率發生器,所以,傳送transmitter和接收receiver都需要一個時鐘訊號,那麼這個時鐘從哪裡來?
  • 源時鐘訊號是外部APB匯流排(PCLK_PSYS,66MHz)提供給串列埠模組的(這就是為什麼我們說串列埠是掛在APB總線上的),在上一節總結的時鐘框架圖中,可以查閱到。
  • 然後進到串列埠控制器內部後給波特率發生器(實質上是一個分頻器),在波特率發生器中進行分頻,分頻後得到一個低頻時鐘,這個時鐘就是給transmitter和receiver使用的。
(2)串列埠通訊中時鐘的設定主要看暫存器設定。重點的有:
  • 暫存器源設定(為串列埠控制器選擇源時鐘,一般選擇為PCLK_PSYS,也可以是SCLK_UART),還有波特率發生器的2個暫存器。
(3)波特率發生器有2個重要暫存器
  • UBRDIVn和UDIVSLOTn,其中UBRDIVn是主要的設定波特率的暫存器,UDIVSLOTn是用來輔助設定的,目的是為了校準波特率的。