打印
[ZLG-ARM]

求助:LPC2294串口1的收发问题

[复制链接]
2532|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luckyfzl|  楼主 | 2008-2-17 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的串口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();        
         }
}

相关帖子

沙发
zlgarm| | 2008-2-18 09:22 | 只看该作者

引脚连接PINSEL设置

luckyfzl 您好!
    您的UART1初始化没有设置引脚连接模块PINSEL.
                            By zlgarm_lijintao

使用特权

评论回复
板凳
luckyfzl|  楼主 | 2008-2-19 10:38 | 只看该作者

谢谢李兄关注,是这样嘛?

谢谢李兄关注,是这样嘛?
PINSEL0 =PINSEL0 | 0x00050000;// 设置I/O连接到UART1

我将RXD1/TXD1直接用线短接了。
但是,我还是进不了接收中断,从示波器看,数据是发出来了

使用特权

评论回复
地板
zlgarm| | 2008-2-19 19:28 | 只看该作者

打开IRQ中断

luckyfzl 您好:
   
   您还需要再使能内核中的IRQ中断。在我们公司的提供的模板中,需要在程序中添加 IRQEnable();

                                                by zlgarm_zhp

使用特权

评论回复
5
armecos| | 2008-2-20 09:05 | 只看该作者

可能是进入UART1中断了,但没有出来,死机了。

还有注意跳线连接,串口线线序以及是否开焊断路,换根线试下。
引脚分配设置也要注意。

LPC22XX我们有现成的库,UART0/1都可以正常工作。
关于串口编程注意事项如下:
串口编程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

0

粉丝