PIC24FJ64GA002 UART RX 问题

[复制链接]
 楼主| hlhfootbal 发表于 2012-2-25 13:43 | 显示全部楼层 |阅读模式
我用PICkit 2 DEBUG,发现U2RXREG始终是0.但是用示波器观察电脑发送的数据已经到接收脚,PIN18脚。
然后就是进不了中断,程序等在while(!DataAvailable);这里了。
请帮忙看看是哪里出了问题,谢谢!


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

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


  6. void cUART2(void);
  7. void UART2INT(void);
  8. void configUART2(void);


  9. unsigned char DataAvailable;
  10. unsigned char Txdata[]= "hello";
  11. unsigned char Rxdata[10];
  12. void __attribute__ ((interrupt,no_auto_psv)) _U2TXInterrupt(void)
  13. {
  14. static unsigned char i=0;
  15. IFS1bits.U2TXIF = 0;//clear flag
  16. if(Txdata[i]!='\0')
  17. {
  18. while(U2STAbits.UTXBF);
  19. U2TXREG = Txdata[i++];
  20. }
  21. else
  22. {
  23. while(!U2STAbits.TRMT);
  24. //DisableIntU2TX;
  25. IEC1bits.U2TXIE = 0;
  26. }
  27. }

  28. void __attribute__ ((interrupt,no_auto_psv)) _U2RXInterrupt(void)
  29. {
  30. static unsigned char j=0;//why set to static?
  31. IFS1bits.U2RXIF = 0;
  32. if(U2STAbits.OERR)
  33. {U2STAbits.OERR = 0;}
  34. while(!U2STAbits.URXDA);
  35. Rxdata[j++] = U2RXREG;
  36. DataAvailable=1;
  37. }

  38. void uart(void)
  39. {
  40. asm volatile (
  41. "MOV #OSCCON, W1 \n"
  42. "MOV #0X46, W2 \n"
  43. "MOV #0X57,W3 \n"
  44. "MOV.b W2, [W1] \n"
  45. "MOV.B W3, [W1] \n"
  46. "BCLR OSCCON,#6"
  47. );

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

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

  52. asm volatile (
  53. "MOV #OSCCON, W1 \n"
  54. "MOV #0X46, W2 \n"
  55. "MOV #0X57,W3 \n"
  56. "MOV.b W2, [W1] \n"
  57. "MOV.B W3, [W1] \n"
  58. "BSET OSCCON,#6"
  59. );
  60. //Close UART2
  61. cUART2();

  62. /*Enable UART intruupts*/
  63. UART2INT();

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

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

  72. void main(void)
  73. {

  74. OSCCONbits.COSC=0;
  75. CLKDIV=0;

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


  78. uart();
  79. if(Rxdata[0]== 1)
  80. LATBbits.LATB15 = 1;
  81. else
  82. LATBbits.LATB15 = 0;
  83. // while(1)
  84. //{;}
  85. }

  86. void cUART2(void)
  87. {
  88. U2MODEbits.UARTEN = 0;
  89. IEC1bits.U2TXIE = 0;
  90. IEC1bits.U2RXIE = 0;
  91. IFS1bits.U2TXIF = 0;
  92. IFS1bits.U2RXIF = 0;
  93. }

  94. void UART2INT(void)
  95. {
  96. IEC1bits.U2TXIE = 1;
  97. IEC1bits.U2RXIE = 1;
  98. IPC7bits.U2TXIP = 1;
  99. IPC7bits.U2RXIP = 2;
  100. }

  101. void configUART2(void)
  102. {
  103. U2MODEbits.UARTEN = 1;
  104. //U2STAbits.UTXEN = 1;
  105. U2STAbits.URXISEL = 0;
  106. U2BRG = 25;
  107. }
yewuyi 发表于 2012-2-25 16:19 | 显示全部楼层
一共也没几行代码,自己也搞不定吗?

根本不需要带什么KIT2,直接软件仿真看就可以了。
 楼主| hlhfootbal 发表于 2012-2-25 22:45 | 显示全部楼层
LS,问题是发现U2RXREG始终是0.但是用示波器观察电脑发送的数据已经到接收脚。
我不清楚是哪里出问题了。
wwhh 发表于 2012-2-26 14:49 | 显示全部楼层
我没用过 PIC24FJ64GA002,可以提醒的一点是:与模拟端口共用的管脚在上电时默认为模拟输入功能,如需使用数字功能,要禁止该管脚的模拟功能
Ryanhsiung 发表于 2012-2-26 21:24 | 显示全部楼层
具体还是看DATASHEET,慢慢对一下寄存器
1、中断没开
2、UART寄存器没有设置对
3、UART这个模块有没有使能(有些单片机为了降低功耗,会增加模块能使)
4、IO口设置没对
5、。。。等等
yewuyi 发表于 2012-2-27 08:34 | 显示全部楼层
LS,问题是发现U2RXREG始终是0.但是用示波器观察电脑发送的数据已经到接收脚。
我不清楚是哪里出问题了。
hlhfootbal 发表于 2012-2-25 22:45


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

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

你首先要检查中断的各项设置对不对,检查中断有没有打开,检查IO口设置对不对。。。
这些检查自己完成,可不要依靠别人来帮你完成这个。
其次在接受中断中加一行LED灯闪烁代码,用它可以看到是否进入了中断。
 楼主| hlhfootbal 发表于 2012-3-1 23:35 | 显示全部楼层
现在是这样的情况。
单步仿真的时候,不可以发送数据,也接收不到数据,即接收寄存器是0.
不仿真的时候,可以正常发送数据,可以接收到数据,但是接收到的数据不正确。
是怎么回事?
多谢!
yewuyi 发表于 2012-3-2 08:40 | 显示全部楼层
现在是这样的情况。
单步仿真的时候,不可以发送数据,也接收不到数据,即接收寄存器是0.
不仿真的时候,可以正常发送数据,可以接收到数据,但是接收到的数据不正确。
是怎么回事?
多谢! ...
hlhfootbal 发表于 2012-3-1 23:35


不要老想着仿真,特别是所谓的单步仿真,ICD方式不适合单步仿真。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

417

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

133

主题

417

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部