打印
[ZLG-ARM]

LPC2132 UART1的FIFO通讯收发测试

[复制链接]
3154|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lymbgd|  楼主 | 2009-3-10 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我试验的串口程序,我已经搞了好几天了,始终无法搞定,这两个程序我在SMART2200学习板(LPC2210)上试过,UART0及UART1都运行正常,但是,在我自己的用户板(LPC2132)上UART0运行正常,UART1运行不正常,如果传送多于14个字符就出现乱码。

//串口0通信-中断方式实验
#include "config.h"

#define    UART_BPS    115200                                          /*  串口通信波特率              */
#define RTS1_LO IO1CLR = 0x00400000;            // RTS1 =P1 bit 22
#define RTS1_HI IO1SET = 0x00400000;

volatile    uint8 uiGRcvNew;                                            /*  串口接收新数据的标志        */
uint8       uiGRcvBuf[30] = {0};                                        /*  串口接收数据缓冲区          */
uint32      uiGNum;                                                     /*  串口接收数据的个数          */

/*********************************************************************************************************
** Function name:        DelayNS
** Descriptions:        延时函数
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void DelayNS (uint32 uiDly)
{
    uint32 i;
    
    for (; uiDly > 0; uiDly--){
        for(i = 0; i < 50000; i++);
    }
}

/*********************************************************************************************************
** Function name:        UART0_IRQ
** Descriptions:        串口中断服务函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __irq UART0_IRQ (void)
{
    uiGNum = 0;
       
    while ((U0IIR & 0x01) == 0){                                        /*  判断是否有中断挂起          */
        switch (U0IIR & 0x0E){                                          /*  判断中断标志                */
        
            case 0x04:                                                  /*  接收数据中断                */
                uiGRcvNew = 1;                                          /*  置接收新数据标志            */
                for (uiGNum = 0; uiGNum < 14; uiGNum++){                 /*  连续接收8个字节             */
                uiGRcvBuf[uiGNum] = U0RBR;
                }
                break;
            
            case 0x0C:                                                  /*  字符超时中断                */
                uiGRcvNew = 1;
                while ((U0LSR & 0x01) == 0x01){                         /*  判断数据是否接收完毕        */ 
                    uiGRcvBuf[uiGNum] = U0RBR;
                    uiGNum++;
                }
                break;
                
            default:
                break;
        }
    }
   
   VICVectAddr = 0x00;
   
}

/*********************************************************************************************************
** Function name:        UARTInit
** Descriptions:        串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UARTInit (void)
{
    uint16 uiFdiv;
    
    U0LCR  = 0x83;                                                      /*  允许设置波特率              */
    uiFdiv = (Fpclk / 16) / UART_BPS;                                   /*  设置波特率*/
    U0DLM  = uiFdiv / 256;
    U0DLL  = uiFdiv % 256; 
    U0LCR  = 0x03;                                                      /*  锁定波特率                  */
}

/*********************************************************************************************************
** Function name:        UART0SendByte
** Descriptions:        向串口发送子节数据,并等待数据发送完成,使用查询方式
** input parameters:    uiDat   要发送的数据
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART0SendByte (uint8 uiDat)
{
    U0THR = uiDat;                                                      /*  写入数据                    */
    while ((U0LSR & 0x20) == 0);                                        /*  等待数据发送完毕            */
}

/*********************************************************************************************************
** Function name:        UART0SendStr
** Descriptions:        向串口发送字符串
** input parameters:    uiStr   要发送的字符串指针
**                      uiNum   要发送的数据个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART0SendStr(uint8 const *uiStr, uint32 uiNum)
{
    uint32 i;
    
    for (i = 0; i < uiNum; i++){                                        /*  发送指定个字节数据           */
        UART0SendByte (*uiStr++);
    }
 
}

