[ZLG-ARM] LPC2000 UART多机通信 如何产生第9位,请高手解答

[复制链接]
3657|8
 楼主| jijuxie321 发表于 2007-4-24 15:40 | 显示全部楼层 |阅读模式
我在做多机通信,搞了两块ARM板..一直接不通.<br />所以想问问大家..如果要做多机通信像51一们发11位模式是不是这样设置...字长度为8位,2位停止位.而奇偶较验位强制为&quot;1&quot;或者强制为&quot;0&quot;,并使能奇偶较验.<br />这样设置对吗<br /><br />问题的关键是如何产生第9位数据.
zlgARM 发表于 2007-4-24 21:03 | 显示全部楼层

jijuxie321

符合16C550标准的UART无法产生第9个数据位。<br />
 楼主| jijuxie321 发表于 2007-4-25 09:08 | 显示全部楼层

zlgARM

我原先调不通原以为没有发第9位数据出来(发送数据方有错)。。<br />可后来我再试了一下。。有第9位数据啊。。<br />看来是接收的机子有问题。。。郁闷。。。<br />但并不像你说的。。不能发第9位。。因为我确实成功的发送了第9位数据。。
 楼主| jijuxie321 发表于 2007-4-25 09:34 | 显示全部楼层

zlgARM

我现在收发没问题了。。可以很正常的收到有效地址和数据字节。。<br />但还有个问题。。根据数据手册:<br />向UARTO&nbsp;的U0FCR&nbsp;的1位写数入能复位Rx&nbsp;FIFO,但我怎么试都不行。。
zlgARM 发表于 2007-4-25 11:54 | 显示全部楼层

jijuxie321

数据字长度不能设置为9位,我是这个意思。我说的数据位不包括停止位和校验位。<br />
 楼主| jijuxie321 发表于 2007-4-25 12:15 | 显示全部楼层

zlgARM

我说的第9位是指较验位。。。准确点说是多机通信时表示地址或数据的那一位。。<br />现在能发了。但收还是很不稳定。表现重新编译后就收不到。。<br />。不明白哪里出错。。。
tangsunsun 发表于 2007-4-30 14:53 | 显示全部楼层

解决方案

void&nbsp;InitUart(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1LCR=0x80;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1DLM=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1DLL=24;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1LCR=0x3B;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//强制0<br />&nbsp;&nbsp;&nbsp;&nbsp;U1FCR=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1IER=0x05;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RX中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl4&nbsp;=&nbsp;0x20|7;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART1分配为485<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr4&nbsp;=&nbsp;(uint32)IRQ_UART1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;__irq&nbsp;&nbsp;&nbsp;&nbsp;IRQ_UART1(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;b1,b3,drc;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;b1=U1IIR;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;system.TimeOut=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(b1&0x0F)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x06:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//地址帧&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(system.ReciveFlag==0)system.ptr=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b3=U1LSR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x04:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据帧&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1=U1RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(system.ReciveFlag==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system.ReciveBuf[system.ptr]=b1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system.ptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1=U1RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1=U1LSR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;SendMsg(uint32&nbsp;ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1IER=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止中断<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=RI;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt500;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=DE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//切换到发送<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt500;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;U1LCR=0x2B;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt500;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;U1THR=0x39;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((U1LSR&0x20)==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt4000;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;U1LCR=0x3B;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt100;i++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出数据<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltptr;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U1THR=system.SendBuf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U1LSR&0x20)==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt4000;i++);&nbsp;&nbsp;&nbsp;&nbsp;//延时&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=DE;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt500;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=RI;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt500;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;i=U1IIR;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=U1RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1IER=0x05;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
kl818bc 发表于 2007-4-30 19:28 | 显示全部楼层

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

如楼上的例子,发送时用强制校验位输出,接收时用校验位正确与否来区分地址和数据<br /><br />16C550这个芯片的前身NS8250(20几年前PC-XT时代的串口卡用的芯片)就有这个功能<br /><br />对通讯有点经验或是把数据手册看清楚的地球人都应该知道
 楼主| jijuxie321 发表于 2007-5-1 15:24 | 显示全部楼层

tangsunsun

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

本版积分规则

4

主题

30

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部