1. 程式人生 > 實用技巧 >【北京迅為】i.MX6ULL終結者串列埠通訊例程串列埠簡介

【北京迅為】i.MX6ULL終結者串列埠通訊例程串列埠簡介

序列介面簡稱串列埠,也稱序列通訊介面或序列通訊介面(通常指COM介面),是採用序列通訊方式的擴充套件介面。序列介面(Serial Interface)是指資料一位一位地順序傳送。其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用於遠距離通訊,但傳送速度較慢。

序列介面 (Serial Interface) 是指資料一位一位地順序傳送,其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用於遠距離通訊,但傳送速度較慢。一條資訊的各位資料被逐位按順序傳送的通訊方式稱為序列通訊。序列通訊的特點是:資料位的傳送,按位順序進行,最少只需一根傳輸線即可完成;成本低但傳送速度慢。序列通訊的距離可以從幾米到幾千米;根據資訊的傳送方向,序列通訊可以進一步分為單工、半雙工和全雙工三種。

串列埠的出現是在1980年前後,資料傳輸率是115kbps~230kbps。串口出現的初期是為了實現連線計算機外設的目的,初期串列埠一般用來連線滑鼠和外接Modem以及老式攝像頭和寫字板等裝置。串列埠也可以應用於兩臺計算機(或裝置)之間的互聯及資料傳輸。由於串列埠(COM)不支援熱插拔及傳輸速率較低,部分新主機板和大部分便攜電腦已開始取消該介面。串列埠多用於工控和測量裝置以及部分通訊裝置中。

按照介面劃分標準可以分為同步序列介面(SSI)和非同步序列(UART)。我們用到的串列埠就是非同步傳輸的(UART)。

UART作為非同步串列埠通訊協議的一種,工作原理是將傳輸資料的每個字元一位接一位地傳輸。其中各位的意義如下:

起始位:先發出一個邏輯”0”的訊號,表示傳輸字元的開始。
資料位:資料位的個數可以是4、5、6、7、8等,構成一個字元。通常採用ASCII碼。從最低位開始傳送,靠時鐘定位。
奇偶校驗位:資料位加上這一位後,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。
停止位:它是一個字元資料的結束標誌。可以是1位、1.5位、2位的高電平。由於資料是在傳輸線上定時的,並且每一個裝置有其自己的時鐘,很可能在通訊中兩臺裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢。
空閒位:處於邏輯“1”狀態,表示當前線路上沒有資料傳送。
波特率:是衡量資料傳送速率的指標。表示每秒鐘傳送的符號數(symbol)。一個符號代表的資訊量(位元數)與符號的階數有關。例如傳輸使用256階符號,每8bit代表一個符號,資料傳送速率為120字元/秒,則波特率就是120baud,位元率是120*8=960bit/s。這兩者的概念很容易搞錯。

UART分為TTL電平和RS232電平兩種。TTL電平是就是指我們的處理器上具有串列埠功能的引腳直接引出來,他的電平就是TTL的(高電平表示1,低電平表示0)。RS232是TTL電平通過一個232的晶片轉換出來的,-3v到-15v表示1,+3v到+15v表示1。

由於現在的電腦基本都沒有外接串列埠了,但是串列埠裝置在我們嵌入開發中非常常用,為了解決這個問題,市面上出現了很多的usb轉串列埠模組,他們用到的usb轉串列埠晶片有ch340,pl2303等等。
我們的i.MX6 ULL終結者底板上線集成了一路USB傳串列埠介面,我們只需要使用一根mini USB資料線,一端連線電腦,另一端連線開發板的USB-UART介面,如圖 1:
在這裡插入圖片描述

圖 1

接下來我們來看下i.MX6ULL晶片的UART特性:
1.相容高速TIA/EIA-232-F,最大速率能到5.0Mbit/s
2.支援低速的序列IR介面,IRDA介面,最大速率能到115.2Kbit/s
3.支援9位或者多點485模式(自動檢測從地址)
4.7位或8位資料位,9位485模式
5.1位或2位停止位
6.支援奇偶校驗
7.支援硬體流控
8.可以通過CTS_B控制485的傳輸方向
9.波特率自動檢測功能,最高速率到115.2Kbit/s
10.資料收發引腳可以互相轉換

I.MX6ULL的UART的功能很多,我們這裡只用到最基本的資料收發功能,關於其他功能,大家可以參考《I.MX6ULL 參考手冊.pdf》第五十五章。

我們使用UART必須要設定對應的時鐘源以及分頻值,關於UART的時鐘,我們可以參考《I.MX6ULL 參考手冊.pdf》的第18章Clock Controller Module (CCM),我們在該章節的18.3 CCM Clock Tree小節,可以看到UART的時鐘使能位由暫存器CCM_CSCDR1的UART_CLK_SEL位來決定,CCM_CSCDR1的UART_CLK_PODF位設定分頻,如圖 2所示:
在這裡插入圖片描述

圖 2

然後我們來看下CCM_CSCDR1暫存器的結構,如圖 3所示:
在這裡插入圖片描述

圖 3

