glj77 发表于 2009-4-29 18:39:51

PIC24FJ256GA106 的串口接收问题

现在用这个芯片作串口通信时,发送正常,但接收不正常,不知是何原因,代码如下:


#include <p24fxxxx.h>

_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx3 & BKBUG_ON)
_CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL & IOL1WAY_OFF & FNOSC_PRIPLL)


void UART1_put(unsigned char dat)
{
    U1TXREG = dat;
    while (!U1STAbits.TRMT);
}



int main(void)
{
    unsigned char dat = 0xAA;

    // Unlock Registers
    asm volatile ( " MOV #OSCCON, w1 \n "
                  " MOV #0x46, w2   \n "
                  " MOV #0x57, w3   \n "
                  " MOV.bw2, \n "
                  " MOV.bw3, \n "
                  " BCLR OSCCON, #6    " );


    RPOR4bits.RP9R = 3;                  //RP9 设置成 U1TXD外设编号=3
    RPINR18bits.U1RXR = 8;               //RP8 设置成 U1RXD

    // Lock Registers
    asm volatile ( " MOV #OSCCON, w1 \n "
                  " MOV #0x46, w2   \n "
                  " MOV #0x57, w3   \n "
                  " MOV.bw2, \n "
                  " MOV.bw3, \n "
                  " BSET OSCCON, #6    " );


    TRISBbits.TRISB8 = 1;   //输入
    TRISBbits.TRISB9 = 0;   //输出


    U1BRG=( 16000000 + 8ul * 9600 ) / 16 / 9600 - 1;
    U1MODEbits.UARTEN = 1;
    U1STAbits.UTXEN = 1;

    //UART1_put(0x55);         //发送测试是OK的

    while(1)
    {
      if(_U1RXIF)            // 如果接收到数据
      {
            _U1RXIF = 0;
            dat = U1RXREG;
            UART1_put(dat);    //问题在这里,一直会发送 0
      }
    }
}

    程序的本意是收1个字符,然后发送回去
    发送是没有问题的,但无法正确接收
    怀疑串口的IO配置有问题,但看不出有什么问题,硬件电路绝对OK,可以排除,郁闷了好久了,大家有没有碰到过这样的情况?

TinyAVR 发表于 2009-4-29 19:01:02

PIC24FJ256GA106 高级货色

glj77 发表于 2009-4-29 19:20:01

还有2个线索,1是 那两段解锁和加锁的汇编代码,不管有或没有,串口的发送都是正常的,难道不需要解锁?
             2是设置成环回模式时,可以收到自己发出的字符
现在主要是设置IO重定义的那2句是不是有问题,但看数据手册上的代码也是这样操作的

    RPOR4bits.RP9R = 3;                  //RP9 设置成 U1TXD外设编号=3
    RPINR18bits.U1RXR = 8;               //RP8 设置成 U1RXD

loadstar 发表于 2009-4-30 11:22:01

void Usart1_Initial(unsigned char baud)   //USART初始化
{
        U1MODE = 0;//8BIT1STOP
        U1STA = 0;
        U1MODEbits.RTSMD = 1;//单工模式
        U1MODEbits.BRGH = 0;//BRGH = 0
        U1STAbits.UTXISEL1 = 0; //所有发送操作完成后,产生中断
        U1STAbits.UTXISEL0 = 1;
        U1STAbits.URXISEL1 = 0; //接收到一个字符,且传输到接收缓冲器
        U1STAbits.URXISEL0 = 0; //产生中断
        switch(baud&0x3)
        {
                case 0:                        //FCY = FOSC/2 = 16MIPS
                        U1BRG =0X19F;        //FCY/16*BAUD-1
                        break;                        //2400bps
                case 1:
                        U1BRG =0XCF;        //FCY/16*BAUD-1
                        break;                        //4800bps
                case 2:
                        U1BRG =0X67;        //FCY/16*BAUD-1
                        break;                        //9600bps
                case 3:
                        U1BRG =0X33;        //FCY/16*BAUD-1
                        break;                        //19200bps
                default:
                        break;
        }
        U1MODEbits.UARTEN = 1; //使能USART
        U1STA|= 0X400;   //使能发送
        _U1RXIF = 0;   //接收中断标志清零
        _U1TXIF = 0;   //发送中断标志清零
        _U1RXIE = 1;   //使能接收中断
        _U1TXIE = 0;   //不使能发送中断
        En485Rx();
}

loadstar 发表于 2009-4-30 11:23:05

上面的设置,能发能收

glj77 发表于 2009-4-30 21:22:12

奇怪,用 64GA时,类似的代码可用。 晕了,先冷却一下

nyb 发表于 2012-11-23 20:06:48

我也遇到这个问题,串口外面接的是一个485的芯片。初始化单片机串口后,那个接收引脚就是低电平,导致单片机出那个帧错误。也是就收不到数据,在主循环中清楚了串口相应的错误,就可以收到数据了。不知道为什么导致串口接收出错。

luoshengyang 发表于 2012-11-26 14:22:59

可能是AD与串口的接收管脚使用了统一管脚,必须在AD控制寄存器里关掉AD
页: [1]
查看完整版本: PIC24FJ256GA106 的串口接收问题