基于ARM7的高效FIFO串口雙機通信設計-設計應用_第1頁
基于ARM7的高效FIFO串口雙機通信設計-設計應用_第2頁
基于ARM7的高效FIFO串口雙機通信設計-設計應用_第3頁
基于ARM7的高效FIFO串口雙機通信設計-設計應用_第4頁
基于ARM7的高效FIFO串口雙機通信設計-設計應用_第5頁
已閱讀5頁,還剩6頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

精品文檔-下載后可編輯基于ARM7的高效FIFO串口雙機通信設計-設計應用

在通信領域內,有兩種數據通信方式:并行通信和串行通信。隨著計算機網絡化和微機分級分布式應用系統的發展,通信的功能越來越重要。通信是指計算機與外界的信息傳輸,既包括計算機與計算機之間的傳輸,也包括計算機與外部設備,如終端、打印機和磁盤等設備之間的傳輸。串行通信是指使用一條數據線,將數據一位一位地依次傳輸,每一位數據占據一個固定的時間長度。其只需要少數幾條線就可以在系統間交換信息,特別使用于計算機與計算機、計算機與外設之間的遠距離通信。

S3C44B0X(時鐘頻率為60MHz)的UART單元提供2個獨立的異步串行I/O口,每個通信口均可工作于中斷或DMA模式。即UART能產生內部中斷請求或DMA請求,在CPU和串行I/O口之間傳送數據。它支持高達115.2Kb/s的傳輸速率,每1個UART通道包含了2個16位的分別用于接收和發送信號的先進先出(FIFO)通道。S3C44B0XUART包括可編程波特率、紅外發送/接收、1個開始位、1個或2個停止位、5/6/7/8位數據寬度和奇偶校驗。每個UART包含1個波特率發生器、接收器、發送器和控制單元,其構成如圖1所示。

1FIFO概述

1.1FIFO概念

FIFO是英文FirstInFirstOut的縮寫,是一種先進先出的數據緩存器,他與普通存儲器的區別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。FIFO一般用于不同時鐘域之間的數據傳輸,比如FIFO的一端時AD數據采集,另一端時計算機的PCI總線,假設其AD采集的速率為16位100KSPS,那么每秒的數據量為100K×16bit=1.6Mbps,而PCI總線的速度為33MHz,總線寬度32bit,其傳輸速率為1056Mbps,在兩個不同的時鐘域間就可以采用FIFO來作為數據緩沖。

1.2FIFO意義

FIFO是數據傳輸系統中極其重要的一環,特別是在2個處于不同時鐘域的系統接口部分,FIFO的合理使用,不但能使接口處數據傳輸的輸入輸出速率進行有效的匹配,不使數據發生復寫、丟失和讀入無效數據的情況,而且還會有效地提高系統中數據的傳輸效率。使用FIFO進行串口通信,較之傳統的串口通信有更高的效率。它將要發送和已經接收的數據集中起來進行操作,避免了頻繁的總線操作,減輕了CPU的負擔。因此,使得基于FIFO方式的串口通信目前應用十分廣泛。

1.3FIFO中斷請求

UART:UniversalAsynchronousReceiver/Transmitter,通用異步接收/發送裝置,UART是一個并行輸入成為串行輸出的芯片,通常集成在主板上,多數是16550AFN芯片。因為計算機內部采用并行數據,不能直接把數據發到Modem,必須經過UART整理才能進行異步傳輸,其過程為:CPU先把準備寫入串行設備的數據放到UART的寄存器(臨時內存塊)中,再通過FIFO(FirstInputFirstOutput,先入先出隊列)傳送到串行設備,若是沒有FIFO,信息將變得雜亂無章,不可能傳送到Modem.

S3C44B0X的UART有7個狀態(Tx/Rx/Error)信號:溢出錯誤、奇偶錯誤、幀錯誤、斷點條件、接收FIFO/Buffer數據準備就緒、發送FIFO/Buffer空和發送移位寄存器空,這些狀態信號由相應的UART狀態寄存器(UTRSTATn/UERSTATn)聲明[1].

