搜索
bottom↓
回复: 30

简单的CAN发送程序为何总显示错误呢?

[复制链接]

出0入399汤圆

发表于 2013-10-23 09:52:09 | 显示全部楼层 |阅读模式
  1. void CAN_init()
  2. {
  3.         TRISB=0xD7;
  4.         CANCON=0x80;//请求配置模式
  5.         while(CANSTAT&0x80==0);//不是配置模式继续等待
  6.         ECANCON=0x00;//传统模式
  7.        
  8.         BRGCON1=0x03;//波特率预分频-1MHZ,同步跳转宽度时间1TQ,波特率125K
  9.         BRGCON2=0x90;//相位缓冲段1时间3TQ,传播时间1TQ
  10.         BRGCON3=0x42;//使能总线唤醒功能,使用滤波器唤醒,相位缓冲段2时间3TQ
  11.         //总共8个TQ,8*1us=标称位时间8us--125K
  12.        
  13.         CIOCON=0x20;//隐性时CANTX--VDD,禁止捕捉
  14.        
  15.         //设置发送邮箱 0 标识符号和发送的数据
  16.     TXB0CON=0x03;           //发送0最高优先级
  17.     TXB0SIDH=0x06;           //设置邮箱ID号  ID号为0x34
  18.     TXB0SIDL=0x80;           
  19.     TXB0DLC=0x08;            //设置发送数据长度--8字节
  20.     TXB0D0=0x00;             //初始化发送数据
  21.     TXB0D1=0x00;
  22.     TXB0D2=0x00;
  23.     TXB0D3=0x00;
  24.     TXB0D4=0x00;
  25.     TXB0D5=0x00;
  26.     TXB0D6=0x00;
  27.     TXB0D7=0x00;
  28.    
  29.     //设置接收邮箱 0 标识符和初始化数据
  30.     RXB0SIDH=0x06;             //设置接收邮箱ID号   ID号为0x31
  31.     RXB0SIDL=0x20;
  32.     RXB0CON=0x20;              //仅仅接收带有标准标识符的有效报文,FILHIT0=0表示,RXB0采用过滤器0
  33.     RXB0DLC=0x08;              //设置接收缓冲器0的数据区长度为8
  34.     RXB0D0=0x00;               //初始化接收缓冲器0的数据区数据
  35.     RXB0D1=0x00;
  36.     RXB0D2=0x00;
  37.     RXB0D3=0x00;
  38.     RXB0D4=0x00;
  39.     RXB0D5=0x00;
  40.     RXB0D6=0x00;
  41.     RXB0D7=0x00;
  42.    
  43.     //初始化接收过滤器 0 和接收屏蔽器0
  44.     RXF0SIDH=0x06;
  45.     RXF0SIDL=0x20;
  46.     RXM0SIDH=0xFF;
  47.     RXM0SIDL=0xE0;
  48.    
  49.     CANCON=0x00;                 //进入正常模式
  50.     while((CANSTAT&0xE0)!=0);  //判断是否进入正常模式   
  51.     //初始化CAN中断
  52.      //PIR3=0x00;                 //清除所有中断标志
  53.      //PIE3=0x01;            //接收缓冲器0中断使能
  54.      //IPR3=0x01;            //接收缓冲器0中断为最高优先级
  55. }
复制代码

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入399汤圆

 楼主| 发表于 2013-10-23 09:57:39 | 显示全部楼层
主程序中我就不断的发送:


但是上位机接受不到,波特率和IO都设置正确了。。可以实现自测试模式--就是datasheet中说的回环模式。也可以接受上位机发来的信息。。但是就是发送不行。。

实际程序死在那个while((TXB0CON&0x08)!=0)里面了。。我在这里把can的错误状态发到串口显示中发现COMSTAT的值为15,TXB0CON为1b,如题:

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-10-23 10:25:12 | 显示全部楼层
什么单片机啊,pic的可以参考官方例程 稍微修改下

出0入399汤圆

 楼主| 发表于 2013-10-23 10:31:35 | 显示全部楼层
dadongleilei 发表于 2013-10-23 10:25
什么单片机啊,pic的可以参考官方例程 稍微修改下

pic2585,这程序很简单啊-就一个初始化和while里面不断发送,您能看出有何错误么??

出0入0汤圆

