我的串口0采用查询发送中断接收,一切正常。<br />但是,我的串口1(初始化方式一样)只能发出来,却接收不到(短接RX和TX时,发到PC串口调试中断上的将是乱码),仿真调试发现,串口2进不了接收中断,请问什么原因那?<br /><br />下面是源代码<br /><br /><br /><br /><br />void __irq IRQ_UART0 (void)<br />{<br /> if ((U0IIR & 0x0F) == 0x04) <br /> rcv_new = 1; // 设置接收到新的数据标志<br /> rcv_buf[Uart0rcv_p] = U0RBR;// 读取FIFO的数据,并清除中断<br /> Uart0rcv_p++; <br /> if(Uart0rcv_p == 8) Uart0rcv_p = 0;<br /> VICVectAddr = 0x00; // 中断处理结束<br />}<br />INT8U UART0_Init (INT32U baud, UARTMODE set)<br />{<br /> INT32U bak;<br /> if ((baud ==0 ) || (baud > 115200)) return (0);<br /> if ((set.datab <5) || (set.datab > 8)) return (0);<br /> if ((set.stopb == 0) || (set.stopb > 2)) return (0);<br /> if (set.parity > 4) return (0);<br /> //PINSEL0 = 0x00000005; // 设置I/O连接到UART0<br /> /* 设置串口波特率 */<br /> U0LCR = 0x80; // DLAB = 1 <br /> bak = (Fpclk >> 4) / baud;<br /> U0DLM = bak >> 8;<br /> U0DLL = bak & 0xFF;<br /> <br /> /* 设置串口模式 */<br /> bak = set.datab - 5;// 设置字长<br /> if (set.stopb == 2) bak |= 0x04; // 2位停止位<br /> <br /> if (set.parity != 0)<br /> {<br /> set.parity = set.parity - 1;<br /> bak |= 0x08;//奇偶校验使能<br /> }<br /> bak |= set.parity << 4; // 设置奇偶校验<br /> U0LCR = bak;<br /> <br /> U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节<br /> U0IER = 0x01; // 允许RBR中断,即接收中断 <br /> /* 使能UART0中断 */<br /> //VICIntSelect = 0x00000000;// 设置所有的通道为IRQ中断<br /> VICVectCntl1 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级<br /> VICVectAddr1 = (INT32U)IRQ_UART0; // 设置UART0向量地址<br /> VICIntEnable = 1 << 0x06; // 使能UART0中断<br /> <br /> return (1);<br />}<br />void __irq IRQ_UART1 (void)<br />{<br /><br /> if ((U1IIR & 0x0F) == 0x04) <br /> rcv_new = 1; // 设置接收到新的数据标志<br /><br /> rcv1_buf[Uart1rcv_p] = U1RBR;// 读取FIFO的数据,并清除中断<br /> Uart1rcv_p++; <br /> if(Uart1rcv_p == 8) Uart1rcv_p = 0;<br /> <br /> VICVectAddr = 0x00; // 中断处理结束<br />}<br />INT8U UART1_Init(INT32U baud, UARTMODE set)<br />{<br /> INT32U bak;<br /> <br /> /* 参数过滤 */<br /> if ((baud ==0 ) || (baud > 115200)) return (0);<br /> if ((set.datab <5) || (set.datab > 8)) return (0);<br /> if ((set.stopb == 0) || (set.stopb > 2)) return (0);<br /> if (set.parity > 4) return (0);<br /> <br /> //PINSEL0 = 0x00000005; // 设置I/O连接到UART1<br /> <br /> /* 设置串口波特率 */<br /> U1LCR = 0x80; // DLAB = 1 <br /> bak = (Fpclk >> 4) / baud;<br /> U1DLM = bak >> 8;<br /> U1DLL = bak & 0xFF;<br /> <br /> /* 设置串口模式 */<br /> bak = set.datab - 5; // 设置字长<br /> if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位<br /> <br /> if (set.parity != 0)<br /> {<br /> set.parity = set.parity - 1;<br /> bak |= 0x08;<br /> }<br /> bak |= set.parity << 4; // 设置奇偶校验<br /> <br /> U1LCR = bak;<br /> <br /> U1FCR = 0x81; // 使能FIFO,并设置触发点为8字节<br /> U1IER = 0x01; // 允许RBR中断,即接收中断 <br /> /* 使能UART1中断 */<br /> // VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断<br /> VICVectCntl2 = 0x20 | 0x07; // UART1分配到IRQ slot1<br /> VICVectAddr2 = (INT32U)IRQ_UART1; // 设置UART1向量地址<br /> VICIntEnable = 1 << 0x07; // 使能UART1中断<br /> <br /> return (1);<br />}<br />void TestUART1(void)<br />{<br /> INT8U i;<br /> INT64U count;<br /> INT16U test=0; <br /> <br /> Uart1rcv_p= 0 ; <br /> for(i=0;i<=7;i++) //发送<br /> {<br /> UART1_SendByte(uarttest);<br /> }<br /> <br /> count = 0; // 等待 0.1 秒<br /> while (count < 500000) count++;<br /> <br /> for(i=0;i<=7;i++) //接收并比较是否正确<br /> {<br /> if(rcv1_buf != uarttest) test = 1;<br /> }<br /> <br /> if(test == 1) <br /> UART0_SendMessage(" UART1 ERROR(是否已经短接JP12.2与JP12.3)!
");<br /> else <br /> UART0_SendMessage(" UART1 OK!
"); <br /> for(i=0;i<8;i++)<br /> rcv1_buf = 0xff;<br />}<br />int main (void)<br />{<br /> INT8U i,j;<br /> <br /> UARTMODE uart0mode,uart1mode;<br /><br /><br /> <br /> TargetInit(); <br /> <br /> IO2SET = PIN26;<br /> IO2SET = PIN27;<br /> <br /> uart0mode.datab = 8; //8位数据位 <br /> uart0mode.stopb = 1; //1位停止位<br /> uart0mode.parity = 0; //无奇偶校验 <br /> UART0_Init(9600,uart0mode); // 串口0初始化 <br /> <br /> uart1mode.datab = 8; //8位数据位 <br /> uart1mode.stopb = 1; //1位停止位<br /> uart1mode.parity = 0; //无奇偶校验 <br /> UART1_Init_int(9600,uart1mode); <br /> // 串口1初始化 <br /><br /> while(1) <br /> {<br /> //TestUART0();//ok <br /> TestUART1(); <br /> }<br />} |
|