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