[PIC®/AVR®/dsPIC®产品] PIC18F46K80 CAN环回自测试模式

[复制链接]
2098|1
 楼主| RW506575086 发表于 2017-11-1 16:38 | 显示全部楼层 |阅读模式
初次使用PIC单片机,学习CAN总线,从网上找到这个程序,仿真时程序会停止在 while( TXB0CONbits.TXREQ){;},一直未发送完成,使用的是内部时钟,哪位大神帮忙看看,感激不尽!



  1. #include <p18cxxx.h>
  2. /************************************************************/
  3. // CONFIG1L
  4. #pragma config RETEN = OFF      // VREG Sleep Enable bit (Ultra low-power regulator is Disabled (Controlled by REGSLP bit))
  5. #pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
  6. #pragma config SOSCSEL = HIGH   // SOSC Power Selection and mode Configuration bits (High Power SOSC circuit selected)
  7. #pragma config XINST = OFF      // Extended Instruction Set (Disabled)

  8. // CONFIG1H
  9. #pragma config FOSC = INTIO2    // Oscillator (Internal RC oscillator)
  10. #pragma config PLLCFG = OFF     // PLL x4 Enable bit (Disabled)
  11. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Disabled)
  12. #pragma config IESO = OFF       // Internal External Oscillator Switch Over Mode (Disabled)

  13. // CONFIG2L
  14. #pragma config PWRTEN = OFF     // Power Up Timer (Disabled)
  15. #pragma config BOREN = SBORDIS  // Brown Out Detect (Enabled in hardware, SBOREN disabled)
  16. #pragma config BORV = 3         // Brown-out Reset Voltage bits (1.8V)
  17. #pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)

  18. // CONFIG2H
  19. #pragma config WDTEN = SWDTDIS  // Watchdog Timer (WDT enabled in hardware; SWDTEN bit disabled)
  20. #pragma config WDTPS = 1048576  // Watchdog Postscaler (1:1048576)

  21. // CONFIG3H
  22. #pragma config CANMX = PORTB    // ECAN Mux bit (ECAN TX and RX pins are located on RB2 and RB3, respectively)
  23. #pragma config MSSPMSK = MSK7   // MSSP address masking (7 Bit address masking mode)
  24. #pragma config MCLRE = ON       // Master Clear Enable (MCLR Enabled, RE3 Disabled)

  25. // CONFIG4L
  26. #pragma config STVREN = ON      // Stack Overflow Reset (Enabled)
  27. #pragma config BBSIZ = BB2K     // Boot Block Size (2K word Boot Block size)

  28. // CONFIG5L
  29. #pragma config CP0 = OFF        // Code Protect 00800-03FFF (Disabled)
  30. #pragma config CP1 = OFF        // Code Protect 04000-07FFF (Disabled)
  31. #pragma config CP2 = OFF        // Code Protect 08000-0BFFF (Disabled)
  32. #pragma config CP3 = OFF        // Code Protect 0C000-0FFFF (Disabled)

  33. // CONFIG5H
  34. #pragma config CPB = OFF        // Code Protect Boot (Disabled)
  35. #pragma config CPD = OFF        // Data EE Read Protect (Disabled)

  36. // CONFIG6L
  37. #pragma config WRT0 = OFF       // Table Write Protect 00800-03FFF (Disabled)
  38. #pragma config WRT1 = OFF       // Table Write Protect 04000-07FFF (Disabled)
  39. #pragma config WRT2 = OFF       // Table Write Protect 08000-0BFFF (Disabled)
  40. #pragma config WRT3 = OFF       // Table Write Protect 0C000-0FFFF (Disabled)

  41. // CONFIG6H
  42. #pragma config WRTC = OFF       // Config. Write Protect (Disabled)
  43. #pragma config WRTB = OFF       // Table Write Protect Boot (Disabled)
  44. #pragma config WRTD = OFF       // Data EE Write Protect (Disabled)

  45. // CONFIG7L
  46. #pragma config EBTR0 = OFF      // Table Read Protect 00800-03FFF (Disabled)
  47. #pragma config EBTR1 = OFF      // Table Read Protect 04000-07FFF (Disabled)
  48. #pragma config EBTR2 = OFF      // Table Read Protect 08000-0BFFF (Disabled)
  49. #pragma config EBTR3 = OFF      // Table Read Protect 0C000-0FFFF (Disabled)

  50. // CONFIG7H
  51. #pragma config EBTRB = OFF      // Table Read Protect Boot (Disabled)
  52. /**************************************************************************8*/


  53. int CAN_FLAG;
  54. //unsigned int CAN_Delay_count=0;
  55. char CAN_Adress_H,CAN_Adress_L;
  56. void initcan()
  57. {
  58. TRISB=(TRISB|0X08)&0XeB; //设置CANRX/RB3为输入,CANTX/RB2为输出
  59. //设置CAN的波特率为250K,在Fosc=8M时,Tbit=8us,假设BRP=01h
  60. //则TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。
  61. //NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog _Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ
  62. CANCON=0X80; //请求进入CAN配置模式REQOP=100
  63. while(CANSTAT&0X80==0){;} //等待进入CAN配置模式OPMODE=100
  64. BRGCON1=0X01; //设置SJW和BRP,SJW=1TQ,BRP=01H
  65. BRGCON2=0X90; //设置Phase_Seg1=3TQ和Prog _Seg=1TQ
  66. BRGCON3=0X42; //设置Phase_Seg2=3TQ
  67. //设置发送邮箱0标识符号和发送的数据
  68. TXB0CON=0X03; //发送优先级为最高优先级,TXPRI=11
  69. TXB0SIDH=CAN_Adress_H; //设置发送缓冲器0的标准标识符,本程序采用标准识符
  70. TXB0SIDL=CAN_Adress_L&0XE0;
  71. TXB0DLC=0X08; //设置数据长度为8个字节
  72. TXB0D0=0X00; //写发送缓冲器数据区的数据
  73. TXB0D1=0X01;
  74. TXB0D2=0X02;
  75. TXB0D3=0X03;
  76. TXB0D4=0X04;
  77. TXB0D5=0X05;
  78. TXB0D6=0X06;
  79. TXB0D7=0X07;
  80. //设置接收邮箱0的标识符和初始化数据
  81. RXB0SIDH=CAN_Adress_H; //设置接收缓冲器0的标识符
  82. RXB0SIDL=CAN_Adress_L&0XE0;
  83. RXB0CON=0X20; //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0
  84. RXB0DLC=0X08; //设置接收缓冲器0的数据区长度
  85. RXB0D0=0X00; //初始化接收缓冲器0的数据区数据
  86. RXB0D1=0X00;
  87. RXB0D2=0X00;
  88. RXB0D3=0X00;
  89. RXB0D4=0X00;
  90. RXB0D5=0X00;
  91. RXB0D6=0X00;
  92. RXB0D7=0X00;
  93. //初始化接收滤波器0和接收屏蔽,
  94. RXF0SIDH=CAN_Adress_H;
  95. RXF0SIDL=CAN_Adress_L;
  96. RXM0SIDH=0XFF;
  97. RXM0SIDL=0XE0;

  98. //初始化CAN模块的I/O控制寄存器
  99. //CIOCON=0X00;
  100. //CIOCONbits.CLKSEL = 1;
  101. //使CAN进入某种工作模式模式
  102. CANCON=0X40; //=0X40,进入自测试模式;=0x00,正常操作模式
  103. //while(CANSTAT_0&0XE0!=0){;}
  104. while(CANSTAT&0X40==0){;}
  105. //初始化CAN的中断
  106. PIR5=0X00; //清所有中断标志
  107. PIE5=PIE5|0X01; //使能接收缓冲器0的接收中断
  108. IPR5=IPR5|0X01; //接收缓冲器0的接收中断为最高优先级
  109. ;
  110. }
  111. #pragma interrupt can_isr
  112. #pragma code high_ISR=0x08
  113. void high_ISR()
  114. {
  115. _asm
  116. goto can_isr
  117. _endasm
  118. }
  119. #pragma code
  120. void can_isr()
  121. {
  122.    CAN_FLAG=1;
  123. PIR5bits.RXB0IF=0;
  124. RXB0CONbits.RXFUL=0;
  125. }
  126. void delay()
  127. {
  128. int i,j;
  129. for(i=0;i<500;i++)
  130. for(j=0;j<100;j++)
  131. {;}
  132. }
  133. void main()
  134. {
  135.   CAN_Adress_H=0X33;
  136. CAN_Adress_L=0XE0;
  137. INTCON=0x00; //禁止所有中断
  138. CAN_FLAG=0;
  139. initcan();
  140. RCONbits.IPEN=1;
  141. WDTCON=0; //=1,看门狗使能;=0,禁止看门狗
  142. INTCON=INTCON|0xc0; //使能中断
  143. while(1)
  144. {
  145.     if(CAN_FLAG==1)
  146. {
  147. CAN_FLAG=0; //清接收到标志
  148.   TXB0CONbits.TXREQ=0; //禁止发送
  149. TXB0D0=RXB0D0+1; //用接收数据加1来更新发送数据
  150. TXB0D1=RXB0D1+1;
  151. TXB0D2=RXB0D2+1;
  152. TXB0D3=RXB0D3+1;
  153. TXB0D4=RXB0D4+1;
  154. TXB0D5=RXB0D5+1;
  155. TXB0D6=RXB0D6+1;
  156. TXB0D7=RXB0D7+1;
  157. }
  158. else
  159. {
  160. TXB0CON=TXB0CON|0X08;
  161. while( TXB0CONbits.TXREQ){;} //等待发送完成
  162. // while(!TXB0IF) {;}
  163. //PORTB&=0xEF;
  164. }
  165. }
  166. }
duan050790 发表于 2017-11-3 13:32 | 显示全部楼层
我做的回环测试的时候,设置loop位和分频,在主循环发送,就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

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