|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
LPC2000 UART多机通信 如何产生第9位,请高手解答 |
作者:jijuxie321 栏目:ARM技术 |
我在做多机通信,搞了两块ARM板..一直接不通. 所以想问问大家..如果要做多机通信像51一们发11位模式是不是这样设置...字长度为8位,2位停止位.而奇偶较验位强制为"1"或者强制为"0",并使能奇偶较验. 这样设置对吗 问题的关键是如何产生第9位数据. |
2楼: | >>参与讨论 |
作者: zlgARM 于 2007/4/24 21:03:00 发布:
jijuxie321 符合16C550标准的UART无法产生第9个数据位。 |
3楼: | >>参与讨论 |
作者: jijuxie321 于 2007/4/25 9:08:00 发布:
zlgARM 我原先调不通原以为没有发第9位数据出来(发送数据方有错)。。 可后来我再试了一下。。有第9位数据啊。。 看来是接收的机子有问题。。。郁闷。。。 但并不像你说的。。不能发第9位。。因为我确实成功的发送了第9位数据。。 |
4楼: | >>参与讨论 |
作者: jijuxie321 于 2007/4/25 9:34:00 发布:
zlgARM 我现在收发没问题了。。可以很正常的收到有效地址和数据字节。。 但还有个问题。。根据数据手册: 向UARTO 的U0FCR 的1位写数入能复位Rx FIFO,但我怎么试都不行。。 |
5楼: | >>参与讨论 |
作者: zlgARM 于 2007/4/25 11:54:00 发布:
jijuxie321 数据字长度不能设置为9位,我是这个意思。我说的数据位不包括停止位和校验位。 |
6楼: | >>参与讨论 |
作者: jijuxie321 于 2007/4/25 12:15:00 发布:
zlgARM 我说的第9位是指较验位。。。准确点说是多机通信时表示地址或数据的那一位。。 现在能发了。但收还是很不稳定。表现重新编译后就收不到。。 。不明白哪里出错。。。 |
7楼: | >>参与讨论 |
作者: tangsunsun 于 2007/4/30 14:53:00 发布:
解决方案 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 于 2007/4/30 19:28:00 发布:
16C550.html">16C550 可以作9位多机通信的 如楼上的例子,发送时用强制校验位输出,接收时用校验位正确与否来区分地址和数据 16C550这个芯片的前身NS8250(20几年前PC-XT时代的串口卡用的芯片)就有这个功能 对通讯有点经验或是把数据手册看清楚的地球人都应该知道 |
9楼: | >>参与讨论 |
作者: jijuxie321 于 2007/5/1 15:24:00 发布:
tangsunsun 很感谢tangsunsun给的例子。。我前几天已经解决了。。是硬件问题。。因为板子是用万能板搭的。。不小心就多焊了一个焊点。把232电平转换芯片的负压接到了DB9的一个引脚上。所以才会用示波器看很正常。。接到PC上却收不到数据。。。。查了两天才查出问题。。不过还是很感谢。。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |