高效FIFO串口雙機通訊在ARM7上的實現

來源:互聯網
上載者:User
高效FIFO串口雙機通訊在ARM7上的實現S3C44B0X(時鐘頻率為60 MHz)的UART單元提供2個獨立的非同步串列I/O口,每個通訊口均可工作於中斷或DMA模式。即UART能產生內部插斷要求或DMA請求,在CPU和串列I/O口之間傳送資料。它支援高達115.2 Kb/s的傳輸速率,每1個UART通道包含了2個16位的分別用於接收和發送訊號的先進先出(FIFO)通道。S3C44B0X UART包括可程式化傳輸速率、紅外發送/接收、1個開始位、1個或2個停止位、5/6/7/8位元據寬度和同位。每個UART包含1個傳輸速率發生器、接收器、發送器和控制單元,其構成1所示[1]。

1  FIFO概述
1.1 FIFO概念
  先入先出FIFO(First In First Out),即先被寫入到FIFO的資料將會先被讀出。它是一片用來快取資料的儲存單元,可以把需要處理的資料先暫存在這片儲存單元中,在資料量達到一定數量時再集中處理,以提高系統效能。FIFO可以整合在晶片中,而當系統需要的緩衝區較大時,也可以用單獨的RAM實現。S3C44B0X串口收發器包含了16 B的FIFO和資料移位器,將要傳輸的資料寫進FIFO,然後賦值到發送移位器,最後從發送的引腳移位發送出去,達到利用FIFO緩衝區高效通訊的目的。
1.2  FIFO意義
    FIFO是資料轉送系統中極其重要的一環,特別是在2個處於不同時鐘域的系統介面部分,FIFO的合理使用,不但能使介面處資料轉送的輸入輸出速率進行有效匹配,不使資料發生複寫、丟失和讀入無效資料的情況,而且還會有效地提高系統中資料的傳輸效率。使用FIFO進行串口通訊,較之傳統的串口通訊有更高的效率。它將要發送和已經接收的資料集中起來進行操作,避免了頻繁的匯流排操作,減輕了CPU的負擔。因此,使得基於FIFO方式的串口通訊目前應用十分廣泛。
1.3  FIFO插斷要求
  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所示。

2  FIFO串口通訊的實現
  FIFO重啟時,輸入和輸出的指標都指向FIFO中的第1個儲存位置。對FIFO的每次寫入操作會使輸入指標指向FIFO的下1個儲存位置,相應地每次讀取操作會使FIFO的輸出指標指向FIFO的上1個儲存位置。若指標需要從最後1個儲存位置移動到第1個儲存位置,則FIFO會自動實現這一過程而不需要任何對指標的重啟操作。FIFO內部除了包含輸入和輸出連接埠之外,通常還有其他狀態標誌輸出,如空狀態和滿狀態。當FIFO已空或者已滿時,空狀態和滿狀態標誌位就會有相應的輸出,即當FIFO已空時不能進行讀取操作,當FIFO已滿時不能進行寫入操作[2]。
2.1  配置特殊寄存器
   為了使目標系統能正常工作,必須配置相關的寄存器,如I/O口寄存器、串口控制寄存器和串口源/目的寄存器等。S3C44B0X有2個串口,這裡以串口0為例,進行相關寄存器的配置。
  /*I/O口配置,定義各相關引腳功能和上拉電阻狀態 */
  rPCONC |=0xf0000000;
  rPUPC |=0xc000;
  rPCONE=(rPCONE &0x3ffeb)|0x28;
  rPUPE |=0x6;
  rPCONF=(rPCONF &0x3ff)+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.2  FIFO串口發送模組
    串口資料發送框架格式是可程式化的,它包含1個開始位,5~8個資料位元,1個可選的奇偶位和1~2個停止位,這些都可以通過線控制寄存器(UCONn)來設定。發送器也能夠產生髮送中止條件。中止條件迫使串口輸出保持在邏輯0狀態,這種狀態保持超過1個傳輸幀的時間長度。通常在1幀傳輸資料完整地傳輸完之後,再通過這個全0狀態將中止訊號發送給對方。中止訊號發送之後,傳送資料將持續地放入到輸出FIFO中。要發送的資料被存放在定義的字串指標uart0TxStr 中,串口發送模組通過讀該字串中的字元進行資料發送,核心原始碼如下:
void __irq Uart0_TxFifoInt(void)
{
  /* 判斷FIFO發送緩衝區是否為滿或字串結束 */
  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串口接收模組
  接收的資料框架格式與發送一樣都是可程式化的。它包括了1個起始位,5~8個資料位元,1個可選的同位位元和1~2個停止位,這些都可以通過線控制寄存器(UCONn)來設定。接收器還可以檢測到溢出錯誤、同位錯誤、幀錯誤和中止狀況,每種情況下都會將1個錯誤標誌置位。
   (1)溢出錯誤表示新的資料已經覆蓋了舊的資料,因為舊的資料沒有及時被讀入。
  (2)同位錯誤表示接收器檢測到了意料之外的同位結果。
  (3)幀錯誤表示接收到的資料沒有有效停止位。
   (4)中止狀況表示RxDn的輸入被保持為0狀態超過了1個幀傳輸的時間[3]。
   (5)在FIFO模式下接收FIFO不為空白,但接收器已經在3個字時間內沒有接收到任何資料,就認為發生了接收逾時狀況。
   接收模組將資料從接收移位寄存器中讀出後,首先被儲存到接收緩衝數組keyBuf[ ]中。變數keyBufWrPt和keyBufRdPt指向緩衝數組中當前寫資料和讀資料,當接收模組往緩衝數組中寫入1個位元組後,keyBufWrPt加1;當Uart_IntGetKey從緩衝數組中讀出1個位元組後,keyBufRdPt加1。兩變數最大值為KEY_LEN,超過最大值時置零。接收模組的核心代碼如下[4]:
/* 接收模組將移位寄存器中的資料讀出到接收緩衝數組中 */
void __irq Uart0_RxFifoInt(void)
  {
     rI_ISPC=BIT_URXD0;
  if(rUFSTAT0==0)
  Uart_Printf("time out/n");
     while( (rUFSTAT0&0xf) >0 )     //迴圈直到FIFO
                //發送緩衝區為空白
        {
      keyBuf[keyBufWrPt++]=rURXH0;   //讀取接收緩衝區資料存入緩衝數組
      if(keyBufWrPt==KEY_BUFLEN)
         keyBufWrPt=0;
  }
}
/* 定義1個函數從接收緩衝數組中讀取資料 */
char Uart_IntGetkey(void)
{
   if(keyBufRdPt==KEY_BUFLEN)
   keyBufRdPt=0;
        while(keyBufWrPt==keyBufRdPt);//等待直到FIFO被觸發
     return keyBuf[keyBufRdPt++];
}
2.4 FIFO容錯模組
   除了接收FIFO寄存器之外,UART還具有1個狀態FIFO。狀態FIFO表示了在FIFO寄存器中,哪一個資料被毫無錯誤地接收。假設UART的FIFO連續接收到A、B、C、D、E字元,並且在接收B字元時發生了幀錯誤(即該字元沒有停止位),在接收D字元時發生了同位錯。雖然UART錯誤發生了,但不會產生錯誤中斷,因為含有錯誤的字元還沒有被CPU讀取。當字元被讀出時錯誤中斷才會發生,而且只有在讀出URXHn和UERSTATn寄存器後,FIFO錯誤狀態寄存器才會被清除[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  實驗結果
   本實驗在S3C44B0X和ADS1.2平台上實現,取得了預期的效果。在同等條件下(忽略溫度、電壓等外部因素變化),在帶FIFO(FIFO)和不帶FIFO(Non-FIFO)時發送和接收所花時間如表2所示。

  以傳輸4 KB資料為例,由表2可知,使用FIFO時,發送和接收分別節省0.547 076 s和0.042 832 s時間。假定傳輸1 bit的資料用時為θs,傳輸資料量為n,則可知使用FIFO和不使用FIFO兩種情況下的用時差為15nθ/16s。由此可見,當傳輸資料量n越大時,採用FIFO的串口傳輸模式的用時越少、優越性越明顯。這也顯示了FIFO在串口傳輸較大資料量的工程應用中的重要性和必要性。
  在串口通訊應用越來越廣的背景下,提高串口通訊速度顯得格外重要。本文以S3C44B0X微處理器為平台,介紹的基於FIFO的串口雙機通訊的原理和實現方法,該方法同時也適用於其他配置FIFO緩衝區的微處理器,具有很強的適用性和通用性,在學習、研究的同時,也為工程應用中的串口通訊提供了參考模型。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.