[ZLG-MCU] SC16C2550中断

[复制链接]
1718|4
 楼主| xiaoxin1986 发表于 2009-3-15 13:08 | 显示全部楼层 |阅读模式
ev, TE, AN, ST, WRITE
SC16C2550用中断接收,查询方式发送。出现一个很奇怪的现象,在接收到几包报文后,接收中断不再产生,需要将SC16C2550重新初始化一下。在目标板中共用了3个外部中断,其中两个是SC16C2550的接收中断。串口的2个中断的优先级高于另外一个外部中断。麻烦那位大侠看看。<br /><br />UINT8&nbsp;&nbsp;com485_Init(int&nbsp;baud,int&nbsp;data,int&nbsp;parity,int&nbsp;stopbit,UINT8&nbsp;chanle)<br />{&nbsp;<br />&nbsp;int&nbsp;i;&nbsp;<br />&nbsp;int&nbsp;bak=0,temp=0;<br />&nbsp;<br />&nbsp;//&nbsp;设置串口波特率&nbsp;<br />&nbsp;bak=3686400/16/baud;<br />&nbsp;SC16C2550_Write(SC16C2550_LCR,0x80,chanle);<br />&nbsp;SC16C2550_Write(SC16C2550_DLM,(UINT8)((bak&0xff00)&gt&gt8),chanle);<br />&nbsp;SC16C2550_Write(SC16C2550_DLL,(UINT8)(bak&0x00FF),chanle);<br />&nbsp;//&nbsp;设置串口模式&nbsp;<br />&nbsp;bak&nbsp;=&nbsp;data-5;&nbsp;&nbsp;&nbsp;//&nbsp;设置字长度<br />&nbsp;if(2==stopbit)&nbsp;bak&nbsp;|=&nbsp;0x04;&nbsp;//&nbsp;判断是否为2位停止位&nbsp;&nbsp;<br />&nbsp;if(0!=parity)&nbsp;{temp&nbsp;=&nbsp;parity-1;&nbsp;bak&nbsp;|=&nbsp;0x08;}<br />&nbsp;bak&nbsp;|=&nbsp;temp&lt&lt4;&nbsp;&nbsp;//&nbsp;设置奇偶校?<br />&nbsp;SC16C2550_Write(SC16C2550_LCR,bak,chanle);//8&nbsp;data&nbsp;bit;1&nbsp;stop&nbsp;bit;no&nbsp;parity<br />&nbsp;SC16C2550_Write(SC16C2550_FCR,0xC7,chanle);&nbsp;//设置接收中断触发点并使能FIFO<br />&nbsp;SC16C2550_Write(SC16C2550_IER,0x01,chanle);//关闭接收和发送中断<br />&nbsp;SC16C2550_Write(SC16C2550_MCR,0x08,chanle);<br />&nbsp;if(chanle==1)<br />&nbsp;{<br />&nbsp;&nbsp;for(i=0;i&lt200;i++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;SC16C2550A_TxBuf&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;SC16C2550A_RxBuf&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;a_revlen&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;revcounta=0;<br />&nbsp;&nbsp;watch_485a=FALSE;<br />&nbsp;&nbsp;*SIMASK(0xf0000000)|=SIMASK_IRM4;<br />&nbsp;&nbsp;*SIPEND(0xf0000000)|=SIPEND_IRQ4;<br />&nbsp;&nbsp;*SIEL(0xf0000000)|=SIEL_ED4;<br />&nbsp;&nbsp;(void)&nbsp;intConnect&nbsp;(IV_IRQ4,&nbsp;(VOIDFUNCPTR)&nbsp;IRQ4_ISR,&nbsp;NULL);&nbsp;<br />&nbsp;}<br />&nbsp;if(chanle==2)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;for(i=0;i&lt200;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SC16C2550B_TxBuf&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;SC16C2550B_RxBuf&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;b_revlen&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;revcountb=0;<br />&nbsp;&nbsp;watch_485b=FALSE;<br />&nbsp;&nbsp;*SIMASK(0xf0000000)|=SIMASK_IRM3;<br />&nbsp;&nbsp;*SIPEND(0xf0000000)|=SIPEND_IRQ3;<br />&nbsp;&nbsp;*SIEL(0xf0000000)|=SIEL_ED3;<br />&nbsp;&nbsp;(void)&nbsp;intConnect&nbsp;(IV_IRQ3,&nbsp;(VOIDFUNCPTR)&nbsp;IRQ3_ISR,&nbsp;NULL);<br />&nbsp;}&nbsp;<br />&nbsp;return&nbsp;TRUE;<br />}<br /><br />void&nbsp;IRQ4_ISR()<br />{<br />&nbsp;UINT8&nbsp;status=0,status1=0,data=0,i=0;<br />&nbsp;status=SC16C2550_Read(SC16C2550_ISR,1)&0x0e;<br />&nbsp;if(status==0x04)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;for(i=0;i&lt14;i++)&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;data=SC16C2550_Read(SC16C2550_RHR,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;SC16C2550A_RxBuf[revcounta++]=data;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;a_revlen&nbsp;=&nbsp;revcounta;<br />&nbsp;}<br />&nbsp;if(status==0x0c)<br />&nbsp;{<br />&nbsp;&nbsp;while((SC16C2550_Read(SC16C2550_LSR,1)&0x01))&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;data=SC16C2550_Read(SC16C2550_RHR,1);<br />&nbsp;&nbsp;&nbsp;SC16C2550A_RxBuf[revcounta++]=data;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;a_revlen&nbsp;=&nbsp;revcounta;<br />&nbsp;&nbsp;}<br />&nbsp;if(revcounta&gt200)revcounta=0;<br />&nbsp;watch_485a=TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*SIPEND(0xf0000000)|=SIPEND_IRQ4;&nbsp;&nbsp;&nbsp;//清中断<br />}<br />
 楼主| xiaoxin1986 发表于 2009-3-15 19:15 | 显示全部楼层

怎么都没人回答呢?

  
linhai1986 发表于 2009-3-16 23:04 | 显示全部楼层

是啊,人好少啊

  
linhai1986 发表于 2009-3-16 23:05 | 显示全部楼层

这个问题我也不是很清楚,帮顶

  
 楼主| xiaoxin1986 发表于 2009-3-16 23:33 | 显示全部楼层

自己顶一个

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

1487

帖子

0

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