1. 程式人生 > >串列埠通訊初始化

串列埠通訊初始化

  序列通訊(UART)的全稱是:Universal asynchronous receiver/transmitter(通用非同步接收和傳送)

1.非同步通訊
  非同步通訊的特點:(1)傳送方和接收方是工作在兩個不同的時鐘頻率上的,也就是接收方有自己工作時的時鐘頻率,傳送方也有自己工作時的時鐘頻率。(2)在傳送資料的時候,所傳送的字元的時間間隔是可以任意的。因為它是按照字元為單位進行傳送的,每一個字元開頭都有一個開始位,結束時候有一個結束標誌位。因此,接收方就知道什麼時候開始接收資訊,什麼時候接收完資訊了。

  和非同步通訊不同的有同步通訊:(1)通訊雙方必須工作在同一個時鐘頻率上。所以傳送方在通訊前就要傳送一個時鐘訊號給接收方,讓接收方調整自己的時鐘頻率,來讓通訊雙方步伐一致。(2)通訊資料必須連續傳送,中間不可以有間隔。如果中間沒有資訊傳送,就以空字元來填充。這樣,就可以快速地傳送多個數據。

2.電平訊號
  電平訊號:一根訊號線和一根地線,訊號線上傳送高電平就為1,低電平就為0.

    電平訊號比較常用的可以分為TTL電平訊號和RS232電平訊號。

    TTL(Transistor-Transistor Logic)電平訊號:用在UART上和一些微控制器上,+5V表示1,0V表示0

    RS232電平:用在電腦上,-15V到-3V表示1,3V到15V表示0.

  差分訊號:有兩根訊號線,兩個訊號線上的訊號振幅相同,相位相反。抗干擾性強的原因就是:噪聲訊號在兩條訊號線上的差值為0.



3.序列介面
  序列介面:一條資料線加一條地線(或者兩條資料線加一條地線:一條接收,一條傳送),資料在資料線上是一位(bit)一位(bit)的傳輸過去的,這就是序列傳輸。

  並行介面:8條資料線,資料在每一條資料線也是一位一位傳輸的,8條資料線和一條地線,一次就可以傳8位(一個位元組)。

4.全雙工通訊
  全雙工通訊:可以同時接收和傳送資料。

  半雙工通訊:可以接收或者傳送資料,但是同一時間內,只能接收或者只能傳送。

  單工通訊:只能接收或者只能傳送資料。

(2)序列通訊細節部分
1.波特率
  波特率就是每一秒傳輸的bit位的個數,例如115200波特率,就是一秒鐘傳輸115200個bit位,摺合就是15KB每秒左右。通訊的之前要設定好波特率,其實就是時鐘頻率,例如115200波特率就是115200Hz。

2.起始位,資料位,奇偶校驗位和停止位
  我們的一個通訊單元就是:起始位+資料位+奇偶校驗位+停止位

  起始位:告訴對方開始通訊。資料位:要傳輸的資料(有5-8位可選)。奇偶校驗位:檢視資料是否出錯。停止位(有1,1.5,2個停止位可選):告訴對方一個通訊單元結束。


(3)S5PV210的串列埠支援的功能簡介 


  我們可以看到S5PV210中有四個UART介面:ch0,ch1,ch2,ch3.四個介面都支援紅外線接收和DMA或者中斷控制。

  還有:ch0有256個位元組的FIFO(First In First Out,先入先出,快取區),Ch1有64個位元組,ch2和ch3有16個位元組。

  還支援自動流控功能,和握手傳送或者接收功能。

(4)S5PV210的串列埠的工作流程簡介


  首先,我們的串列埠是工作在外圍裝置總線上的。

  傳送資料:在FIFO模式下,把我們的要傳送出去的資料放在傳送快取暫存器(Transmit Buffer Register)上,傳送快取暫存器就會自動(硬體自動,不需要我們插手了)把一個位元組的資料複製到傳送移位器(Transmit Shifter)上,開始傳送的時候,傳送移位器就會自動(硬體自動)地把一位(bit)一位資料放到傳送資料線上(TXDn),當傳送完之後,傳送快取暫存器再給一位元組資料傳送移位器,直到傳送快取暫存器內的資料傳送完了,這時候我們只需要向傳送快取暫存器放資料,它就又開始自動工作了。

  接收資料:在FIFO模式下,開始接收的時候,接收移位器(Receive Shifter)就會自動(硬體自動)地從接收資料線上(RXDn)一位(bit)一位資料地接收,當接收移位器接滿了一個位元組的時候,接收快取暫存器(Receive Buffer Register)就會自動複製這一位元組資料到接收快取暫存器上,然後接收移位器繼續接收資料,直到裝滿了整個接收快取暫存器,這時候我們只需要取走接收快取暫存器內的資料,它就又開始自動工作了。

