//中断服务程序<br />void interrupt INT6(void)<br />{<br /> WORD ax,i;<br /><br /> *XINT1CR|=0x8000;<br /> ax=IIR_FCR_EFR_A&0x3f;<br />//RHR interrupt<br /> if(ax==0x04)<br /> {<br /> for(i=0;i<8;i++)<br /> {<br /> RecvBuffer[PtrRecv++]=RHR_THR_DLL_A;<br /> Delay(1);<br /> }<br /> }<br />//RHR timeout interrupt<br /> else if(ax==0x0c)<br /> {<br /> do<br /> {<br /> RecvBuffer[PtrRecv++]=RHR_THR_DLL_A;<br /> Delay(1);<br /> }while(LSR_A&0x01);<br /> }<br />//THR interrupt<br /> else if(ax==0x02)<br /> {<br />//RHR_THR_DLL_A=0x5a;<br /> }<br /><br /> else IIR_FCR_EFR_A=0x06; //Clear FIFO<br />}<br /><br />//初始化 TL16C752<br />void InitializeCom(void)<br />{<br /> UWORD i;<br /><br /> *PFDATDIR|=0x0002; //RESET TL16C752<br /> Delay(100);<br /> *PFDATDIR&=0xfffd;<br /><br /> MCR_A=0x08; //Enable INT<br /> Delay(2);<br /> IIR_FCR_EFR_A=0x07; //Enable FIFO;Clear FIFO;8 byte FIFO<br /> Delay(2);<br /> LCR_A=0x80; //Set Baudrate<br /> Delay(2);<br /> if(System.Baudrate2>7)i=5;<br /> else i=System.Baudrate2;<br /> RHR_THR_DLL_A=LBaudrateTableCom;<br /> Delay(2);<br /> IER_DLH_A=HBaudrateTableCom;<br /> Delay(2);<br /> LCR_A=0x03; //8 data bit;1 stop bit;0 parity bit<br /> Delay(2);<br /><br /> IER_DLH_A=0x02; //Enable RHR/THR interrupt<br />}<br /><br />从示波器上看,初始化程序最后一条指令一执行,INTA脚立刻变为高电平,进入中断服务程序后执行ax=IIR_FCR_EFR_A&0x3f(读IIR),大多数情况下INTA脚不能转为低电平,中段不能被复位,现在问题的症结就在这里了。<br />各位大佬一起帮忙分析一下,多谢!<br />
|