第8章串行通信_第1頁
第8章串行通信_第2頁
第8章串行通信_第3頁
第8章串行通信_第4頁
第8章串行通信_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

主要內容1324S3C2410簡介I/O口時鐘與定時器中斷5UART6DMA第8章UART8.1UART工作原理1、UART(UniversalAsynchronousReceiverandTransmitter)通用異步收發(fā)器,是廣泛使用的串行數據傳輸方式。2、串行數據傳輸接口標準RS232C是通用的串行數據傳輸接口標準,常用DB9引腳,DB9引腳定義如下:3、串口之間的連接遠距離:串口->調制解調器后連接需要連接串口的各個引腳,串口完全連接近距離:串口之間直接連接常用簡單連接(三線連接),只連接發(fā)送數據線,接收數據線,地線波特率9600,傳輸距離不超過15米簡單連接完全連接4、UART字符傳輸格式

UART以字符為單位進行數據傳輸,每個字符的傳輸格式如下,一幀數據:

空閑位:高電平起始位:低電平數據位:5-8位校驗位:可選停止位:1或2位8.2S3C2410A的UART一、S3C2410UART端口簡介1、S3C2410提供3個獨立的異步串行端口UARTUART0,UART1,UART22、每個UART都可以運行于中斷模式或DMA模式,發(fā)出中斷請求和DMA請求實現在UART,CPU間的數據傳遞3、每個UART由波特率發(fā)生器、發(fā)送器、接收器以及控制單元組成。

UART數據傳輸過程:s2410UART的每個通道都有16字節(jié)的發(fā)送FIFO和16字節(jié)的接收FIFO。發(fā)送數據時,CPU先將數據寫入發(fā)送FIFO中,然后UART會自動將FIFO中的數據復制到“發(fā)送移位器”中,發(fā)送移位器將數據一位一位地發(fā)送到TXDn上。接收數據時,“接收移位器”將RXDn上的數據一位一位接收過來,然后復制到接收FIFO中,CPU即可從中讀取數據。

二、UART相關操作和模式包括數據發(fā)送、數據接收、中斷產生、波特率產生、回送模式、紅外模式和自動流控制1、數據發(fā)送數據的格式設置由ULCONn寄存器指定2、數據接收數據的格式設置由ULCONn寄存器指定3、自動流控制(AutoFlowControlAFC)兩個數據流控制信號nRTS(請求發(fā)送信號),nCTS(允許發(fā)送)自動流控制就是由nRTS和nCTS控制數據的發(fā)送注意:如UART與調制解調器相連,則必須禁止AFC

4、波特率發(fā)生器功能:為每個Uart的發(fā)送器和接收器提供時鐘波特率發(fā)生器操作:波特率時鐘=PCLK(UEXTCLK)/(16*16位因子)16位因子由波特率寄存器指定,UBRDIVnUBRDIVn=(int)(PCLK/(bps*16))-1UBRDIVn=(int)(UEXTCLK/(bps*16))-1例:波特率是115200,PCLK是40MHZ,那么UBRDIVn的值為:UBRDIVn=(int)(40000000/(115200*16))-1=(int)(27.1)-1=265、回送模式(測試模式)s2410的UART提供一種測試模式,可用于發(fā)現通信連接中的孤立錯誤。RXD與TXD直接相連發(fā)送的數據直接通過RXD接受,從而測試整個系統(tǒng)通過UCONn寄存器設置6、紅外模式s2410的UART支持紅外的發(fā)送和接受,通過ULCONn寄存器設置三、UART使用流程1、選擇涉及引腳位UART功能,GPH2~GPH7對應三個UART的RXD,TXD引腳2、設置波特率,傳輸格式(多少個數據位,校驗位,和停止位等)3、選擇UART通道的工作模式位查詢,中斷或DMA模式4、發(fā)送寫入發(fā)送寄存器接受讀接收寄存器的值6、查詢狀態(tài)寄存器或設置中斷來了解數據是否發(fā)送完畢或是否接受完畢實例1:使用2410的UART0實現數據的發(fā)送和接受,從UART0接受到PC機發(fā)送的數據后,通過UART0發(fā)送到PC機,在終端上進行顯示。波特率115200,1位停止位,無奇偶校驗,8位數據位,使用查詢方式。四、與UART相關的寄存器UART行控制寄存器(ULCONn)UART控制寄存器(UCONn)UARTFIFO控制寄存器(UFCONn)UARTModem控制寄存器(UMCONn)UARTTX/RX狀態(tài)寄存器(UTRSTATn)UART發(fā)送緩沖寄存器(UTXHn)UART接收緩沖寄存器(URXHn)UART波特率因子寄存器(UBRDIVn)

