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
}
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弄得出错了。 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
surf_131 发表于 2012-8-8 19:07 static/image/common/back.gif
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
testbuf = U1RXREG;
我已看过手册了,读取rxreg跟清除中断标志没有关联。 /* 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 中的数据保持有效。
surf_131 发表于 2012-8-9 09:52 static/image/common/back.gif
/* This is UART1 receive ISR */
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
谢谢,但是我在线调试查看了,那个位并未置1,同时我用你的方法试了,还是没有用。。 这里我一般都是用GPS模块来提供输入,确保所有问题都来自自己的板子一侧,就容易检查调试了。 zhlwangying 发表于 2012-8-9 09:59 static/image/common/back.gif
谢谢,但是我在线调试查看了,那个位并未置1,同时我用你的方法试了,还是没有用。。 ...
恩.现在找到问题了没? 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
} zhlwangying 发表于 2012-8-9 11:16 static/image/common/back.gif
还没有得到解决呀。发送是正常的,但就就是收不到。我测过rx引脚都是有信号的。
void Uart_init()
{
恩。我现在也遇到这个问题。我是这样设置的。1.接受数据的中断函数不能太长,最好就几个标志变量,2.TX,RX 端口都设置为输入口。3.发送给单片机的字符不要超过2个。 sweet_136 发表于 2012-8-9 11:30 static/image/common/back.gif
恩。我现在也遇到这个问题。我是这样设置的。1.接受数据的中断函数不能太长,最好就几个标志变量,2.TX,R ...
我的代码在上面。你的修改方式我虽然有点不太认同,但是我还是试了一下tx改为输入,中断里面基本上没有东西呀。但是还是不行。我发送数据到pc机上是正常的,就是接收不到。RX端口我用示波器看了一下,是有发送数据的。 zhlwangying 发表于 2012-8-9 11:48 static/image/common/back.gif
我的代码在上面。你的修改方式我虽然有点不太认同,但是我还是试了一下tx改为输入,中断里面基本上没有东 ...
恩,现在怎么样了?搞出来了没?搞出来了告诉我哦。 现在使用环回模式控制,能够收到数据,但是使用外部输入数据引脚还是没有办法收到数据。。。 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中断()
{
关闭串口中断
延时
发送接收到的数据。
打开串口中断
}
你试试,希望你成功。 自环能收到?是物理环吧?就是RX&TX连到一起的。
如果是,但是外部不行,那很可能就是把RX跟对端RX连接,TX跟对端TX连接,相当书房的书呆子初级错误。呵呵 surf_131 发表于 2012-8-9 16:33 static/image/common/back.gif
自环能收到?是物理环吧?就是RX&TX连到一起的。
如果是,但是外部不行,那很可能就是把RX跟对端RX连接,TX ...
那个是单片机内部可以配置连接在一起。外部连接是将TX与RX端口连接在一起。 软件设置的自环是逻辑环,不涉及接口的物理特性。物理上直接环回来也可以在逻辑环正常后测试一下。
问题终于解决了,PIC手册太坑人了。port被外设使用,还的配置AD里面的一个寄存器。希望各位朋友多多注意这个问题。感谢各位的热情解答。。
AD1PCFG 需要配置与ad复用的引脚做模拟输入还是数字输入(这个问题在手册上跟本提半个字)。 在端口设置那一章说明了这个,PIC24F系列手册之端口 先关注! 得做端口映射,RX引脚分配给RPX
页:
[1]