我們可以看到該暫存器與UART相關的分別是:
UART_CLK_SEL(bit 6):選擇時鐘源,為0的時候選擇pll3_80m,為1的時候選擇osc_clk,我們的例程選擇pll3_80m作為時鐘源。

UART_CLK_PODF(bit5:bit0):串列埠時鐘的分頻引數。我們的例程設定成1分頻(相當於不分頻),最終UART的輸入時鐘就是pll3_80m的時鐘(80MHz)。

接下來我們看下跟串列埠相關的幾個暫存器。首先第一個是串列埠接收暫存器UARTx_URXD,結構圖如圖 4所示:
在這裡插入圖片描述

圖 4

該暫存器的bit31到bit16作為保留。
CHARRDY(bit15):接收字元就緒標誌位,如果UART接收到的資料準備就緒,可以讀取了,該位為1,如果接收資料沒有準備好,該位為0。
Bit14到bit10是一些錯誤標誌位。
Bit9:bit8作為保留。
RX_DATA(bit7:bit0):接收到的資料。

然後是UART的傳送暫存器UARTx_UTXD,結構圖如圖 5所示:
在這裡插入圖片描述

圖 5

我們從上圖可以看到bit31:bit8作為保留,沒有用到。
TX_DATA(bit7:bit0):傳送資料位。

然後是UART控制暫存器1 UARTx_UCR1,結構圖如圖 6所示:
在這裡插入圖片描述

圖 6

我們看到該暫存器的bit31:bit16作為保留了。
ADEN(bit15):波特率自動檢測中斷使能,為0的時候關閉波特率自動檢測中斷,為1的時候使能波特率自動檢測中斷。
ADBR(bit14):波特率自動檢測使能位。為0的時候關閉波特率自動檢測,為1的時候使能波特率自動經檢測。
TRDYEN(bit13):傳輸就緒中斷使能位。
IDEN(bit12):空閒狀態檢測中斷使能位。
ICD(bit11:bit10):空閒狀態檢測。
RRDYEN(bit9):接受就緒中斷使能位。
RXDMAEN(bit8):DMA接收使能。
Bit7:bit1我們在例程中暫時用不到,我就不一一列舉出來了。
UARTEN(bit0):UART使能位。為0的時候關閉UART,為1的時候使能UART。

然後是串列埠控制暫存器2 UARTx_UCR2,結構圖如圖 7所示:
在這裡插入圖片描述

圖 7

該暫存器的bit31:bit16作為保留。
ESCI(bit15):轉義序列中斷使能位。
IRTS(bit14):RTS引腳使能位。
CTSC(bit13):CTS引腳使能位。
Bit12:bit9本例程我們沒有使用到。
PREN(bit8):奇偶校驗使能位。為0關閉奇偶校驗,為1使能奇偶校驗
PROE(bit7):奇偶校驗選擇位。為0是偶校驗,為1是奇校驗。
STPB(bit6):停止位個數選擇位。為0的時候1位停止位,為1的時候2位停止位
WS(bit5):資料位長度。為0的時候7位資料位,為1的時候8位資料位。
RTSEN(bit4):請求傳送中斷使能位。為0關閉,為1使能。
ATEN(bit3):啟用老化計時器位。為0是關閉,為1是使能。
TXEN(bit2):傳送使能位。為0關閉傳送,為1使能傳送
RXEN(bit1):接收使能位。為0關閉接收,為1使能接收。
SRST(bit0):軟體復位。為0的時候復位。

然後是UART的控制暫存器3 UARTx_UCR3,結構圖如圖8所示:
在這裡插入圖片描述

圖 8

在該暫存器中,我們只需要設定RXDMUXSEL(bit2)為1即可。
接下來我們看下UART的UARTx_UFCR,UARTx_UBIR,UARTx_UBMR。這三個暫存器決定串列埠的波特率。波特率的計算公式:
Baud Rate = Freq/(16x((UARTx_UBMR+1)/(UARTx_UBIR+1)));
其中的Freq:經過分頻以後進入UART的時鐘,然後該時鐘通過暫存器UARTx_UFCR的RFDIV(bit9:bit7)在分頻得到的最終時鐘。

RFDIV(bit9:bit7)是三位表示,根據手冊我們可以得到下表:
RFDIV(bit9:bit7) 分頻
000 6分頻
001 5分頻
010 4分頻
011 3分頻
100 2分頻
101 1分頻
110 7分頻
111 保留

比如現在我們要設定UART的波特率為115200,那麼設定RFDIV為5(101b),參照上表就是1分頻,所以Freq=80MHz。,如果設定UARTx_UBIR為61,那麼UARTx_UBMR應該設定為3124。

關於UART的暫存器我們就介紹到這裡,如果想了解更多關於UART的知識,可以參考《I.MX6ULL 參考手冊.pdf》的第55章。我們使用UART1實現串列埠的通訊功能,所以我們需要做如下的步驟來實現:
1.設定UART1的時鐘源
2.初始化UART1,IO複用成UART模式,然後設定波特率,停止位,奇偶校驗位,資料位,停止位等等。
3.使能UART1。
4.實現UART1的收發函式。在這裡插入圖片描述