四、與UART相關的寄存器1、UBRDIVn(UARTbandratedivisor)功能:設置波特率發(fā)生器n=0,1,2地址:UBRDIV0:0x50000028UBRDIV1:0x50004028UBRDIV2:0x50008028UBRDIVn=(int)(PCLK/(bps*16))-1UBRDIVn=(int)(UEXTCLK/(bps*16))-1#definerULCON0(*(volatileunsigned*)0x50000000)//UART0行控制寄存器#definerUCON0(*(volatileunsigned*)0x50000004)//UART0控制寄存器#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFO控制寄存器#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modem控制寄存器#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rx狀態(tài)寄存器#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rx錯誤狀態(tài)寄存器#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFO狀態(tài)寄存器#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modem狀態(tài)寄存器#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0波特率因子寄存器……voidUart_Init(intpclk,intbaud){inti;if(pclk==0)pclk=PCLK;rUFCON0=0x0;//UART0FIFO控制寄存器,FIFO禁止rUFCON1=0x0;//UART1FIFO控制寄存器,FIFO禁止rUFCON2=0x0;//UART2FIFO控制寄存器,FIFO禁止rUMCON0=0x0;//UART0MODEM控制寄存器,AFC禁止rUMCON1=0x0;//UART1MODEM控制寄存器,AFC禁止//UART0rULCON0=0x3;//行控制寄存器:正常模式,無奇偶校驗,1位停止位,8位數據位。rUCON0=0x245;//控制寄存器

rUBRDIV0=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

……}1、ULCONn(UARTlinecontrol)UART行控制寄存器功能:設置傳輸格式地址:表8.1位【6】:紅外/正常模式選擇

0--正常模式;1--紅外模式位【5:3】:奇偶校驗模式選擇

0xx--無奇偶校驗;100--奇校驗;101--偶校驗110--強制校驗1;111--強制校驗0位【2】:停止位選擇

0--1個停止位;1—2個停止位位【1:0】:字長00—5位;01---6位;10---7位;11—8位Uart_Init函數中:rULCON0=0x3;//行控制寄存器:正常模式,無奇偶校驗,1位停止位,8位數據位。2、UCONn(UARTcontrol)UART控制寄存器功能:用于選擇UART時鐘源,設置UART中斷方式地址:表8.2位【10】:選擇使用的時鐘

0—使用PCLK1----使用UEXTCLK位【9】:發(fā)送中斷類型0—脈沖1---電平位【8】:接受中斷類型

0—脈沖1---電平位【7】:使能/禁止RX接收超時中斷

0—禁止1----使能位【6】:使能/禁止接收錯誤中斷(如幀錯誤,溢出錯誤)0—禁止1----使能位【5】:回送模式選擇

0---正常模式1----回送模式位【4】:選擇是否在一幀數據中發(fā)送間隔信號

0----不發(fā)送1------發(fā)送位【3:2】:選擇如何將TX數據發(fā)送到緩沖寄存器中00---禁止01---中斷方式或查詢方式10---DMA0,DMA3請求11----DMA1請求位【1:0】:選擇如何將RX數據接收到緩沖寄存器中00---禁止01---中斷方式或查詢方式10---DMA0,DMA3請求11----DMA1請求

rUCON0=(0<<10)|(1<<9)|(0<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1);或rUCON0=0x245;3、UFCONn寄存器(UARTFIFOCONTROL)UARTFIFO控制寄存器功能:用于設置是否使用FIFO,設置FIFO的觸發(fā)閾值地址:表8.3注意:不使用FIFO時,FIFO深度位1寄存器各位描述見表8.3本例中,不使用FIFO

