zhlwangying 发表于 2012-8-8 17:36:34

PIC24f Uart 接收不到数据。

请教各位前辈:我的问题是样的,pic24f16ka102 uart1 接收不到数据,当初始化uart1后,运行在没有发送数据,uart1 的接收中断就进入一次(数据为0,这个问题待解决)。我现在主要的问题是以后我发数据到uart1,不管是用查询还是中断都不能够接收到数据。 配置程序如下(发送正常):
void Uart_init()
{
        mPORTBInputConfig(IOPORT_BIT_2); //U1Rx port
        mPORTBOutputConfig(IOPORT_BIT_7);//U1Tx port
        mPORTBOutputConfig(IOPORT_BIT_3);//max485 control port

        U1BRG = 25;                     //9600 High speed brg 8M
//        U1MODEbits.PDSEL = 0x0;          //8bit no parity check
//        U1MODEbits.STSEL = 0;            //1 bit stop   
        U1MODE = 0x8000;
        U1MODEbits.RTSMD = 1;
        U1STAbits.UTXEN = 1;             //enable transmit
//        U1STAbits.URXISEL = 0x3;
        _U1RXIE = 1;                     //enable the rx interrupt
//        _U1TXIE = 1;                     //enable the tx interrupt
       
        SetPriorityIntU1TX(UART_TX_INT_PR3);//set tx interrupt priority 1
        SetPriorityIntU1RX(UART_RX_INT_PR2);//set rx interrupt priority 1
}
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
        testbuf = U1RXREG;
        mPORTAToggleBits(IOPORT_BIT_4);
        if(testbuf!=0)
        testbuf = 0;
        _U1RXIF = 0; // clearu1rx interrupt flag and return from isr       
}

surf_131 发表于 2012-8-8 19:07:19

void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
      testbuf = U1RXREG;
      mPORTAToggleBits(IOPORT_BIT_4);
      if(testbuf!=0)
      testbuf = 0;
      _U1RXIF = 0; // clearu1rx interrupt flag and return from isr      
}

   _U1RXIF = 0; // clearu1rx interrupt flag and return from isr ——这语句是哪个师傅教的?好好去看手册,读串口缓存就是清除中断标志。
用watch看看你的sfr,看串口是不是已经报错了?估计这么乱写就已经把RX弄得出错了。

zhlwangying 发表于 2012-8-9 09:36:03

surf_131 发表于 2012-8-8 19:07 static/image/common/back.gif
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
      testbuf = U1RXREG;


感谢回答。但是你说的不是问题,因为pic库里面是这样定义的可以这样用的。看库函数代码

/* IFS0 */
#define _INT0IF IFS0bits.INT0IF
#define _IC1IF IFS0bits.IC1IF
#define _OC1IF IFS0bits.OC1IF
#define _T1IF IFS0bits.T1IF
#define _IC2IF IFS0bits.IC2IF
#define _OC2IF IFS0bits.OC2IF
#define _T2IF IFS0bits.T2IF
#define _T3IF IFS0bits.T3IF
#define _SPF1IF IFS0bits.SPF1IF
#define _SPI1IF IFS0bits.SPI1IF
#define _U1RXIF IFS0bits.U1RXIF
#define _U1TXIF IFS0bits.U1TXIF
#define _AD1IF IFS0bits.AD1IF

zhlwangying 发表于 2012-8-9 09:42:34

surf_131 发表于 2012-8-8 19:07 static/image/common/back.gif
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
      testbuf = U1RXREG;


我已看过手册了,读取rxreg跟清除中断标志没有关联。

surf_131 发表于 2012-8-9 09:52:52

/* This is UART1 receive ISR */
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
IFS0bits.U1RXIF = 0;
/* Read the receive buffer till atleast one or more character can be
read */
        U1STAbits.OERR = 0;       
}
可能是上电时的错误导致模块溢出。

手册:
一旦将OERR 置1,将不会有数据移入到UxRSR (直
到用软件将OERR 位清零或发生复位为止)。 UxRSR
和UxRXREG 中的数据保持有效。


zhlwangying 发表于 2012-8-9 09:59:53

