[ZLG-ARM] 请问周工:LPC2368能做为串口通信的主机吧?

[复制链接]
2547|4
 楼主| deren40 发表于 2007-12-17 15:56 | 显示全部楼层 |阅读模式
我现在将lpc2368作为主机,51作为从机,连接方式为简单的三根线(txd,rxd,gnd)。<br />&nbsp;&nbsp;&nbsp;&nbsp;主机发送一个字节“0xa0”到从机,从机收到后延时一下将送回16个字节到主机。两边采用的都是中断方式,目前从机对主机发送的数据反映正常,一旦收到数据后,就发送回16个字节的数据,我用0x00到0x0F作为测试数据,电平完全正确,波特率也不高(两边都是4800bps)。<br />&nbsp;&nbsp;&nbsp;&nbsp;目前的问题是,主机对从机发送的数据的中断响应不正常,只在每次重启后响应,在单步或加断点的情况下,可以多响应几次,但一旦全速运行,就进不了中断了,尽管从机发送的电平正确。是不是lpc2368作主机有问题啊?还是另外要注意些什么?请周工指教!谢谢!
gumanzhou 发表于 2007-12-17 19:36 | 显示全部楼层

2368

2368作为主机主可以的,不用怀疑,<br />可以先用主机查询发送,中断接收来试一下~~<br />
 楼主| deren40 发表于 2007-12-17 20:37 | 显示全部楼层

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

我看了好几遍datasheet,试了好多遍,终于发现是例程初始化中开启了THRE中断,把它禁止后就能稳定的进入中断了。但又出现了新的问题,我在中断程序中把FIFO中的数据读出来,并设定标志,在主程序中调用显示子程序,将收到的数据显示出来后,延时一段再由主机发送1个“0xa0”,如此循环。但如果延时时间长些就显示不出前8个子节的数了。主要程序如下,请高手分析下!谢谢!<br /><br />int&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendData(0xa0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rcv_new0)//&nbsp;检查接收标志,若接收到字符串则再将其发送回去<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_new0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf_h&nbsp;=&nbsp;rcv_buf0[6]&gt&gt4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf_l&nbsp;=&nbsp;rcv_buf0[6]&0x0F;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_Disp_Zm_l(1,2&nbsp;,48,numdot_l[buf_h]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_Disp_Zm_l(2,2&nbsp;,&nbsp;0,numdot_l[buf_l]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(65);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />void&nbsp;DelayNS&nbsp;(uint32&nbsp;dly)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;for&nbsp;(i=0;&nbsp;i&lt50000;&nbsp;i++);<br />}<br /><br />__irq&nbsp;__arm&nbsp;void&nbsp;IRQ_UART0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((U0IIR&nbsp;&&nbsp;0x0F)&nbsp;==&nbsp;0x04)//&nbsp;判断是否RDA中断<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_new0=1;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置接收到新的数据标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt8;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf0&nbsp;=&nbsp;U0RBR;//&nbsp;读取FIFO的数据,并清除中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断处理结束<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
gumanzhou 发表于 2007-12-17 22:29 | 显示全部楼层

1

自己慢慢分析吧<br />看~~~~~~~~~~~~~~~~~~~~~~`<br /><br />
XDream 发表于 2007-12-18 11:15 | 显示全部楼层

re

问题在这段代码中<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((U0IIR&nbsp;&&nbsp;0x0F)&nbsp;==&nbsp;0x04)//&nbsp;判断是否RDA中断<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_new0=1;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置接收到新的数据标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt8;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf0&nbsp;=&nbsp;U0RBR;//&nbsp;读取FIFO的数据,并清除中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断处理结束<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />特别是<br /><br />for&nbsp;(i=0;&nbsp;i&lt8;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf0&nbsp;=&nbsp;U0RBR;//&nbsp;读取FIFO的数据<br /><br />你试着将“8”改成其他值试试,就大概知道了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

82

帖子

1

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