rUFCON0=0x0;//UART0FIFO控制寄存器,FIFO禁止rUFCON1=0x0;rUFCON2=0x0;即發(fā)送FIFO中有多少個數據時產生中斷,接收FIFO中有多少個數據時產生中斷4、UMCONn(UARTmodemcontrol)UARTMODEM控制器功能:用于設置調制解調器相連的控制信號地址:表8.4位含義:表8.4關鍵:設置使用AFC,還是調制解調器,使用調制解調器則用軟件控制RTS等信號。程序中:AFC(自動流控制)禁止rUMCON0=0x0;//UART0MODEM控制寄存器,AFC禁止rUMCON01=0x0;5、URTSTATn寄存器(UARTTX/RXstatus)發(fā)送/接收狀態(tài)寄存器功能:用來指示發(fā)送和接收的狀態(tài),見表8.5地址:URTSTAT0->0x50000010URTSTAT1->0x50004010URTSTAT2->0x50008010位【1】:發(fā)送緩沖區(qū)空位當發(fā)送緩沖區(qū)中沒有數據時,此位由硬件自動設為11---發(fā)送緩沖器空0----不空位【0】:接收緩沖區(qū)數據就緒位當接收到數據時,此位由硬件自動設為11----接到數據0----未接到數據說明:查詢法實現串口數據發(fā)送和接收,主要時查詢這些位數據是否發(fā)送完畢,是否已經接收到數據程序中(1)發(fā)送的查詢

while(!(rUTRSTAT0&0x2));

語句解釋:判斷UTRSTAT0[1]位是否為0,為0則條件為真,執(zhí)行while語句,為1則條件為假,執(zhí)行while語句下面的語句。引申:判斷發(fā)送緩沖器是否空,“不空”相應為0,條件為真則繼續(xù)執(zhí)行while語句等待,“空”相應位為1,條件為假,執(zhí)行while語句下面的語句。(2)接收的查詢

while(!(rUTRSTAT0&0x1))

語句解釋:判斷UTRSTAT0[0]是否為0,為‘0’則執(zhí)行while語句,等待,為‘1’則向下執(zhí)行引申:判斷接受緩沖器是否有數據,無接受的數據,繼續(xù)執(zhí)行while語句,等待,有接受數據,向下執(zhí)行位【1】:發(fā)送緩沖區(qū)空位1---發(fā)送緩沖器空0----不空位【0】:接收緩沖區(qū)數據就緒位

1----接到數據0----未接到數據6、UERSTATn(UART錯誤狀態(tài)寄存器)見表8.6功能:反應UART的錯誤狀態(tài)7、UFSTATn(UARTFIFO狀態(tài)寄存器)見表8.7功能:反應FIFO狀態(tài)8、UTXHn寄存器(UART發(fā)送緩沖寄存器),cpu將數據寫入這個寄存器中,UART即會將數據自動發(fā)送出去,見表8.8地址UTXH00x50000023UTXH10x50004023UTXH20x50008023【7..0】:存放要發(fā)送的數據(8位)9、URXHn寄存器(UART接收緩沖寄存器)UART接收到數據時,cpu讀取這個寄存器,即可獲得接受數據到的數據,見表8.9URXH00x50000027URXH10x50004027URXH20x50008027【7..0】:存放接受到的數據(8位)程序中:#definerUTXH0(*(volatileunsignedchar*)0x50000023)#definerURXH0(*(volatileunsignedchar*)0x50000027)

10、UBRDIVn(UARTbandratedivisor)功能:設置波特率發(fā)生器n=0,1,2地址:UBRDIV0:0x50000028UBRDIV1:0x50004028UBRDIV2:0x50008028見表8.10UBRDIVn=(int)(PCLK/(bps*16))-1UBRDIVn=(int)(UEXTCLK/(bps*16))-1#definerULCON0(*(volatileunsigned*)0x50000000)//UART0行控制寄存器#definerUCON0(*(volatileunsigned*)0x50000004)//UART0控制寄存器#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFO控制寄存器#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modem控制寄存器#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rx狀態(tài)寄存器#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rx錯誤狀態(tài)寄存器#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFO狀態(tài)寄存器#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modem狀態(tài)寄存器#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0波特率因子寄存器……實例1:使用2410的UART0實現數據的發(fā)送和接受,從UART0接受到PC機發(fā)送的數據后,通過UART0發(fā)送到PC機,在終端上進行顯示。波特率115200,1位停止位,無奇偶校驗,8位數據位,使用查詢方式。程序舉例:使用2410的UART0實現數據的發(fā)送和接受,從UART0接受到PC機發(fā)送的數據后,通過UART0發(fā)送到PC機,在終端上進行顯示。從UART0接收數據,然后分別從UART0發(fā)送出去。