/*********************************************************************************************************
** Function name:        main
** Descriptions:        跳线JP6短接,打开串口调试软件,串口0中断方式通信
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
    
    PINSEL0 = PINSEL0 & (~0x0F);                                        
    PINSEL0 = PINSEL0 | 0x05;                                           /*  设置I/O连接到UART           */
    IO1DIR = 0x00400000;
    
    uiGRcvNew = 0;
    RTS1_HI
    UARTInit ();                                                        /*  串口初始化                  */
    U0FCR = 0xc1;                                                       /*  使能FIFO,设置8个字节触发点 */
    U0IER = 0x01;                                                       /*  使能接收中断                */
    
    //IRQEnable ();
    
    VICIntSelect = 0x00000000;                                          /*  设置所有中断为向量中断      */
    VICVectCntl0 = 0x20 | 0x06;                                         /*  设置串口中断为最高优先级    */
    VICVectAddr0 = (uint32)UART0_IRQ;                                   /*  设置向量地址                */
    VICIntEnable = 1 << 0x06;                                           /*  使能串口中断                */
    
    while (1){
        if (uiGRcvNew == 1){                                            /*  判断是否有新数据            */
            uiGRcvNew = 0;
            RTS1_HI                                              /*  清除标志                    */
            UART0SendStr (uiGRcvBuf, uiGNum);                           /*  向串口发送数据              */
        }
        if(U0LSR&0x40){
            //DelayNS(10);
            RTS1_LO
        }
    }

    return 0;
}

相关帖子

沙发
lymbgd|  楼主 | 2009-3-10 14:48 | 只看该作者

//串口1通信-中断方式实验

#include "config.h"

#define    UART_BPS    115200                                          /*  串口通信波特率              */
#define RTS1_LO IO1CLR = 0x00400000;            // RTS1 =P1 bit 22
#define RTS1_HI IO1SET = 0x00400000;

volatile    uint8 uiGRcvNew;                                            /*  串口接收新数据的标志        */
uint8       uiGRcvBuf[30] = {0};                                        /*  串口接收数据缓冲区          */
uint32      uiGNum;                                                     /*  串口接收数据的个数          */

/*********************************************************************************************************
** Function name:        DelayNS
** Descriptions:        延时函数
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void DelayNS (uint32 uiDly)
{
    uint32 i;
    
    for (; uiDly > 0; uiDly--){
        for(i = 0; i < 50000; i++);
    }
}

/*********************************************************************************************************
** Function name:        UART0_IRQ
** Descriptions:        串口中断服务函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __irq UART1_IRQ (void)
{
    uiGNum = 0;
       
    while ((U1IIR & 0x01) == 0){                                        /*  判断是否有中断挂起          */
        switch (U1IIR & 0x0E){                                          /*  判断中断标志                */
        
            case 0x04:                                                  /*  接收数据中断                */
                uiGRcvNew = 1;                                          /*  置接收新数据标志            */
                for (uiGNum = 0; uiGNum < 14; uiGNum++){                 /*  连续接收8个字节             */
                uiGRcvBuf[uiGNum] = U1RBR;
                }
                break;
            
            case 0x0C:                                                  /*  字符超时中断                */
                uiGRcvNew = 1;
                while ((U1LSR & 0x01) == 0x01){                         /*  判断数据是否接收完毕        */ 
                    uiGRcvBuf[uiGNum] = U1RBR;
                    uiGNum++;
                }
                break;
                
            default:
                break;
        }
    }
   
   VICVectAddr = 0x00;
   
}

/*********************************************************************************************************
** Function name:        UARTInit
** Descriptions:        串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UARTInit (void)
{
    uint16 uiFdiv;
    
    U1LCR  = 0x83;                                                      /*  允许设置波特率              */
    uiFdiv = (Fpclk / 16) / UART_BPS;                                   /*  设置波特率*/
    U1DLM  = uiFdiv / 256;
    U1DLL  = uiFdiv % 256; 
    U1LCR  = 0x03;                                                      /*  锁定波特率                  */
}

