打印
[技术问答]

nuc120 UART1 不能接收数据

[复制链接]
1967|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
851095361|  楼主 | 2015-7-25 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
同样的程序在UART0 收发数据,但是在UART1就只能发送不能接收。
初始化
void UARTInit(unsigned int  bdr)
{
   STR_UART_T sParam1;  
    DrvGPIO_InitFunction(E_FUNC_UART1);
    SYSCLK->CLKSEL1.UART_S = 0;
    sParam1.u32BaudRate                 = bdr; // 115200
    sParam1.u8cDataBits                 = DRVUART_DATABITS_8;
    sParam1.u8cStopBits                 = DRVUART_STOPBITS_1;
    sParam1.u8cParity                 = DRVUART_PARITY_NONE;
    sParam1.u8cRxTriggerLevel= DRVUART_FIFO_4BYTES;
        DrvUART_Open(UART_PORT1,&sParam1);

        SYS->GPBMFP.UART1_nRTS_ALE = 0;
        SYS->GPBMFP.UART1_nCTS_nCS = 0;

   
    DrvUART_EnableInt(UART_PORT1, (DRVUART_RLSINT | DRVUART_RDAINT | DRVUART_TOUTINT),UART_INT_HANDLE);
   
}
接收程序
void UART_INT_HANDLE(uint32_t u32IntStatus)
{
    uint8_t bInChar[1]={0xFF};
    uint16 i;
    while (UART1->FSR.RX_EMPTY == 0)   
    {
        //DrvUART_Read(UART_PORT0, bInChar, 1);
        bInChar[0] = UART1->DATA;
        i = (pIn+1) % RCV_BUFF_SIZE;
        if(i != pOut)
        {
            RcvBuf[pIn] = bInChar[0];
            pIn = i;  
            RcvCnt = GetValidDataNum();//RcvCnt++;                     
        }   
    }
}
沙发
734774645| | 2015-7-26 09:15 | 只看该作者
你没有设置好,为何好多人不按照历程做

使用特权

评论回复
板凳
851095361|  楼主 | 2015-7-26 12:42 | 只看该作者
734774645 发表于 2015-7-26 09:15
你没有设置好,为何好多人不按照历程做

我没例程,这个我是看这UART0的接收数据的程序改的,原来的程序是可以接收数据的,但是我把它成UART1就不行了,也不知道哪错了。在网上也没找到UART1的接收例程。你有的话,给我一份例程。谢谢了

使用特权

评论回复
地板
mintspring| | 2015-7-26 16:06 | 只看该作者
去百度搜索新唐,第一个应该就是官网,然后产品里找到这个,有相关资源等选项卡,找到后下拉网页就看到BSP了,如果那家伙没发给你,晚上我发

使用特权

评论回复
5
mintspring| | 2015-7-26 21:05 | 只看该作者
6
mintspring| | 2015-7-26 21:06 | 只看该作者
上面那个就是下载地址,楼主试试看。

使用特权

评论回复
7
稳稳の幸福| | 2015-7-27 10:07 | 只看该作者
试试上面兄台发的库函数好用不

使用特权

评论回复
8
捉虫天师| | 2015-7-27 11:41 | 只看该作者
while (UART1->FSR.RX_EMPTY == 0)    这个写的还是很地道的。

使用特权

评论回复
9
851095361|  楼主 | 2015-7-27 15:20 | 只看该作者
本帖最后由 851095361 于 2015-7-27 18:21 编辑

void UART_INT_HANDLE(uint32_t u32IntStatus)
{
    uint8_t bInChar[1]={0xFF},a;
    uint16 i;

    UART1SendByte(48);//0的ASCII码
    while (UART1->FSR.RX_EMPTY == 0)   
    {
        //DrvUART_Read(UART_PORT0, bInChar, 1);
        bInChar[0] = UART1->DATA;
        a=bInChar[0];
        UART1SendByte(a);// 测试读取的数据

        i = (pIn+1) % RCV_BUFF_SIZE;
        if(i != pOut)
        {
            RcvBuf[pIn] = bInChar[0];
            pIn = i;  
            RcvCnt = GetValidDataNum();//RcvCnt++;                     
        }   
    } UART1SendByte(49);//1的ASCII码
}我用的是48管脚的NUC120
我增加了测试语句,发现用UART1有个问题,就是这个中断只执行一次,之后不再执行。但是UART0不会。
用串口调试助手 发送  3   显示 031   ,之后再发送任何数据串口助手不在显示。也就是怎么发送数据,都不会进入UART_INT_HANDLE()这个函数。(不知道这样理解对不对?)
这种情况是不是中断标志位没有清0,使得串口不能进入下一次中断。但不是说 对接收数据的寄存器进行读操作,中断标志会自动清0吗?而且这种情况在UART0没有,就在UART1出现,现在蒙了,谁能帮下我,谢谢了

使用特权

评论回复
10
851095361|  楼主 | 2015-7-27 19:10 | 只看该作者
mintspring 发表于 2015-7-26 21:06
上面那个就是下载地址,楼主试试看。

谢谢了,这个我看过,里面的串口例子都是UART0的,UART0的例程是可以接收的,但是我把相应的设置该成UAR1就不行了,也不知道有没有改对,所以想参考下UART1的例程

使用特权

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

本版积分规则

3

主题

9

帖子

0

粉丝