打印
[ZLG-ARM]

LPC2368的UART接受数据可用时,必须延时后才能写发送寄存器

[复制链接]
3236|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyccaa|  楼主 | 2008-5-13 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用了smart2300的例程UART2_FDR,main.c里增加了以下测试代码:

#define        UARTBAUD    115200                // 预期得到的波特率
#define        FDR            0                    // 若该宏为0则不会启用小数分频器

uint32 delaycnt=2000;
uint32 rccnt=0;

int main(void)
{
......
    UART2_SendStr(str);                        // 向串口发送字符串

    while (1)    //while里增加了查询接收,接收一个字节然后返回该字节
    {
        if((U2LSR&1)!=0)
        {
            for(mul=delaycnt;mul!=0;mul--); //等待
            while((U2LSR&1)!=0)
            {
                div=U2RBR;
                rccnt++;
            }
            
            U2THR=(uint8)div;
            while((U2LSR&0x60)!=0x60);
        }
    }

    return (0);
}

其它未改变,即fifo是禁用的,接收深度1个字节,mcu为LPC2368。

delaycnt的延时如果太小(比如2000),那么mcu发送的数据是错误的或没有发送,但增大到4100以上,就正常了。上位机发送是手动方式(5秒1次左右),mcu的rccnt计数表明,不论delaycnt延时大小,接收次数与pc的发送次数是一致的。
如果程序改为,只有mcu循环发送数据给pc,那么数据都是正确的。
即UART2接收数据可用时,必须延时一定时间后,对发送保持寄存器的写入才是有效的,否则发送丢失。
延时时间与波特率有关,当115200时,需要330us以上,而2400时,可能是100us多。
该现象与fifo是否禁用无关。
如果使用中断方式接收,读出U2IIR后,也必须延时(时间和查询下基本一样)后才能写U2THR(无论发送写入否在中断里)。
如果开启fifo,接收深度1字节,在接收中断里,如果在延时不够下连续写入3个字节,那么发送fifo空中断可发生3次,但数据可能并未正确发送出去。(fifo不会溢出,因为pc是手动发送,非常慢)

不知道是否是芯片问题?

相关帖子

沙发
sunshine98| | 2008-5-14 13:12 | 只看该作者

我早就怀疑有问题了,呵呵

建议楼主不要超过19200,否则就不是很正常。hehe

使用特权

评论回复
板凳
lhzw2001| | 2008-6-6 21:37 | 只看该作者

他都有库给你了,为什么不用?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

41

帖子

1

粉丝