總結:  要傳送資料,就向傳送快取暫存器(Transmit Buffer Register)上丟資料就可以了。

     要接收資料,就讀取接收快取暫存器(Receive Buffer Register)就可以了。

FIFO模式和NON-FIFO模式的區別:FIFO模式:整個快取暫存器都可以使用。Non-FIFO模式:只可以使用快取暫存器的一個位元組,這時候CPU必須時刻看著快取暫存器才不會遺漏資料。

(5)S5PV210的串列埠中斷模式,DMA模式和紅外線模式簡介
1.串列埠的中斷模式,也就是什麼情況下會觸發中斷


FIFO模式下:

  接收資料:(1)Rx FIFO內的資料多於你設定的那個水平的時候(可以不是滿的,也就是設定是快滿的時候)(2)超時(超過發三個字元的時間就算超時,不過你也可以自己設定超時的時間)

  傳送資料:(1)Tx FIFO內的資料少於你設定的那個水平的時候(可以不是全空的時候,也就是可以設定是快空的時候)

  錯誤中斷:有四種

Non-FIFO模式下:

  接收資料:滿的時候;傳送資料:空的時候;(因為它只有一個位元組)

2.DMA模式
  DMA(直接記憶體儲存)其實就是一大塊記憶體,和FIFO的功能一樣,不過比FIFO的記憶體空間大很多。你把資料放在DMA上,它就可以代替CPU,當FIFO空的時候,就向FIFO放資料。

3.紅外線模式
  開啟紅外線模式,我們只需要向串列埠寫資料,這些資料就會以紅外線的方式傳輸資訊給對方。

(5)S5PV210的串列埠的時鐘簡介


  時鐘來源是PCLK_PSYS:66.7MHz,也可以在clock controller那裡設定為SCLK_UART。然後經過UBDIV和UDIVSLOT分頻,得到最終的UCLK時鐘。



計算方式:這裡我們設定波特率是115200

  DIV_VAL = (66.7MHz/(115200x16))-1=36.08-1=35.19

然後,UBRDIVn = 35.  x/16 = 0.19 -> x = 3.04  然後查詢下表,可知:UDIVSLOTn = 0x0888;



(6)檢視原理圖,看串列埠接在哪個GPIO處


  上圖可知:我們的串列埠接在了GPA0_0和GPA0_1處(我們的程式碼只是設定了UART0)

(7)設定GPIO為UART模式。


  只要往GPA0CON[0]和GPA0CON[1]寫0x2就可以了,選擇0010

(8)關於串列埠的關鍵暫存器的設定:ULCON0,UCON0,UMCON0,UFCON0,UTRSTAT0,UTXH0,URXH0七個暫存器
1.ULCON0:設定資料位長度,停止位,奇偶校驗位,正常模式/紅外線模式。我們設定的值是0x3


2.UCON0:選擇DMA模式,中斷模式/輪詢模式,紅外線模式;選擇時鐘源。我們設定的值是0x5,選擇中斷或者輪詢模式。


3.UFCON:選擇FIFO模式的,我們設定的值是0,不使用FIFO模式。
4.UMCON:選擇中斷模式,自動流控,FIFO中斷水平這些的,我們設定為0,不使用中斷,使用輪詢方式。
5.UTRSTAT0:通過檢視這個暫存器,我們可以知道接收是否接收完和傳送是否傳送完的,如果第一位是1表示已經接收完,第二位是1表示已經發送完。
6.UTXH0:傳送快取暫存器,要傳送什麼資料,就往這個暫存器寫值就可以了。
7.URXH0:接收快取暫存器,讀取這個暫存器,就可以接收到別人通過串列埠發過來的資訊了