打印
[ZLG-ARM]

请问周工:LPC2368能做为串口通信的主机吧?

[复制链接]
1624|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deren40|  楼主 | 2007-12-17 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在将lpc2368作为主机,51作为从机,连接方式为简单的三根线(txd,rxd,gnd)。
    主机发送一个字节“0xa0”到从机,从机收到后延时一下将送回16个字节到主机。两边采用的都是中断方式,目前从机对主机发送的数据反映正常,一旦收到数据后,就发送回16个字节的数据,我用0x00到0x0F作为测试数据,电平完全正确,波特率也不高(两边都是4800bps)。
    目前的问题是,主机对从机发送的数据的中断响应不正常,只在每次重启后响应,在单步或加断点的情况下,可以多响应几次,但一旦全速运行,就进不了中断了,尽管从机发送的电平正确。是不是lpc2368作主机有问题啊?还是另外要注意些什么?请周工指教!谢谢!

相关帖子

沙发
gumanzhou| | 2007-12-17 19:36 | 只看该作者

2368

2368作为主机主可以的,不用怀疑,
可以先用主机查询发送,中断接收来试一下~~

使用特权

评论回复
板凳
deren40|  楼主 | 2007-12-17 20:37 | 只看该作者

多谢,问题解决了,但不清楚为什么

我看了好几遍datasheet,试了好多遍,终于发现是例程初始化中开启了THRE中断,把它禁止后就能稳定的进入中断了。但又出现了新的问题,我在中断程序中把FIFO中的数据读出来,并设定标志,在主程序中调用显示子程序,将收到的数据显示出来后,延时一段再由主机发送1个“0xa0”,如此循环。但如果延时时间长些就显示不出前8个子节的数了。主要程序如下,请高手分析下!谢谢!

int main()
{
    ...
    while (1)
    {
        UART0_SendData(0xa0);
        if (rcv_new0)// 检查接收标志,若接收到字符串则再将其发送回去
        {    
            rcv_new0=0;
            buf_h = rcv_buf0[6]>>4;
            buf_l = rcv_buf0[6]&0x0F;
            LCD_Disp_Zm_l(1,2 ,48,numdot_l[buf_h]);
            LCD_Disp_Zm_l(2,2 , 0,numdot_l[buf_l]);
            DelayNS(65);
        }
    }
}


void DelayNS (uint32 dly)
{
    uint32 i;
    for ( ; dly>0; dly--) for (i=0; i<50000; i++);
}

__irq __arm void IRQ_UART0(void)
{
    uint8 i = 0;
    if ((U0IIR & 0x0F) == 0x04)// 判断是否RDA中断
    {
      rcv_new0=1;    // 设置接收到新的数据标志
      for (i=0; i<8; i++)    rcv_buf0 = U0RBR;// 读取FIFO的数据,并清除中断
      VICVectAddr = 0x00;    // 中断处理结束
     }
}

使用特权

评论回复
地板
gumanzhou| | 2007-12-17 22:29 | 只看该作者

1

自己慢慢分析吧
看~~~~~~~~~~~~~~~~~~~~~~`

使用特权

评论回复
5
XDream| | 2007-12-18 11:15 | 只看该作者

re

问题在这段代码中
    if ((U0IIR & 0x0F) == 0x04)// 判断是否RDA中断
    {
      rcv_new0=1;    // 设置接收到新的数据标志
      for (i=0; i<8; i++)    rcv_buf0 = U0RBR;// 读取FIFO的数据,并清除中断
      VICVectAddr = 0x00;    // 中断处理结束
     }

特别是

for (i=0; i<8; i++)    rcv_buf0 = U0RBR;// 读取FIFO的数据

你试着将“8”改成其他值试试,就大概知道了。

使用特权

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

本版积分规则

33

主题

82

帖子

1

粉丝