日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

基于ARM7的高效FIFO串口雙機(jī)通信設(shè)計

出處:馬明龍,黃春梅,張 瑞 發(fā)布于:2011-08-24 18:54:07

 

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

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

  1  FIFO概述

  1.1 FIFO概念

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

  1.2  FIFO意義

  FIFO是數(shù)據(jù)傳輸系統(tǒng)中極其重要的一環(huán),特別是在2個處于不同時鐘域的系統(tǒng)接口部分,F(xiàn)IFO的合理使用,不但能使接口處數(shù)據(jù)傳輸?shù)妮斎胼敵鏊俾蔬M(jìn)行有效的匹配,不使數(shù)據(jù)發(fā)生復(fù)寫、丟失和讀入無效數(shù)據(jù)的情況,而且還會有效地提高系統(tǒng)中數(shù)據(jù)的傳輸效率。使用FIFO進(jìn)行串口通信,較之傳統(tǒng)的串口通信有更高的效率。它將要發(fā)送和已經(jīng)接收的數(shù)據(jù)集中起來進(jìn)行操作,避免了頻繁的總線操作,減輕了CPU的負(fù)擔(dān)。因此,使得基于FIFO方式的串口通信目前應(yīng)用十分廣泛。

  1.3  FIFO中斷請求

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

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

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


  2  FIFO串口通信的實現(xiàn)

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

  2.1  配置特殊寄存器

  為了使目標(biāo)系統(tǒng)能正常工作,必須配置相關(guān)的寄存器,如I/O口寄存器、串口控制寄存器和串口源/目的寄存器等。S3C44B0X有2個串口,這里以串口0為例,進(jìn)行相關(guān)寄存器的配置。

  /*I/O口配置,定義各相關(guān)引腳功能和上拉電阻狀態(tài) */

  rPCONC |=0xf0000000;

  rPUPC |=0xc000;

  rPCONE=(rPCONE &0x3ffeb)|0x28;

  rPUPE |=0x6;

  rPCONF=(rPCONF &0x3ff)+0x124800;

  rPUPF |=0x1e0;

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

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

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

  //止超時中斷,產(chǎn)生接收錯誤中斷,普通傳送、

  //發(fā)送與接收為中斷或輪詢模式

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

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

  2.2  FIFO串口發(fā)送模塊

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

  void __irq Uart0_TxFifoInt(void)

  {

  /* 判斷FIFO發(fā)送緩沖區(qū)是否為滿或字符串結(jié)束 */

  while( !(rUFSTAT0 & 0x200) && (*uart0TxStr !='\0'))

  {

  rUTXH0=*uart0TxStr++;

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

  }

  rI_ISPC=BIT_UTXD0;

  if(*uart0TxStr == '\0')

  {

  rINTMSK |= BIT_UTXD0;

  rI_ISPC=BIT_UTXD0;

  }

  }

  2.3  FIFO串口接收模塊

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

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

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

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

 ?。?)中止?fàn)顩r表示RxDn的輸入被保持為0狀態(tài)超過了1個幀傳輸?shù)臅r間.

 ?。?)在FIFO模式下接收FIFO不為空,但接收器已經(jīng)在3個字時間內(nèi)沒有接收到任何數(shù)據(jù),就認(rèn)為發(fā)生了接收超時狀況。

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

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

  void __irq Uart0_RxFifoInt(void)

  {

  rI_ISPC=BIT_URXD0;

  if(rUFSTAT0==0)

  Uart_Printf("time out\n");

  while( (rUFSTAT0&0xf) >0 )     //循環(huán)直到FIFO

  //發(fā)送緩沖區(qū)為空

  {

  keyBuf[keyBufWrPt++]=rURXH0;   //讀取接收緩沖區(qū)數(shù)據(jù)存入緩存數(shù)組

  if(keyBufWrPt==KEY_BUFLEN)

  keyBufWrPt=0;

  }

  }

  /* 定義1個函數(shù)從接收緩存數(shù)組中讀取數(shù)據(jù) */

  char Uart_IntGetkey(void)

  {

  if(keyBufRdPt==KEY_BUFLEN)

  keyBufRdPt=0;

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

  return keyBuf[keyBufRdPt++];

  }

  2.4 FIFO容錯模塊

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

  void __irq Uart0_RxFifoErrorInt(void)

  {

  rI_ISPC=BIT_UERR01;

  Uart_Printf("UERSTAT0=0x%x\n",rUERSTAT0& 0xf);

  while( (rUFSTAT0&0xf) >0 )

  {

  keyBuf[keyBufWrPt++]=rURXH0;

  if(keyBufWrPt==KEY_BUFLEN);

  keyBufWrPt=0;

  }

  }

  3  實驗結(jié)果

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

  以傳輸4 KB數(shù)據(jù)為例,由表2可知,使用FIFO時,發(fā)送和接收分別節(jié)省0.547 076 s和0.042 832 s時間。假定傳輸1 bit的數(shù)據(jù)用時為θs,傳輸數(shù)據(jù)量為n,則可知使用FIFO和不使用FIFO兩種情況下的用時差為15nθ/16s.由此可見,當(dāng)傳輸數(shù)據(jù)量n越大時,采用FIFO的串口傳輸模式的用時越少、優(yōu)越性越明顯。這也顯示了FIFO在串口傳輸較大數(shù)據(jù)量的工程應(yīng)用中的重要性和必要性。

  在串口通信應(yīng)用越來越廣的背景下,提高串口通信速度顯得格外重要。本文以S3C44B0X微處理器為平臺,介紹的基于FIFO的串口雙機(jī)通信的原理和實現(xiàn)方法,該方法同時也適用于其他配置FIFO緩沖區(qū)的微處理器,具有很強(qiáng)的適用性和通用性,在學(xué)習(xí)、研究的同時,也為工程應(yīng)用中的串口通信提供了參考模型。

 


  

參考文獻(xiàn):

[1]. S3C44B0X datasheet http://www.hbjingang.com/datasheet/S3C44B0X_589522.html.
[2]. PCI datasheet http://www.hbjingang.com/datasheet/PCI_1201469.html.


版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!