surf_131 发表于 2012-8-9 09:52 static/image/common/back.gif
/* This is UART1 receive ISR */
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{


谢谢,但是我在线调试查看了,那个位并未置1,同时我用你的方法试了,还是没有用。。

surf_131 发表于 2012-8-9 11:00:45

这里我一般都是用GPS模块来提供输入,确保所有问题都来自自己的板子一侧,就容易检查调试了。

sweet_136 发表于 2012-8-9 11:05:37

zhlwangying 发表于 2012-8-9 09:59 static/image/common/back.gif
谢谢,但是我在线调试查看了,那个位并未置1,同时我用你的方法试了,还是没有用。。 ...

恩.现在找到问题了没?

zhlwangying 发表于 2012-8-9 11:16:22

sweet_136 发表于 2012-8-9 11:05 static/image/common/back.gif
恩.现在找到问题了没?

还没有得到解决呀。发送是正常的,但就就是收不到。我测过rx引脚都是有信号的。
void Uart_init()
{
        mPORTBInputConfig(IOPORT_BIT_2); //U1Rx port
        mPORTBOutputConfig(IOPORT_BIT_7);//U1Tx port
        mPORTBOutputConfig(IOPORT_BIT_3);//max485 control port
       
        U1BRG = 103;                     //9600 High speed brg 4M

        U1MODE = 0x8000;
        U1MODEbits.BRGH = 1;
        U1MODEbits.RXINV = 0;
        U1MODEbits.WAKE = 1;
       
        U1STAbits.UTXEN = 1;             //enable transmit
        _U1RXIE = 1;                     //enable the rx interrupt
//        _U1TXIE = 1;                     //enable the tx interrupt
       
        SetPriorityIntU1TX(UART_TX_INT_PR3);//set tx interrupt priority 1
        SetPriorityIntU1RX(UART_RX_INT_PR2);//set rx interrupt priority 1         
}
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
       
        testbuf = U1RXREG;
        mPORTAToggleBits(IOPORT_BIT_4);
        _U1RXIF = 0; // clearu1rx interrupt flag and return from isr
               
}

sweet_136 发表于 2012-8-9 11:30:08

zhlwangying 发表于 2012-8-9 11:16 static/image/common/back.gif
还没有得到解决呀。发送是正常的,但就就是收不到。我测过rx引脚都是有信号的。
void Uart_init()
{


恩。我现在也遇到这个问题。我是这样设置的。1.接受数据的中断函数不能太长,最好就几个标志变量,2.TX,RX 端口都设置为输入口。3.发送给单片机的字符不要超过2个。

zhlwangying 发表于 2012-8-9 11:48:12

sweet_136 发表于 2012-8-9 11:30 static/image/common/back.gif
恩。我现在也遇到这个问题。我是这样设置的。1.接受数据的中断函数不能太长,最好就几个标志变量,2.TX,R ...

我的代码在上面。你的修改方式我虽然有点不太认同,但是我还是试了一下tx改为输入,中断里面基本上没有东西呀。但是还是不行。我发送数据到pc机上是正常的,就是接收不到。RX端口我用示波器看了一下,是有发送数据的。

sweet_136 发表于 2012-8-9 13:44:39

zhlwangying 发表于 2012-8-9 11:48 static/image/common/back.gif
我的代码在上面。你的修改方式我虽然有点不太认同,但是我还是试了一下tx改为输入,中断里面基本上没有东 ...

恩,现在怎么样了?搞出来了没?搞出来了告诉我哦。

zhlwangying 发表于 2012-8-9 14:58:01

现在使用环回模式控制,能够收到数据,但是使用外部输入数据引脚还是没有办法收到数据。。。

sweet_136 发表于 2012-8-9 16:24:58

zhlwangying 发表于 2012-8-9 14:58 static/image/common/back.gif
现在使用环回模式控制,能够收到数据,但是使用外部输入数据引脚还是没有办法收到数据。。。 ...

恩。我现在那个问题我找到原因了。就是因为发生了错误,才会这样子。我用的是CCS 和你的不同(我也不知道你用的是那个)

我感觉你的问题,肯定是 FERR,OERR 发生了错误, 你写一个测试程序。


void mian()
{
while(1)
{
    if(FERR == 1)
   {
      FERR = 0;
   }
   if( OERR == 1)
{
      OERR = 0;
   }
}
}

xx中断()
{
    关闭串口中断
    延时
    发送接收到的数据。
    打开串口中断
}


你试试,希望你成功。

surf_131 发表于 2012-8-9 16:33:24

自环能收到?是物理环吧?就是RX&TX连到一起的。
如果是,但是外部不行,那很可能就是把RX跟对端RX连接,TX跟对端TX连接,相当书房的书呆子初级错误。呵呵

zhlwangying 发表于 2012-8-9 17:19:54

surf_131 发表于 2012-8-9 16:33 static/image/common/back.gif
自环能收到?是物理环吧?就是RX&TX连到一起的。
如果是,但是外部不行,那很可能就是把RX跟对端RX连接,TX ...

那个是单片机内部可以配置连接在一起。外部连接是将TX与RX端口连接在一起。

surf_131 发表于 2012-8-9 22:49:42

软件设置的自环是逻辑环,不涉及接口的物理特性。物理上直接环回来也可以在逻辑环正常后测试一下。

zhlwangying 发表于 2012-8-10 11:40:12

问题终于解决了,PIC手册太坑人了。port被外设使用,还的配置AD里面的一个寄存器。希望各位朋友多多注意这个问题。感谢各位的热情解答。。
AD1PCFG   需要配置与ad复用的引脚做模拟输入还是数字输入(这个问题在手册上跟本提半个字)。

zhuyihua001 发表于 2013-11-8 15:20:59

在端口设置那一章说明了这个,PIC24F系列手册之端口

fengyunyu 发表于 2014-11-23 16:52:48

先关注!

xfdr 发表于 2014-12-10 22:09:58

得做端口映射,RX引脚分配给RPX
页: [1]
查看完整版本: PIC24f Uart 接收不到数据。