當處于接收錯誤狀態時,如果在控制寄存器(UCONn)中接收錯誤狀態中斷使能位被置為1,則溢出錯誤、奇偶校驗錯誤、幀錯誤及斷點錯誤,每1個作為1種錯誤狀態都可發出錯誤中斷請求。當1個接收錯誤狀態中斷請求被發現時,引起中斷請求信號會被讀UERSTATn所識別。如果控制器中的接收模式被選定為中斷模式,則當接收器從接收移位寄存器向接收FIFO傳輸數據時,會激活接收FIFO的可引起接收中斷的"滿"狀態信號。同樣,如果控制器中的發送模式被選定為中斷模式,則當發送器從發送FIFO向發送移位寄存器傳輸數據時,可引起發送中斷的發送FIFO"空"狀態信號被激活。如表1所示。

2FIFO串口通信的實現

FIFO重啟時,輸入和輸出的指針都指向FIFO中的第1個存儲位置。對FIFO的每次寫入操作會使輸入指針指向FIFO的下1個存儲位置,相應地每次讀取操作會使FIFO的輸出指針指向FIFO的上1個存儲位置。若指針需要從1個存儲位置移動到第1個存儲位置,則FIFO會自動實現這一過程而不需要任何對指針的重啟操作。FIFO內部除了包含輸入和輸出端口之外,通常還有其他狀態標志輸出,如空狀態和滿狀態。當FIFO已空或者已滿時,空狀態和滿狀態標志位就會有相應的輸出,即當FIFO已空時不能進行讀取操作,當FIFO已滿時不能進行寫入操作.

2.1配置特殊寄存器

為了使目標系統能正常工作,必須配置相關的寄存器,如I/O口寄存器、串口控制寄存器和串口源/目的寄存器等。S3C44B0X有2個串口,這里以串口0為例,進行相關寄存器的配置。

/*I/O口配置,定義各相關引腳功能和上拉電阻狀態*/

rPCONC|=0xf0000000;

rPUPC|=0xc000;

rPCONE=(rPCONE0x3ffeb)|0x28;

rPUPE|=0x6;

rPCONF=(rPCONF0x3ff)+0x124800;

rPUPF|=0x1e0;

/*定義串口0工作寄存器組*/

rULCON0=0x3;//正常模式,無奇偶校驗,1位停止位,8位數據位

rUCON0=0x245;//Rx為邊沿觸發,Tx為電平觸發,禁

//止超時中斷,產生接收錯誤中斷,普通傳送、

//發送與接收為中斷或輪詢模式

rUFCON0=(2《6)|(1《4)|(6)|1;//FIFO啟動需先復位

rUBRDIV0=(mclk/(baud*16));//mclk為60000000,baud為115200

2.2FIFO串口發送模塊

串口數據發送幀格式是可編程的,它包含1個開始位,5~8個數據位,1個可選的奇偶位和1~2個停止位,這些都可以通過線控制寄存器(UCONn)來設置。發送器也能夠產生發送中止條件。中止條件迫使串口輸出保持在邏輯0狀態,這種狀態保持超過1個傳輸幀的時間長度。通常在1幀傳輸數據完整地傳輸完之后,再通過這個全0狀態將中止信號發送給對方。中止信號發送之后,傳送數據將持續地放入到輸出FIFO中。要發送的數據被存放在定義的字符串指針uart0TxStr中,串口發送模塊通過讀該字符串中的字符進行數據發送,源代碼如下:

void__irqUart0_TxFifoInt(void)

{

/*判斷FIFO發送緩沖區是否為滿或字符串結束*/

while(!(rUFSTAT00x200)(*uart0TxStr!='\0'))

{

rUTXH0=*uart0TxStr++;

for(i=0;i700;i++);//延遲,防止FIFO誤寫

}

rI_ISPC=BIT_UTXD0;

if(*uart0TxStr=='\0')

{

rINTMSK|=BIT_UTXD0;

rI_ISPC=BIT_UTXD0;

}

}

2.3FIFO串口接收模塊