发表于 2013-10-23 10:40:05 | 显示全部楼层
试试我们的CAN适配器
http://www.amobbs.com/thread-5550938-1-1.html

出0入0汤圆

发表于 2013-10-23 11:01:01 | 显示全部楼层
这个因为我没用过这个片子 所以也不太清楚你这个问题,不过你可以用2个相同的板子,一收一发,来试试,仔细看看寄存器的设置

出0入399汤圆

 楼主| 发表于 2013-10-23 11:20:38 | 显示全部楼层
dadongleilei 发表于 2013-10-23 11:01
这个因为我没用过这个片子 所以也不太清楚你这个问题,不过你可以用2个相同的板子,一收一发,来试试,仔细 ...

1,如果CAN一直在发送,但是没有设备接受会怎么样?

2,像我这样写入一次数据,之后在while就一直循环了,但是引脚上还有数据发送,是发送不成功在尝试不断发送么?

出0入399汤圆

 楼主| 发表于 2013-10-23 11:21:14 | 显示全部楼层
dadongleilei 发表于 2013-10-23 11:01
这个因为我没用过这个片子 所以也不太清楚你这个问题,不过你可以用2个相同的板子,一收一发,来试试,仔细 ...

http://www.amobbs.com/thread-5555794-1-1.html
这个关于这两个寄存器的区别您知道吧?

出0入399汤圆

 楼主| 发表于 2013-10-23 13:26:12 | 显示全部楼层
顶一下。。

出0入42汤圆

发表于 2013-10-23 09:52:10 | 显示全部楼层
只有发送端,没有接收端,就会发送不成功。

STM32可以使能错误重新发送功能,没有发送成功,就重复发送,就是不知道你用的MCU是不是也是这样的

出0入399汤圆

 楼主| 发表于 2013-10-23 22:11:19 | 显示全部楼层
my_avr 发表于 2013-10-23 13:35
只有发送端,没有接收端,就会发送不成功。

STM32可以使能错误重新发送功能,没有发送成功,就重复发送, ...

也是这样的,没发送成功就一直发,但是我接上了can卡了还是一样的错误。

出0入399汤圆

 楼主| 发表于 2013-10-24 09:47:42 来自手机 | 显示全部楼层
定以下,,,,,

出0入0汤圆

发表于 2013-10-24 10:39:00 | 显示全部楼层
同样在用CAN,可以交流一下

出0入399汤圆

 楼主| 发表于 2013-10-25 14:21:28 | 显示全部楼层
前天解决了。。是波特率的问题,不过我计算的没错,不知道为何不行、、、

出0入0汤圆

发表于 2013-10-30 14:17:22 | 显示全部楼层
lz .我回环模式可以正常自发自收的。
设为正常模式 就卡在这边了
  1.     TXB0CON = TXB0CON|0x08;    /*request to send*/
  2.             while(TXB0REQ)         /*wait until send over*/
  3.             {
  4.                  ;
  5.             }
复制代码
TXB0REG 不能清零,怎么回事?

出0入0汤圆

发表于 2013-10-30 14:27:00 | 显示全部楼层
lz 你波特率怎么解决的。和你问题一样!我波特率算的也没问题。数据都没发,怎么检测波特率的?

出0入399汤圆

 楼主| 发表于 2013-10-30 14:32:11 | 显示全部楼层
tragedy 发表于 2013-10-30 14:17
lz .我回环模式可以正常自发自收的。
设为正常模式 就卡在这边了TXB0REG 不能清零,怎么回事? ...

你在这个循环里把那几个状态寄存器发到上位机看看什么错误。。使用内部晶振试试。。

出0入0汤圆

发表于 2013-10-30 15:01:29 | 显示全部楼层
一直在那里等待了 ,TXB0REG 无法清零。
接收端接的是usbcan,用上位机给 pic发也显示发送错误。

loop模式下正常,能自发自收,但和上位机的没试!
  1.     while(1)
  2.     {

  3.         TXB0CON = TXB0CON|0x08;    /*request to send*/
  4.         while(TXB0REQ)         /*wait until send over*/
  5.         {
  6.                  ;
  7.          }
  8.             }
