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