搜索
bottom↓
回复: 20

PIC24f Uart 接收不到数据。

[复制链接]

出0入0汤圆

发表于 2012-8-8 17:36:34 | 显示全部楼层 |阅读模式
请教各位前辈:我的问题是样的,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; // clear  u1rx interrupt flag and return from isr       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 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; // clear  u1rx interrupt flag and return from isr      
}

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

出0入0汤圆

 楼主| 发表于 2012-8-9 09:36:03 | 显示全部楼层
surf_131 发表于 2012-8-8 19:07
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

出0入0汤圆

 楼主| 发表于 2012-8-9 09:42:34 | 显示全部楼层
surf_131 发表于 2012-8-8 19:07
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
        testbuf = U1RXREG;

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

出0入0汤圆

发表于 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 中的数据保持有效。


出0入0汤圆

 楼主| 发表于 2012-8-9 09:59:53 | 显示全部楼层
surf_131 发表于 2012-8-9 09:52
/* This is UART1 receive ISR */
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{

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

出0入0汤圆

发表于 2012-8-9 11:00:45 | 显示全部楼层
这里我一般都是用GPS模块来提供输入,确保所有问题都来自自己的板子一侧,就容易检查调试了。

出0入0汤圆

发表于 2012-8-9 11:05:37 | 显示全部楼层
zhlwangying 发表于 2012-8-9 09:59
谢谢,但是我在线调试查看了,那个位并未置1,同时我用你的方法试了,还是没有用。。 ...

恩.现在找到问题了没?

出0入0汤圆

 楼主| 发表于 2012-8-9 11:16:22 | 显示全部楼层
sweet_136 发表于 2012-8-9 11:05
恩.现在找到问题了没?

还没有得到解决呀。发送是正常的,但就就是收不到。我测过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; // clear  u1rx interrupt flag and return from isr
               
}

出0入0汤圆

发表于 2012-8-9 11:30:08 | 显示全部楼层
zhlwangying 发表于 2012-8-9 11:16
还没有得到解决呀。发送是正常的,但就就是收不到。我测过rx引脚都是有信号的。
void Uart_init()
{

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

出0入0汤圆

 楼主| 发表于 2012-8-9 11:48:12 | 显示全部楼层
sweet_136 发表于 2012-8-9 11:30
恩。我现在也遇到这个问题。我是这样设置的。1.接受数据的中断函数不能太长,最好就几个标志变量,2.TX,R ...

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

出0入0汤圆

发表于 2012-8-9 13:44:39 | 显示全部楼层
zhlwangying 发表于 2012-8-9 11:48
我的代码在上面。你的修改方式我虽然有点不太认同,但是我还是试了一下tx改为输入,中断里面基本上没有东 ...

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

出0入0汤圆

 楼主| 发表于 2012-8-9 14:58:01 | 显示全部楼层
现在使用环回模式控制,能够收到数据,但是使用外部输入数据引脚还是没有办法收到数据。。。

出0入0汤圆

发表于 2012-8-9 16:24:58 | 显示全部楼层
zhlwangying 发表于 2012-8-9 14:58
现在使用环回模式控制,能够收到数据,但是使用外部输入数据引脚还是没有办法收到数据。。。 ...

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

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


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

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


你试试,希望你成功。

出0入0汤圆

发表于 2012-8-9 16:33:24 | 显示全部楼层
自环能收到?是物理环吧?就是RX&TX连到一起的。
如果是,但是外部不行,那很可能就是把RX跟对端RX连接,TX跟对端TX连接,相当书房的书呆子初级错误。呵呵

出0入0汤圆

 楼主| 发表于 2012-8-9 17:19:54 | 显示全部楼层
surf_131 发表于 2012-8-9 16:33
自环能收到?是物理环吧?就是RX&TX连到一起的。
如果是,但是外部不行,那很可能就是把RX跟对端RX连接,TX ...

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

出0入0汤圆

发表于 2012-8-9 22:49:42 | 显示全部楼层
软件设置的自环是逻辑环,不涉及接口的物理特性。物理上直接环回来也可以在逻辑环正常后测试一下。

出0入0汤圆

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

出0入0汤圆

发表于 2013-11-8 15:20:59 | 显示全部楼层
在端口设置那一章说明了这个,PIC24F系列手册之端口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入101汤圆

发表于 2014-11-23 16:52:48 | 显示全部楼层
先关注!

出0入0汤圆

发表于 2014-12-10 22:09:58 | 显示全部楼层
得做端口映射,RX引脚分配给RPX
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 15:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表