复制代码
波特率
/*------set baud rate--16MHZ--250K---*/
  1. //   BRGCON1 = 0b10000001;
  2. //   BRGCON2 = 0b10100100;
  3. //   BRGCON3 = 0b10000100;
  4.       BRGCON1 = 0x01 ;
  5.       BRGCON2 =  0xB8;
  6.       BRGCON3 =  0x05;
复制代码

出0入0汤圆

发表于 2013-10-30 15:03:29 | 显示全部楼层
用的是内部晶振。
  1. void interosc_init(void)
  2. {
  3.     /* Set the internal oscillator to 16MHz*/  
  4.       OSCCONbits.IRCF = 6;    /*4MHZ*/
  5.       OSCTUNEbits.PLLEN = 1;  /*(pll * 4)*/
  6. }
复制代码

出0入399汤圆

 楼主| 发表于 2013-10-30 17:13:43 | 显示全部楼层
tragedy 发表于 2013-10-30 15:03
用的是内部晶振。

你这样试一下:
BRGCON1=0x03;
BRGCON2=0x90;
BRGCON3=0x42;
内部8M,不开PLL,波特率125K,试下能通信么?

出0入0汤圆

发表于 2013-10-30 22:29:14 | 显示全部楼层
PIC内振精度不太高吧,曾经用PIC16F883,内振串口9600数据都会不正确.更别说你的125K了.

出0入399汤圆

 楼主| 发表于 2013-10-31 09:10:19 | 显示全部楼层
summarize 发表于 2013-10-30 22:29
PIC内振精度不太高吧,曾经用PIC16F883,内振串口9600数据都会不正确.更别说你的125K了. ...

我只是让他试试,他现在波特率设置的对不对还不知道。。实际上我也没用内部震荡器。

出0入0汤圆

发表于 2013-10-31 09:30:46 | 显示全部楼层
R88 发表于 2013-10-31 09:10
我只是让他试试,他现在波特率设置的对不对还不知道。。实际上我也没用内部震荡器。 ...

哎,刚刚改成外部晶振了。
回环模式下cantx引脚也是没有输出的,但是能收到数据。canstat发上来是 0x00,既然下面的能通过,canstat 就应该是 0x40呀。真是不解
  1.       CANCON = 0X40;    /*  */
  2.      while((CANSTAT & 0X40)!= 0) ; /* */
复制代码
usbcan是好的,用stm32的can试了。
大哥,给你q了,共同探讨下。ok不。

出0入0汤圆

发表于 2013-10-31 09:32:18 | 显示全部楼层
如果是回环的,就不用考虑波特率了吧。

出0入399汤圆

 楼主| 发表于 2013-10-31 09:39:14 | 显示全部楼层
tragedy 发表于 2013-10-31 09:32
如果是回环的,就不用考虑波特率了吧。

回环模式就是没有输出,内部缓冲区自发自收不再外部体现。。波特率不用考虑。你把程序改成和我的一模一样。其他先屏蔽掉。主程序也改成我这样一直发送试试看(发送时can卡要开着),,先用内部8M震荡不开PLL,看看是否是硬件或者其他问题,我这个试了可以发收的。。

出0入0汤圆

