在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 8053|回复: 2

请教:有关串口的FIFO问题!Trigger Level?

[复制链接]
发表于 2006-9-21 19:54:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
想问一下UFCONx中的第7.6位和第5.4位Tx FIFO Trigger Level以及Rx FIFO TriggerLevel是什么?
不是很明白的说~~~


为何在Samsung提供的标准测试代码中Uart.c文件中在测试Uart0 的FIFO时采用了中断方式是用如下的方式编写的呢?

void Test_Uart0Fifo(void)
{
    int key;

    Uart_Port();
    keyBufRdPt=keyBufWrPt=0;
    pISR_UTXD0=(unsigned)Uart0_TxFifoInt;
    pISR_URXD0=(unsigned)Uart0_RxFifoInt;
    pISR_UERR01=(unsigned)Uart0_RxFifoErrorInt;

    /*********** UART0 Tx FIFO test with interrupt ***********/     
    Uart_Printf("[Uart channel 0 tx FIFO Interrupt Test]\n");
    Uart_TxEmpty(0); //wait until tx shifter is empty.

    uart0TxStr="UART0 Tx FIFO interrupt test is good!!!!\r\n";
    rUFCON0=(2<<6)|(1<<4)|(6)|1;       //注意,程序这里设置了Tx/Rx 的FIFO TriggerLevel均为8byte!            
    rUCON0 = 0x244;         //tx:levl,rx:edge,error int,normal*2,interrupt(Start)
    rINTMSK=~(BIT_GLOBAL|BIT_UTXD0);        
    //这里开启了Tx中断  (1)那他是怎么进入中断?FIFO满?16个byte还是只要有1个byte?还是FIFO TriggerLevel所设置的8个byte呢?
    Delay(500);
    /*********** UART0 Tx FIFO test with BDMA0 ***********/
    //………………   
    /*********** UART0 Rx FIFO test with interrupt ***********/
    rUCON0=0x245|0x80; //tx:level,rx:edge,tx/rx:int,rcv_time_out enabled,error int enable

    Uart_Printf("\n[Uart channel 0 FIFO Rx Interrupt Test]:Type any key!!!\n");
    Uart_Printf("You have to see the typed character. To quit, press Enter key.\n");

    rINTMSK=~(BIT_GLOBAL|BIT_URXD0|BIT_UERR01);
    //这里开启了Rx中断  (2)是怎么进入中断?FIFO满?16个byte还是只要有接收到1个byte?还是FIFO TriggerLevel所设置的8个byte呢?

    while( (rUFSTAT0&0xf) >0 )
        key=RdURXH0();  //To clear the Rx FIFO
    rUERSTAT0;         //To clear the error state

    while((key=Uart_IntGetkey())!='\r')
        Uart_SendByte(key);

    rUFCON0=(2<<6)|(1<<4)|(6)|0;  
    //FIFO trigger:tx/rx:8byte, txrx_fifo reset(will be cleared), FIFO disable.

    rINTMSK=~BIT_GLOBAL;
    rUCON0=0x45; //rcv_time_out disabled
    Uart_Printf("\n");
    Return_Port();
}


而在中虾??校?

void __irq Uart0_TxFifoInt(void)
{
//(3)为什么下面查询UFSTAT0 的状态是否Tx FIFO full?不用管Tx FIFO Count 位即Tx FIFO里的数据数量
//吗?那么所前头所设置的Tx FIFO TriggerLevel 有什么用呢?

    while( !(rUFSTAT0 & 0x200) && (*uart0TxStr != '\0') )   //until tx fifo full or end of string
    {
         rUTXH0=*uart0TxStr++;
    }
    rI_ISPC=BIT_UTXD0;        
    if(*uart0TxStr == '\0')
    {   
          rINTMSK |= BIT_UTXD0; //ES3
          rI_ISPC=BIT_UTXD0; //ES3
    }   
}

void __irq Uart0_RxFifoInt(void)
{
    rI_ISPC=BIT_URXD0;
    while( (rUFSTAT0&0xf) >0 )     //until FIFO is empty
    {
         keyBuf[keyBufWrPt++]=rURXH0;//rx buffer->keyBuf[]
         if(keyBufWrPt==KEY_BUFLEN)
         keyBufWrPt=0;
    }
}

谢谢你们帮我解决一下这个困惑好吗?这个问题困扰我好几天了谢谢!
发表于 2006-9-21 21:54:44 | 显示全部楼层
哈哈,我想帮你解释,但是我也是刚接触,请教版竹吧~~
大家起学习!
发表于 2006-11-22 12:43:58 | 显示全部楼层
能否给出完整的代码和程序运行的结果?
我的理解:
TX:当FIFO中的有效数据只剩下FIFO TriggerLevel所设置的值时(此处为8bytes),产生中断。在中断服务程序中只要填满FIFO即可。
RX:当FIFO中的有效数据达到FIFO TriggerLevel所设置的值时(此处为8bytes),产生中断。在中断服务程序中读取FIFO中的所有有效值即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-27 00:44 , Processed in 0.023423 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表