TI中文支持网
TI专业的中文技术问题搜集分享网站

UART6 fifo查询接收

我不太理解UART的FIFO,是什么样的工作机制?

1、接收FIFO接收到数据后,如何知道数据已经被CPU读取?

2、FIFO接收16字节,空间满了后,再接收数据的时候是自动覆盖原先的数据吗?

这是我使用查询方式,仅仅是把FIFO接收到的数据存到数组中,

void UART6_Recive_Done(void)

{
    uint8_t Recive_Date[255] = {0}, ii = 0;
    while(UARTCharsAvail(UART6_BASE))
    {
       Recive_Date[ii] = UARTCharGetNonBlocking(UART6_BASE);
       ii++;
    }}

如何判断数据接收完,ii接收完一次数据如何归零?

希望大侠赐教!!!

user4935483:

int UART6_Recive_Done(void){// uint8_t ii = 0; while(UARTCharsAvail(UART6_BASE)) { Recive_Date[ii] = UARTCharGetNonBlocking(UART6_BASE); if(Recive_Date[0] == 0x01) { ii++; } else UARTDateSend((uint8_t *)"addrss is error \n ",16 ); ii = 0; return 0; } date_length = Recive_Date[5]; byte_length = (date_length<<1); return 1;}函数这样写的话就智能接收最后一个八位字节,不知道原因?

xyz549040622:

1.可通过 UART 标志 (UARTFR) 寄存器(见 816页)和 UART 接收状态 (UARTRSR) 寄存器监控 FIFO的状态。而对空、满和溢出条件的监控则是由硬件来完成的。当接收FIFO满的时候,可以配置触发中断的,有个标志位。

2.如果你不清除的话,应该是覆盖原来的数据的。

Seven Han:

回复 user4935483:

1.FIFO使用机制都是类似的,可以在网上查看,http://blog.csdn.net/houqi02/article/details/51683635

2.建议用FIFO中断处理方式,根据需求设定FIFO中断级位,SCIFFRX中的RXFFIL设置接收中断,cpu接收到一定数目的字符后去读FIFO中的数据,避免数据丢失。

user4935483:

回复 xyz549040622:

我知道了,当发送的数据超过FIFO设定的接收字节时,比如设定FIFO的深度是8字节,当发送18个字节时,就需要进入三次中断接收函数。

但是,如何判断数据是否接收完了呢?想到了一种延时的方法,就是进一次中断给一个系统时间,主函数判断大于10ms再进行数据处理,这个办法每接收十几个数据帧后,会出现一个错误帧。

想到的另一种方法是,只要UART在工作,就一直等待接收,但是接收不到数据,不知道哪想错了?

  uint32_t flag = UARTIntStatus(UART6_BASE,true);   

 UARTIntClear(UART6_BASE,flag);  

while(UARTBusy(UART6_BASE))  

 {       

   MB.data_buffer[MB.countbuffer] = UARTCharGet(UART6_BASE);   

   MB.countbuffer++;

  }   

MB.countstate = MB.countbuffer;   

MB.countbuffer = 0;  

MB.timecount = soft_timer;

user4935483:

回复 Seven Han:

我知道了,当发送的数据超过FIFO设定的接收字节时,比如设定FIFO的深度是8字节,当发送18个字节时,就需要进入三次中断接收函数。

但是,如何判断数据是否接收完了呢?想到了一种延时的方法,就是进一次中断给一个系统时间,主函数判断大于10ms再进行数据处理,这个办法每接收十几个数据帧后,会出现一个错误帧。

想到的另一种方法是,只要UART在工作,就一直等待接收,但是接收不到数据,不知道哪想错了?

uint32_t flag = UARTIntStatus(UART6_BASE,true);

UARTIntClear(UART6_BASE,flag);

while(UARTBusy(UART6_BASE))

{

MB.data_buffer[MB.countbuffer] = UARTCharGet(UART6_BASE);

MB.countbuffer++;

}

MB.countstate = MB.countbuffer;

MB.countbuffer = 0;

MB.timecount = soft_timer;

xyz549040622:

回复 user4935483:

你这样做的话,当发送18个字节完毕的时候,不继续发送,导致FIFO的深度不够,永远也不触发第三次中断的。除非你的发送端一直发,只发送一次的话,就糟了。

赞(0)
未经允许不得转载:TI中文支持网 » UART6 fifo查询接收
分享到: 更多 (0)