打印
[ZLG-ARM]

LPC2000 UART多机通信 如何产生第9位,请高手解答

[复制链接]
2585|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jijuxie321|  楼主 | 2007-4-24 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zlgARM| | 2007-4-24 21:03 | 只看该作者

jijuxie321

符合16C550标准的UART无法产生第9个数据位。

使用特权

评论回复
板凳
jijuxie321|  楼主 | 2007-4-25 09:08 | 只看该作者

zlgARM

我原先调不通原以为没有发第9位数据出来(发送数据方有错)。。
可后来我再试了一下。。有第9位数据啊。。
看来是接收的机子有问题。。。郁闷。。。
但并不像你说的。。不能发第9位。。因为我确实成功的发送了第9位数据。。

使用特权

评论回复
地板
jijuxie321|  楼主 | 2007-4-25 09:34 | 只看该作者

zlgARM

我现在收发没问题了。。可以很正常的收到有效地址和数据字节。。
但还有个问题。。根据数据手册:
向UARTO 的U0FCR 的1位写数入能复位Rx FIFO,但我怎么试都不行。。

使用特权

评论回复
5
zlgARM| | 2007-4-25 11:54 | 只看该作者

jijuxie321

数据字长度不能设置为9位,我是这个意思。我说的数据位不包括停止位和校验位。

使用特权

评论回复
6
jijuxie321|  楼主 | 2007-4-25 12:15 | 只看该作者

zlgARM

我说的第9位是指较验位。。。准确点说是多机通信时表示地址或数据的那一位。。
现在能发了。但收还是很不稳定。表现重新编译后就收不到。。
。不明白哪里出错。。。

使用特权

评论回复
7
tangsunsun| | 2007-4-30 14:53 | 只看该作者

解决方案

void InitUart(void)
{
         uint32 i;
    U1LCR=0x80;
    U1DLM=0;
    U1DLL=24;                    
    U1LCR=0x3B;        //强制0
    U1FCR=0;
    U1IER=0x05;        //RX中断
    VICVectCntl4 = 0x20|7;    // UART1分配为485
    VICVectAddr4 = (uint32)IRQ_UART1;             
}    
void __irq    IRQ_UART1(void)
{
    uint8 b1,b3,drc;
    uint32 i;
    b1=U1IIR;    
    system.TimeOut=0;
    switch(b1&0x0F)
    {
    case 0x06:        //地址帧        
        if(system.ReciveFlag==0)system.ptr=0;            b3=U1LSR;
        break;
    case 0x04:                 //数据帧        
        b1=U1RBR;
        if(system.ReciveFlag==0)
        {
            system.ReciveBuf[system.ptr]=b1;
            system.ptr++;
        }
        break;
    default:
        b1=U1RBR;
        b1=U1LSR;
        break;
    }    
    VICVectAddr=0x00;
}         
void SendMsg(uint32 ptr)
{
    uint32 i;
    U1IER=0;            //停止中断
    IO0SET=RI;
    for(i=0;i<500;i++);
    IO0SET=DE;        //切换到发送
    for(i=0;i<500;i++);
    U1LCR=0x2B;        //输出地址
    for(i=0;i<500;i++);
    U1THR=0x39;
    while((U1LSR&0x20)==0);
    for(i=0;i<4000;i++);
    U1LCR=0x3B;        //输出地址
    for(i=0;i<100;i++);                            //输出数据
    for(i=0;i<ptr;i++)
    {
        U1THR=system.SendBuf;                    //发送数据
        while((U1LSR&0x20)==0);
    }
    for(i=0;i<4000;i++);    //延时    
    IO0CLR=DE;
    for(i=0;i<500;i++);
    IO0CLR=RI;
    for(i=0;i<500;i++);
    i=U1IIR;
    i=U1RBR;
    i=U1LSR;        
    U1IER=0x05;    
}

使用特权

评论回复
8
kl818bc| | 2007-4-30 19:28 | 只看该作者

16c550 可以作9位多机通信的

如楼上的例子,发送时用强制校验位输出,接收时用校验位正确与否来区分地址和数据

16C550这个芯片的前身NS8250(20几年前PC-XT时代的串口卡用的芯片)就有这个功能

对通讯有点经验或是把数据手册看清楚的地球人都应该知道

使用特权

评论回复
9
jijuxie321|  楼主 | 2007-5-1 15:24 | 只看该作者

tangsunsun

很感谢tangsunsun给的例子。。我前几天已经解决了。。是硬件问题。。因为板子是用万能板搭的。。不小心就多焊了一个焊点。把232电平转换芯片的负压接到了DB9的一个引脚上。所以才会用示波器看很正常。。接到PC上却收不到数据。。。。查了两天才查出问题。。不过还是很感谢。。

使用特权

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

本版积分规则

4

主题

30

帖子

2

粉丝