波特率115200,1位停止位,無奇偶校驗,8位數據位,使用查詢方式。

1.定義與UART相關的寄存器。#definerULCON0(*(volatileunsigned*)0x50000000)//UART0行控制寄存器#definerUCON0(*(volatileunsigned*)0x50000004)//UART0控制寄存器#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFO控制寄存器#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modem控制寄存器#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rx狀態(tài)寄存器#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rx錯誤狀態(tài)寄存器#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFO狀態(tài)寄存器#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modem狀態(tài)寄存器#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0波特率因子寄存器#definerUTXH0(*(volatileunsignedchar*)0x50000020)//發(fā)送緩沖寄存器#definerURXH0(*(volatileunsignedchar*)0x50000024)//接收緩沖寄存器#defineWrUTXH0(*(volatileunsignedchar*)0x500000020)#defineRdURXH0(*(volatileunsignedchar*)0x50000024)…2.對串口進行初始化操作。參數pclk為時鐘源的時鐘頻率,band為數據傳輸的波特率。voidUart_Init(intpclk,intbaud){inti;if(pclk==0)pclk=PCLK;

rUFCON0=0x0;//UART0FIFO控制寄存器,FIFO禁止rUFCON1=0x0;//UART1FIFO控制寄存器,FIFO禁止rUFCON2=0x0;//UART2FIFO控制寄存器,FIFO禁止

rUMCON0=0x0;//UART0MODEM控制寄存器,AFC禁止rUMCON1=0x0;//UART1MODEM控制寄存器,AFC禁止//UART0

rULCON0=0x3;//行控制寄存器:正常模式,無奇偶校驗,1位停止位,8位數據位。rUCON0=0x245;//控制寄存器rUBRDIV0=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

//UART1

rULCON1=0x3;rUCON1=0x245;//控制寄存器rUBRDIV1=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

//UART2

rULCON2=0x3;rUCON2=0x245;//控制寄存器rUBRDIV2=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

for(i=0;i<100;i++);}

voidUart_Select(intch){whichUart=ch;}3.選擇通道whichUart為全局變量,指示當前選擇的UART通道,如用通道0,則whichUart=04.使用串口發(fā)送數據使用串口發(fā)送一個字節(jié)的代碼如下:voidUart_SendByte(intdata){

if(whichUart==0){if(data==‘\n’){//如果輸入數據為換行while(!(rUTRSTAT0&0x2));//判斷發(fā)送緩沖器是否為空,不空則等待,空則向下執(zhí)行Delay(10);//延時,因為超級終端速度較慢

WrUTXH0=‘\r’;(發(fā)送回車符))(或者rUTXH0=‘\r’;

)}while(!(rUTRSTAT0&0x2));//等待直到發(fā)送緩沖器不空Delay(10);

WrUTXH0=data;

(發(fā)送數據)(或者rUTXH0=data;

)}elsif(whichUart==1){if(data==‘\n’){//如果輸入數據為換行while(!(rUTRSTAT1&0x2));//判斷發(fā)送緩沖器是否為空,不空則等待,空則向下執(zhí)行)Delay(10);//延時,因為超級終端速度較慢WrUTXH0=‘\r’;(發(fā)送回車符))(或者rUTXH1=‘\r’;)}while(!(rUTRSTAT1&0x2));//等待直到發(fā)送緩沖器不空Delay(10);WrUTXH0=data;(發(fā)送數據)(或者rUTXH1=data;)}elsif(whichUart==2){if(data==‘\n’){//如果輸入數據為換行while(!(rUTRSTAT2&0x2));//判斷發(fā)送緩沖器是否為空,不空則等待,空則向下執(zhí)行)Delay(10);//延時,因為超級終端速度較慢rUTXH2=‘\r’;(發(fā)送回車符))(或者WrUTXH0=‘\r’;)}while(!(rUTRSTAT2&0x2));//等待直到發(fā)送緩沖器不空Delay(10);WrUTXH0=data;(發(fā)送數據)(或者rUTXH2=data;)}5、串口發(fā)送字符串voidUart_SendString(char*pt){while(*pt)Uart_SendByte(*pt++);}6、串口屏幕打印,串口發(fā)送數據voidUart_Printf

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論