|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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;
}
}
谢谢你们帮我解决一下这个困惑好吗?这个问题困扰我好几天了谢谢! |
|