打印

PIC24FJ64GA002 UART RX 问题

[复制链接]
3885|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hlhfootbal|  楼主 | 2012-2-25 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PICkit 2 DEBUG,发现U2RXREG始终是0.但是用示波器观察电脑发送的数据已经到接收脚,PIN18脚。
然后就是进不了中断,程序等在while(!DataAvailable);这里了。
请帮忙看看是哪里出了问题,谢谢!


#include "p24fj64ga002.h"
//#include<uart.h>
//此程序适用I2C1 ,SDA1,SCL1 (备用口)
//_CONFIG1(ICS_PGx1&FWDTEN_OFF)

_CONFIG2(FNOSC_FRC&FCKSM_CSDCMD&I2C1SEL_SEC)//fast RC oscillator;clock switching and Fail-Safe clock monitor are disable


void cUART2(void);
void UART2INT(void);
void configUART2(void);


unsigned char DataAvailable;
unsigned char Txdata[]= "hello";
unsigned char Rxdata[10];
void __attribute__ ((interrupt,no_auto_psv)) _U2TXInterrupt(void)
{
static unsigned char i=0;
IFS1bits.U2TXIF = 0;//clear flag
if(Txdata[i]!='\0')
{
while(U2STAbits.UTXBF);
U2TXREG = Txdata[i++];
}
else
{
while(!U2STAbits.TRMT);
//DisableIntU2TX;
IEC1bits.U2TXIE = 0;
}
}

void __attribute__ ((interrupt,no_auto_psv)) _U2RXInterrupt(void)
{
static unsigned char j=0;//why set to static?
IFS1bits.U2RXIF = 0;
if(U2STAbits.OERR)
{U2STAbits.OERR = 0;}
while(!U2STAbits.URXDA);
Rxdata[j++] = U2RXREG;
DataAvailable=1;
}

void uart(void)
{
asm volatile (
"MOV #OSCCON, W1 \n"
"MOV #0X46, W2 \n"
"MOV #0X57,W3 \n"
"MOV.b W2, [W1] \n"
"MOV.B W3, [W1] \n"
"BCLR OSCCON,#6"
);

//Assign U2RX to pin RP9
RPINR19bits.U2RXR = 9;

//assign U2TX to pin RP4
RPOR2bits.RP4R = 5;

asm volatile (
"MOV #OSCCON, W1 \n"
"MOV #0X46, W2 \n"
"MOV #0X57,W3 \n"
"MOV.b W2, [W1] \n"
"MOV.B W3, [W1] \n"
"BSET OSCCON,#6"
);
//Close UART2
cUART2();

/*Enable UART intruupts*/
UART2INT();

/*UART initialized to 9600 baudrate @BRGH=0, 8bit,no parity and 1 stopbit,interrupt is set on RST transfer,making the receive full*/
configUART2();

/* Data Transmit and receiving the data using interrupts*/
//IFS1bits.U2TXIF = 1;//what is this used for?
while(!DataAvailable);/*wait till data is received*/
DataAvailable=0;
cUART2();
}

void main(void)
{

OSCCONbits.COSC=0;
CLKDIV=0;

TRISBbits.TRISB15= 0; //P1B5 is output
LATBbits.LATB15 = 0;


uart();
if(Rxdata[0]== 1)
LATBbits.LATB15 = 1;
else
LATBbits.LATB15 = 0;
// while(1)
//{;}
}

void cUART2(void)
{
U2MODEbits.UARTEN = 0;
IEC1bits.U2TXIE = 0;
IEC1bits.U2RXIE = 0;
IFS1bits.U2TXIF = 0;
IFS1bits.U2RXIF = 0;
}

void UART2INT(void)
{
IEC1bits.U2TXIE = 1;
IEC1bits.U2RXIE = 1;
IPC7bits.U2TXIP = 1;
IPC7bits.U2RXIP = 2;
}

void configUART2(void)
{
U2MODEbits.UARTEN = 1;
//U2STAbits.UTXEN = 1;
U2STAbits.URXISEL = 0;
U2BRG = 25;
}
沙发
yewuyi| | 2012-2-25 16:19 | 只看该作者
一共也没几行代码,自己也搞不定吗?

根本不需要带什么KIT2,直接软件仿真看就可以了。

使用特权

评论回复
板凳
hlhfootbal|  楼主 | 2012-2-25 22:45 | 只看该作者
LS,问题是发现U2RXREG始终是0.但是用示波器观察电脑发送的数据已经到接收脚。
我不清楚是哪里出问题了。

使用特权

评论回复
地板
wwhh| | 2012-2-26 14:49 | 只看该作者
我没用过 PIC24FJ64GA002,可以提醒的一点是:与模拟端口共用的管脚在上电时默认为模拟输入功能,如需使用数字功能,要禁止该管脚的模拟功能

使用特权

评论回复
5
Ryanhsiung| | 2012-2-26 21:24 | 只看该作者
具体还是看DATASHEET,慢慢对一下寄存器
1、中断没开
2、UART寄存器没有设置对
3、UART这个模块有没有使能(有些单片机为了降低功耗,会增加模块能使)
4、IO口设置没对
5、。。。等等

使用特权

评论回复
6
yewuyi| | 2012-2-27 08:34 | 只看该作者
LS,问题是发现U2RXREG始终是0.但是用示波器观察电脑发送的数据已经到接收脚。
我不清楚是哪里出问题了。
hlhfootbal 发表于 2012-2-25 22:45


既然接收信号已经到达了MCU的接受引脚上,但MCU并没有响应,那还要问吗?

肯定是接受程序有问题了啊。

你首先要检查中断的各项设置对不对,检查中断有没有打开,检查IO口设置对不对。。。
这些检查自己完成,可不要依靠别人来帮你完成这个。
其次在接受中断中加一行LED灯闪烁代码,用它可以看到是否进入了中断。

使用特权

评论回复
7
hlhfootbal|  楼主 | 2012-3-1 23:35 | 只看该作者
现在是这样的情况。
单步仿真的时候,不可以发送数据,也接收不到数据,即接收寄存器是0.
不仿真的时候,可以正常发送数据,可以接收到数据,但是接收到的数据不正确。
是怎么回事?
多谢!

使用特权

评论回复
8
yewuyi| | 2012-3-2 08:40 | 只看该作者
现在是这样的情况。
单步仿真的时候,不可以发送数据,也接收不到数据,即接收寄存器是0.
不仿真的时候,可以正常发送数据,可以接收到数据,但是接收到的数据不正确。
是怎么回事?
多谢! ...
hlhfootbal 发表于 2012-3-1 23:35


不要老想着仿真,特别是所谓的单步仿真,ICD方式不适合单步仿真。

使用特权

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

本版积分规则

133

主题

417

帖子

1

粉丝