[求助] LPC1114串口查询发送引起接收中断

zhuodawei   2014-10-13 18:45 楼主
各位高手:
      关于LPC1114的串口使用,碰到一个很奇怪的问题,百度好久都没找到解决方法,还请各位答个疑,感谢!
      问题:使用周立功提供的TinyM0_Routine的串口例程,使用中断方式接收,查询方式进行发送。在调用发送接口后,会产生接收中断,导致TX发送出来的内容又被串口自身的RX中断接收了,好像产生了回环现象。

附上周立功TinyM0_Routine里UART的例程代码:

#include "LPC11xx.h"                                                    /* LPC11xx外设寄存器            */

/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define    UART_BPS       115200                                        /* 串口通信波特率               */
/*********************************************************************************************************
  全局变量
*********************************************************************************************************/
volatile   uint8_t          GucRcvNew;                                  /* 串口接收新数据的标志         */
uint8_t      GucRcvBuf[10] ;                                            /* 串口接收数据缓冲区           */
uint32_t     GulNum;                                                    /* 串口接收数据的个数           */
/*********************************************************************************************************
** Function name:       myDelay
** Descriptions:        软件延时
** input parameters:    ulTime - 延时时间
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void myDelay(uint32_t ulTime)
{
    uint32_t i;

    i = 0;
    while (ulTime--) {
      for (i = 0; i < 5000; i++);
    }
}
/*********************************************************************************************************
** Function name:        uartInit
** Descriptions:        串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uartInit (void)
{
    uint16_t usFdiv;
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16);                             /* 使能IOCON时钟                */
    LPC_IOCON->PIO1_6 |= 0x01;                                          /* 将P1.6 1.7配置为RXD和TXD     */
    LPC_IOCON->PIO1_7 |= 0x01;

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);                               /* 打开UART功能部件时钟         */
    LPC_SYSCON->UARTCLKDIV       = 0x01;                                /* UART时钟分频                 */

    LPC_UART->LCR  = 0x83;                                              /* 允许设置波特率               */
    usFdiv = (SystemFrequency/LPC_SYSCON->UARTCLKDIV/16)/UART_BPS;      /* 设置波特率                   */
    LPC_UART->DLM  = usFdiv / 256;
    LPC_UART->DLL  = usFdiv % 256;
    LPC_UART->LCR  = 0x03;                                              /* 锁定波特率                   */
    LPC_UART->FCR  = 0x87;                                              /* 使能FIFO,设置8个字节触发点  */
   
    NVIC_EnableIRQ(UART_IRQn);                                          /* 使能UART中断,并配置优先级   */
    NVIC_SetPriority(UART_IRQn, 1);

    LPC_UART->IER  = 0x01;                                              /* 使能接收中断                 */
}

/*********************************************************************************************************
** Function name:       uartSendByte
** Descriptions:        向串口发送子节数据,并等待数据发送完成,使用查询方式
** input parameters:    ucDat:   要发送的数据
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uartSendByte (uint8_t ucDat)
{
    LPC_UART->THR = ucDat;                                              /*  写入数据                    */
    while ((LPC_UART->LSR & 0x40) == 0);                                /*  等待数据发送完毕            */
}

/*********************************************************************************************************
** Function name:       uartSendStr
** Descriptions:        向串口发送字符串
** input parameters:    pucStr:  要发送的字符串指针
**                      ulNum:   要发送的数据个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uartSendStr (uint8_t const *pucStr, uint32_t ulNum)
{
    uint32_t i;

    for (i = 0; i < ulNum; i++){                                        /* 发送指定个字节数据           */
        uartSendByte (*pucStr++);
    }
}
/*********************************************************************************************************
* Function Name:        UART_IRQHandler
* Description:          UART中断服务函数
* Input:                无
* Output:               无
* Return:               无
*********************************************************************************************************/
void UART_IRQHandler (void)
{
    GulNum = 0;

    while ((LPC_UART->IIR & 0x01) == 0){                                /*  判断是否有中断挂起          */
        switch (LPC_UART->IIR & 0x0E){                                  /*  判断中断标志                */
        
            case 0x04:                                                  /*  接收数据中断                */
                GucRcvNew = 1;                                          /*  置接收新数据标志            */
                for (GulNum = 0; GulNum < 8; GulNum++){                 /*  连续接收8个字节             */
                GucRcvBuf[GulNum] = LPC_UART->RBR;
                }
                break;
            
            case 0x0C:                                                  /*  字符超时中断                */
                GucRcvNew = 1;
                while ((LPC_UART->LSR & 0x01) == 0x01){                 /*  判断数据是否接收完毕        */
                    GucRcvBuf[GulNum] = LPC_UART->RBR;
                    GulNum++;
                }
                break;
               
            default:
                break;
        }
    }
}
/*********************************************************************************************************
** Function name:      main
** Descriptions:       串口中断例程。
**                     串口参数:UART波特率115200、8个数据位、1个停止位、无奇偶校验位;
**                     跳线连接:分别将P1.7与串口TXD、P1.6与串口RXD短接;
**                     操作方法:打开串口调试软件,运行程序,向下位机发送n字节数据,观察接收显示窗口
**                               串口调试软件显示下位机返回的数据是否一致。
** input parameters:   无
** output parameters:  无
** Returned value:     无
*********************************************************************************************************/
int main(void)
{
    SystemInit();                                                       /* 初始化系统                   */

    uartInit ();                                                        /* 串口初始化                   */

    while (1){
        if (GucRcvNew == 1) {                                           /* 判断是否有新数据             */
            GucRcvNew = 0;                                              /* 清除标志                     */
            uartSendStr(GucRcvBuf, GulNum);                             /* 向串口发送数据               */
        }
    }
}

/*********************************************************************************************************
  End Of File
*********************************************************************************************************/

回复评论 (4)

是不是用的自测模式啊?好多单片机都有这个模式,即把发送和接收端在内部连到一块,一般都是例程中这样做。LPC1114好像是U0MCR寄存器的第4位-Loopback Mode Select。看看例程中这一位是不是置1了。
点赞  2014-10-13 21:50
引用: jishuaihu 发表于 2014-10-13 21:50
是不是用的自测模式啊?好多单片机都有这个模式,即把发送和接收端在内部连到一块,一般都是例程中这样做。 ...

U0MCR[4] 为0,没有使用Modem Loopback Mode。真是奇了怪了。。
点赞  2014-10-14 08:08
那就不知道了,372497009  这个是周立功技术支持群。你去问问
点赞  2014-10-14 08:53
我也是用了这个程序,但是太长的数据接收不全你知道是什么原因吗
点赞  2015-12-8 18:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复