新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 高效FIFO串口雙機通信在ARM7上的實現

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

作者: 時間:2017-06-04 來源:網絡 收藏

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

本文引用地址:http://www.butianyuan.cn/article/201706/348430.htm


1 概述

1.1 概念

  先入先出FIFO(First In First Out),即先被寫入到FIFO的數據將會先被讀出。它是一片用來緩存數據的存儲單元,可以把需要處理的數據先暫存在這片存儲單元中,在數據量達到一定數量時再集中處理,以提高系統(tǒng)性能。FIFO可以集成在芯片中,而當系統(tǒng)需要的緩沖區(qū)較大時,也可以用單獨的RAM實現。S3C44B0X串口收發(fā)器包含了16 B的FIFO和數據移位器,將要傳輸的數據寫進FIFO,然后賦值到發(fā)送移位器,最后從發(fā)送的引腳移位發(fā)送出去,達到利用FIFO緩沖區(qū)高效通信的目的。

1.2 FIFO意義

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

1.3 FIFO中斷請求

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

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



2 FIFO串口通信的實現

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

2.1 配置特殊寄存器

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

/*I/O口配置,定義各相關引腳功能和上拉電阻狀態(tài) */
rPCONC |=0xf0000000;
rPUPC |=0xc000;
rPCONE=(rPCONE 0x3ffeb)|0x28;
rPUPE |=0x6;
rPCONF=(rPCONF 0x3ff)+0x124800;
rPUPF |=0x1e0;
/* 定義串口0工作寄存器組 */
rULCON0=0x3; //正常模式,無奇偶校驗,1位停止位,8位數據位
rUCON0=0x245; //Rx為邊沿觸發(fā),Tx為電平觸發(fā),禁
//止超時中斷,產生接收錯誤中斷,普通傳送、
//發(fā)送與接收為中斷或輪詢模式
rUFCON0=(26)|(14)|(6)|1; //FIFO啟動需先復位
 rUBRDIV0=(mclk/(baud*16)); //mclk為60000000,baud為115200

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

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

void __irq Uart0_TxFifoInt(void)
{
/* 判斷FIFO發(fā)送緩沖區(qū)是否為滿或字符串結束 */
while( !(rUFSTAT0 0x200) (*uart0TxStr !='