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,可以排除,郁闷了好久了,大家有没有碰到过这样的情况? PIC24FJ256GA106 高级货色 还有2个线索,1是 那两段解锁和加锁的汇编代码,不管有或没有,串口的发送都是正常的,难道不需要解锁?
2是设置成环回模式时,可以收到自己发出的字符
现在主要是设置IO重定义的那2句是不是有问题,但看数据手册上的代码也是这样操作的
RPOR4bits.RP9R = 3; //RP9 设置成 U1TXD外设编号=3
RPINR18bits.U1RXR = 8; //RP8 设置成 U1RXD 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();
} 上面的设置,能发能收 奇怪,用 64GA时,类似的代码可用。 晕了,先冷却一下 我也遇到这个问题,串口外面接的是一个485的芯片。初始化单片机串口后,那个接收引脚就是低电平,导致单片机出那个帧错误。也是就收不到数据,在主循环中清楚了串口相应的错误,就可以收到数据了。不知道为什么导致串口接收出错。 可能是AD与串口的接收管脚使用了统一管脚,必须在AD控制寄存器里关掉AD
页:
[1]