登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

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

作者:jijuxie321 栏目:ARM技术
LPC2000 UART多机通信 如何产生第9位,请高手解答
我在做多机通信,搞了两块ARM板..一直接不通.
所以想问问大家..如果要做多机通信像51一们发11位模式是不是这样设置...字长度为8位,2位停止位.而奇偶较验位强制为"1"或者强制为"0",并使能奇偶较验.
这样设置对吗

问题的关键是如何产生第9位数据.

2楼: >>参与讨论
zlgARM
jijuxie321
符合16C550标准的UART无法产生第9个数据位。


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

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

5楼: >>参与讨论
zlgARM
jijuxie321
数据字长度不能设置为9位,我是这个意思。我说的数据位不包括停止位和校验位。


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

7楼: >>参与讨论
tangsunsun
解决方案
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[i];                    //发送数据
        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
16C550.html">16C550 可以作9位多机通信的
如楼上的例子,发送时用强制校验位输出,接收时用校验位正确与否来区分地址和数据

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

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

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

参与讨论
昵称:
讨论内容:
 
 
相关帖子
板子JTAG可用,ISP不通?
EasyARM2100中的AXD连接问题
实时为什么运行得这么慢
用EasyARM2200扩展外部RAM
请问:如何才能兼顾I2C总线的通信距离和速度?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号