您的位置 首页 主动

高效FIFO串口双机通讯在ARM7上的完成

详细介绍了高效FIFO串口通信的基本原理和实现方法,并在两台基于ARM7TDMI微处理器的目标机上,用FIFO串口通信模式实现了两机之间的高效通信。整个工程分寄存器配置模块、串口接收模块、串口发送模块

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=(26)|(14)|(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;i700;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( (rUFSTAT00xf) >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( (rUFSTAT00xf) >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缓冲区的微处理器,具有很强的适用性和通用性,在学习、研讨的一起,也为工程运用中的串口通讯供给了参阅模型。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/198857.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部