/*********************************************************************************************************
** Function name:        UART0SendByte
** Descriptions:        向串口发送子节数据,并等待数据发送完成,使用查询方式
** input parameters:    uiDat   要发送的数据
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART1SendByte (uint8 uiDat)
{
    U1THR = uiDat;                                                      /*  写入数据                    */
    while ((U1LSR & 0x20) == 0);                                        /*  等待数据发送完毕            */
}

/*********************************************************************************************************
** Function name:        UART0SendStr
** Descriptions:        向串口发送字符串
** input parameters:    uiStr   要发送的字符串指针
**                      uiNum   要发送的数据个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART1SendStr(uint8 const *uiStr, uint32 uiNum)
{
    uint32 i;
    
    for (i = 0; i < uiNum; i++){                                        /*  发送指定个字节数据           */
        UART1SendByte (*uiStr++);
    }
 
}

/*********************************************************************************************************
** Function name:        main
** Descriptions:        跳线JP6短接,打开串口调试软件,串口0中断方式通信
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
    
    PINSEL0 = PINSEL0 & (~0x000F0000);                                        
    PINSEL0 = PINSEL0 | 0x00050000;                                           /*  设置I/O连接到UART           */
    IO1DIR = 0x00400000;
    
    uiGRcvNew = 0;
    RTS1_HI
    UARTInit ();                                                        /*  串口初始化                  */
    U1FCR = 0xc1;                                                       /*  使能FIFO,设置8个字节触发点 */
    U1IER = 0x01;                                                       /*  使能接收中断                */
    
    //IRQEnable ();
    
    VICIntSelect = 0x00000000;                                          /*  设置所有中断为向量中断      */
    VICVectCntl0 = 0x20 | 0x07;                                         /*  设置串口中断为最高优先级    */
    VICVectAddr0 = (uint32)UART1_IRQ;                                   /*  设置向量地址                */
    VICIntEnable = 1 << 0x07;                                           /*  使能串口中断                */
    
    while (1){
        if (uiGRcvNew == 1){                                            /*  判断是否有新数据            */
            uiGRcvNew = 0;
            RTS1_HI                                                      /*  清除标志                    */
            UART1SendStr (uiGRcvBuf, uiGNum);                           /*  向串口发送数据              */
        }
        if(U1LSR&0x40){
            //DelayNS(2);
            RTS1_LO
        }
    }

    return 0;
}

使用特权

评论回复
板凳
lymbgd|  楼主 | 2009-3-10 14:53 | 只看该作者

我也用“菜地”的程序试过,好像也不行

我也用“菜地”的程序试过,好像也不行,哪位有LPC2132的板子,麻烦试一下我的程序有问题么?

使用特权

评论回复
地板
lymbgd|  楼主 | 2009-3-12 00:58 | 只看该作者

快崩溃了

今天,技术支持给我的例程好像也不行。难道又是LPC2132的BUG么?

使用特权

评论回复
5
lymbgd|  楼主 | 2009-4-17 01:00 | 只看该作者

原因找到了

我的UART1  接的是RS485通讯,是半双工的,收到一次接收中断后就转发送状态了,后面的数据就收不到了。

使用特权

评论回复
6
achenke| | 2009-4-23 15:09 | 只看该作者

细节啊

细节啊,害死人.

使用特权

评论回复
7
jumpoo| | 2009-5-11 13:58 | 只看该作者

细节很重要

使用特权

评论回复
8
acertm| | 2009-5-12 12:41 | 只看该作者

挺长的。学习了

使用特权

评论回复
9
xuxiaoli0724| | 2013-11-25 09:39 | 只看该作者
lymbgd 发表于 2009-4-17 01:00
我的UART1&nbsp;&nbsp;接的是RS485通讯,是半双工的,收到一次接收中断后就转发送状态了,后面的数据就收不 ...

你好,那你这个问题最后是怎么解决的,我也遇到差不多的问题,谢谢啦、、、

使用特权

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

本版积分规则

13

主题

82

帖子

0

粉丝