发表于 2013-10-31 09:55:17 | 显示全部楼层
额,该删的都删了。不用q么!版面拉的太长了!
stm32 回环模式引脚是有电平的,pic也一样才对。
期待您的回复~
  1. #include <pic18f2480.h>
  2. #include "CANConfig.h"
  3. #include <xc.h>

  4. // CONFIG1H
  5. #pragma config OSC =  IRCIO67           // Oscillator Selection bits (HS oscillator)
  6. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
  7. #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)



  8. #define uint unsigned int
  9. #define uchar unsigned char


  10. void interosc_init(void);
  11. void serial_init(void);
  12. void send_char(uchar *,uint);
  13. void can_init(void);
  14. void caninterupt_init(void);
  15. void can_receive(void);
  16. void can_send(void);
  17. void delay(uint);
  18. uchar can_rec[100] = {0};
  19. uchar serial_send[100] = {0x55,0xAA,0x33,0x22,0x52,0x53,0x54};

  20. uchar CAN_Adress_H,CAN_Adress_L;
  21. uint CAN_Delay_count = 0;
  22. void interosc_init(void)
  23. {
  24.     /* Set the internal oscillator to 8MHz*/

  25. #if 1
  26.       OSCCONbits.IRCF = 7;    /*8MHZ*/
  27. #endif
  28. }

  29. void delay(uint asd)
  30. {
  31.     uint i;
  32.     for(i=0;i<asd;i++)
  33.     {}
  34. }

  35. void can_init(void)
  36. {
  37.     CAN_Adress_H = 0x33;
  38.     CAN_Adress_L = 0xe0;
  39.     ECANCON = 0x00;
  40.     TRISB = (TRISB|0X08) & 0XFB;    /*CTX(RB2) output ,CRX(RB3) input*/
  41.     CANCON = 0X80;                /*turn to cinfig mode*/
  42.     while ((CANSTAT & 0xE0) != 0x80 ); //wait for config mode request



  43. /*-----内部8MHZ--125K----*/
  44.       BRGCON1=0x03;
  45.       BRGCON2=0x90;
  46.       BRGCON3=0x42;

  47. //  ******set the initial send value and the address*****  */
  48.     TXB0CON = 0X03;     /* high priority */
  49.     TXB0SIDL = CAN_Adress_L & 0xe0; /*   */
  50.     TXB0SIDH = CAN_Adress_H;
  51.     TXB0DLC = 0X08;
  52.     TXB0D0 = 0X00;
  53.     TXB0D1 = 0X01;
  54.     TXB0D2 = 0X02;
  55.     TXB0D3 = 0X03;
  56.     TXB0D4 = 0X04;
  57.     TXB0D5 = 0X05;
  58.     TXB0D6 = 0X06;
  59.     TXB0D7 = 0X07;



  60. // *******初始化接收滤波器0和接收屏蔽**************** */
  61.     RXF0SIDH = CAN_Adress_H;
  62.     RXF0SIDL= CAN_Adress_L;  // 本字节高3位为标识符低3位,低5位是配置 */
  63.     RXM0SIDH = 0Xff;
  64.     RXM0SIDL = 0Xe0;    // 11个1表示接收11位标识符进行滤波,标识符

  65. /*normal*/
  66. #if 1
  67.   CANCON &= 0x1F; //request normal mode
  68.    while ((CANSTAT & 0xE0) != 0x00 );//wait for normal mode
  69. #endif

  70. #if 0
  71. /*loop*/
  72.      CANCON = 0X40;
  73.      while((CANSTAT & 0X40)!= 0) ;
  74. #endif
  75. }
  76. void main(void)
  77. {
  78.     SWDTEN = 0;
  79.     interosc_init();
  80.     can_init();
  81.     while(1)
  82.     {
  83.         TXB0CON = TXB0CON|0x08;    /*request to send*/
  84.                 while(TXB0REQ) ;        /*wait until send over*/
  85.         delay(65535);
  86.     }
  87. }
复制代码

出0入399汤圆

 楼主| 发表于 2013-10-31 10:38:28 | 显示全部楼层
tragedy 发表于 2013-10-31 09:55
额,该删的都删了。不用q么!版面拉的太长了!
stm32 回环模式引脚是有电平的,pic也一样才对。
期待您的回 ...

你看数据手册啊,不能一个单片机一样另一个就一样了,下面写到TXCAN将恢复到端口IO。

公司不让上Q的。还有ID地址can卡和程序要设置对了。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-10-31 10:48:41 | 显示全部楼层
我就想确认下程序有没有问题。
你的中文版的资料能不能发一份呀。我只有英文版的,看的很累。tks!

出0入399汤圆

 楼主| 发表于 2013-10-31 12:23:21 | 显示全部楼层
官网,PIC18F66K80.有些手册都有中文版的。而且大多数手册内容都差不多。。

出0入0汤圆

发表于 2013-11-1 15:48:27 | 显示全部楼层
R88 发表于 2013-10-31 12:23
官网,PIC18F66K80.有些手册都有中文版的。而且大多数手册内容都差不多。。

问题居然出在线被接错了。
9针引脚,2脚对应CANL,7脚对应CANH。
不过量到的波形也不是太好

出0入0汤圆

发表于 2013-11-6 16:20:01 | 显示全部楼层
tragedy 发表于 2013-11-1 15:48
问题居然出在线被接错了。
9针引脚,2脚对应CANL,7脚对应CANH。
不过量到的波形也不是太好 ...

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

本版积分规则

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

GMT+8, 2024-6-3 05:33

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

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