接收的數據幀格式與發送一樣都是可編程的。它包括了1個起始位,5~8個數據位,1個可選的奇偶校驗位和1~2個停止位,這些都可以通過線控制寄存器(UCONn)來設置。接收器還可以檢測到溢出錯誤、奇偶校驗錯誤、幀錯誤和中止狀況,每種情況下都會將1個錯誤標志置位。

(1)溢出錯誤表示新的數據已經覆蓋了舊的數據,因為舊的數據沒有及時被讀入。

(2)奇偶校驗錯誤表示接收器檢測到了意料之外的奇偶校驗結果。

(3)幀錯誤表示接收到的數據沒有有效的停止位。

(4)中止狀況表示RxDn的輸入被保持為0狀態超過了1個幀傳輸的時間.

(5)在FIFO模式下接收FIFO不為空,但接收器已經在3個字時間內沒有接收到任何數據,就認為發生了接收超時狀況。

接收模塊將數據從接收移位寄存器中讀出后,首先被存儲到接收緩存數組keyBuf[]中。變量keyBufWrPt和keyBufRdPt指向緩存數組中當前寫數據和讀數據,當接收模塊往緩存數組中寫入1個字節后,keyBufWrPt加1;當Uart_IntGetKey從緩存數組中讀出1個字節后,keyBufRdPt加1.兩變量值為KEY_LEN,超過值時置零。接收模塊的代碼如下:

/*接收模塊將移位寄存器中的數據讀出到接收緩存數組中*/

void__irqUart0_RxFifoInt(void)

{

rI_ISPC=BIT_URXD0;

if(rUFSTAT0==0)

Uart_Printf("timeout\n");

while((rUFSTAT00xf)0)//循環直到FIFO

//發送緩沖區為空

{

keyBuf[keyBufWrPt++]=rURXH0;//讀取接收緩沖區數據存入緩存數組

if(keyBufWrPt==KEY_BUFLEN)

keyBufWrPt=0;

}

}

/*定義1個函數從接收緩存數組中讀取數據*/

charUart_IntGetkey(void)

{

if(keyBufRdPt==KEY_BUFLEN)

keyBufRdPt=0;

while(keyBufWrPt==keyBufRdPt);//等待直到FIFO被觸發

returnkeyBuf[keyBufRdPt++];

}

2.4FIFO容錯模塊

除了接收FIFO寄存器之外,UART還具有1個狀態FIFO.狀態FIFO表示了在FIFO寄存器中,哪一個數據被毫無錯誤地接收。假設UART的FIFO連續接收到A、B、C、D、E字符,并且在接收B字符時發生了幀錯誤(即該字符沒有停止位),在接收D字符時發生了奇偶校驗錯。雖然UART錯誤發生了,但不會產生錯誤中斷,因為含有錯誤的字符還沒有被CPU讀取。當字符被讀出時錯誤中斷才會發生,而且只有在讀出URXHn和UERSTATn寄存器后,FIFO錯誤狀態寄存器才會被清除[5].容錯模塊代碼如下[6].

void__irqUart0_RxFifoErrorInt(void)

{

rI_ISPC=BIT_UERR01;

Uart_Printf("UERSTAT0=0x%x\n",rUERSTAT00xf);

while((rUFSTAT00xf)0)

{

keyBuf[keyBufWrPt++]=rURXH0;

if(keyBufWrPt==KEY_BUFLEN);

keyBufWrPt=0;

}

}

3實驗結果

本實驗在S3C44B0X和ADS1.2平臺上實現,取得了預期的效果。在同等條件下(忽略溫度、電壓等外部因素變化),在帶FIFO(FIFO)和不帶FIFO(Non-FIFO)時發送和接收所花時間如表2所示。

以傳輸4KB數據為例,由表2可知,使用FIFO時,發送和接收分別節省0.547076s和0.042832s時間。假定傳輸1bit的數據用時為θs,傳輸數據量為n,則可知使用FIFO和不使用FIFO兩種情況下的用時差為15nθ/16s.由此可見,當傳輸數據量n越大時,采用FIFO的串口傳輸模式的用時越少、優越性越明顯。這也顯示了FIFO在串口傳輸較大

溫馨提示

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

最新文檔

評論

0/150

提交評論