[ZLG-ARM] LPC2214做485变频器通讯时遇到难题

[复制链接]
3284|8
 楼主| wawayuxc 发表于 2008-3-1 13:31 | 显示全部楼层 |阅读模式
本人正在用ARM通过max485对台达变频器通讯,<br />大家看看程序有没有问题<br />/****************************************************************************<br />*&nbsp;文件名:SENDSTR.C<br />*&nbsp;功能:向串口发送数据。<br /><br />****************************************************************************/<br />#include&nbsp;&nbsp;&quot;config.h&quot;<br /><br />#define&nbsp;&nbsp;INT8U&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;<br />#define&nbsp;&nbsp;UART_BPS&nbsp;&nbsp;&nbsp;&nbsp;19200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;定义通讯波特率&nbsp;*/<br />INT8U&nbsp;&nbsp;OUT_BUF2[17]={0x3a,&nbsp;0x30,0x31,&nbsp;0x30,0x36,&nbsp;0x32,0x30,0x30,0x31,&nbsp;0x30,0x30,0x31,0x32,&nbsp;0x43,0x37,&nbsp;0x0D,0x0A};//通讯协议<br />/****************************************************************************<br />*&nbsp;名称:DelayNS()<br />*&nbsp;功能:长软件延时<br />*&nbsp;入口参数:dly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;延时参数,值越大,延时越久<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;DelayNS(uint32&nbsp;&nbsp;dly)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt5000;&nbsp;i++);<br />}<br /><br /><br />//#define&nbsp;&nbsp;UART_BPS&nbsp;&nbsp;&nbsp;&nbsp;19200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;定义通讯波特率&nbsp;*/<br />/****************************************************************************<br />*&nbsp;名称:UART0_Ini()<br /><br />****************************************************************************/<br />void&nbsp;&nbsp;UART1_Ini(void)<br />{&nbsp;&nbsp;uint16&nbsp;Fdiv;<br /><br />&nbsp;&nbsp;&nbsp;U1LCR&nbsp;=&nbsp;0x87;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;DLAB&nbsp;=&nbsp;1,可设置波特率<br />&nbsp;&nbsp;&nbsp;Fdiv&nbsp;=&nbsp;(Fpclk&nbsp;/&nbsp;16)&nbsp;/&nbsp;UART_BPS;&nbsp;&nbsp;//&nbsp;设置波特率<br />&nbsp;&nbsp;&nbsp;U1DLM&nbsp;=&nbsp;Fdiv&nbsp;/&nbsp;256;&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;U1DLL&nbsp;=&nbsp;Fdiv&nbsp;%&nbsp;256;&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;U1LCR&nbsp;=&nbsp;0x07;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />/****************************************************************************<br />*&nbsp;名称:UART0_SendByte()<br />*&nbsp;功能:向串口发送字节数据,并等待发送完毕。<br />*&nbsp;入口参数:data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要发送的数据<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;UART1_SendByte(uint8&nbsp;data)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1THR&nbsp;=&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(U1LSR&0x40)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕<br />}<br /><br /><br />/****************************************************************************<br />*&nbsp;名称:UART0_SendStr()<br />*&nbsp;功能:向串口发送一字符串<br />****************************************************************************/<br />void&nbsp;&nbsp;UART1_SendStr()<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt17;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET|=0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_SendByte(OUT_BUF2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR|=0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br /><br />/****************************************************************************<br />*&nbsp;名称:main()<br />*&nbsp;功能:<br />****************************************************************************/<br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00050000;//&nbsp;设置I/O连接到P0.4(收发控制IO)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=0x10;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_Ini();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_SendStr();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />}<br /><br /><br />不知道发送程序有没有问题,调试到<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U1THR&nbsp;=&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(U1LSR&0x40)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕<br /><br />变频器就显示通讯错误。<br />
dld2 发表于 2008-3-1 13:44 | 显示全部楼层

每发送一个字节都要设置收发控制吗

不对吧。<br /><br />应该先允许发送;<br />然后延时一会儿。<br />然后发送17个字节。<br />然后再延时一会儿。<br />然后再允许接收。
 楼主| wawayuxc 发表于 2008-3-1 14:31 | 显示全部楼层

回2楼

<br />你说的那种我也试过了,也不行。
toluoxin 发表于 2008-3-1 20:31 | 显示全部楼层

UART

观察串口输出信号,与确定的信号对比一下.
hms35 发表于 2008-3-2 10:22 | 显示全部楼层

我的几个疑问

1.你初始化时为什么选择2个停止位呢?U1LCR的第二位为1.<br /><br />2.你控制引脚P0.14在初始化之后应赋个值啊。确定485的发送还是接收。<br /><br />3.变频器报错有很多原因,您说:“在调试到U1THR&nbsp;=&nbsp;data;while(&nbsp;(U1LSR&0x40)==0&nbsp;);&nbsp;变频器就显示通讯错误”。<br />这个我就很怀疑,变频器很有可能只是接收到你的第一个字节后,一段时间后没有收到下一个字节(你在调试),就报错了。<br />所以你只能整个报文协议发完了,才能确定报错是否有意义。<br />
 楼主| wawayuxc 发表于 2008-3-3 09:47 | 显示全部楼层

回复5楼

1.变频器字节协议是需要2个stop位,或者是1位奇校验加停止位或偶校验加停止位三种模式<br />2.硬件连接上初始就对p0.4上拉高电平的<br />3.这个我再试试。<br />4谢谢解答
hms35 发表于 2008-3-3 11:26 | 显示全部楼层

IOSET

2.硬件上拉不等于管脚就一定是高电平,要IOSET才能确保。<br />
 楼主| wawayuxc 发表于 2008-3-3 15:47 | 显示全部楼层

我用示波器侧过

示波器测试cpu发送口发现波形不稳定,有毛刺而且抖动不知道是什么原因啊
 楼主| wawayuxc 发表于 2008-3-4 16:26 | 显示全部楼层

发现波特率不正确,但是也不知道哪里不对

后来示波器测试一下是波特率不正确,不知道怎么回事,都是按照书上公式设置的啊,怎么会错啊百思不得其解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

72

帖子

1

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