搜索
bottom↓
回复: 31

用MCP2515做CAN通讯,系统开始能正常发送接收数据,过了个半小时后居然接收不了数据,示波

[复制链接]

出0入0汤圆

发表于 2010-8-28 19:31:46 | 显示全部楼层 |阅读模式
用MCP2515做CAN通讯,系统开始能正常发送接收数据,过了个半小时后居然接收不了数据,示波器查看其发送与接收脚都有数据波形,但就是其中断脚一直是高电平,不产生中断,请问这是为何?

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-8-30 19:38:30 | 显示全部楼层
真遗憾啊,怎么没人来帮忙啊;搞了好多天了;

出0入0汤圆

 楼主| 发表于 2010-8-30 20:28:20 | 显示全部楼层
中断脚有时是一直高,有时是一直的低电平,很奇怪啊;

出0入0汤圆

发表于 2010-8-30 21:01:04 | 显示全部楼层
还是你程序问题呀,比如你发送成功有没有中断?接收到数据有没有中断?你是否真的清除了这些中断?
最后把你程序写一下流程,才好判断问题

出0入0汤圆

 楼主| 发表于 2010-8-31 19:39:07 | 显示全部楼层
linghu2 令狐二中  谢谢您;
  是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除中断的;
我的接收程序如下:

        Intf_temp = mcp2515_read_register( CANINTF);                //读取mcp2515中断标志位
        Intf_temp = (Intf_temp & ((1<<RX1IF) |(1<<RX0IF)));  //取出CANINTF中的RX1IF,RX0IF判断是否有缓冲器满
       if((Intf_temp&(1<<RX0IF)) == (1<<RX0IF))                //判断是否为RX0中断
         {
                  mcp2515_read_register_p( RXB0SIDH , ID_temp , 4);   //读取4个字节的ID信息  接收缓冲器0标识符                                          
                        length = mcp2515_read_register( RXB0DLC );////读取数据字节长度
                       
                        mcp2515_read_register_p( RXB0D0 , data ,length);  //读取数据
                       
                        mcp2515_bit_modify( CANINTF, (1<<RX0IF), 0 );//接收完毕清中断               
          }
我的发送程序如下:
temp[0] =AIM_ID;//1
temp[1] =B_CANTXnext_frame|(1<<EXIDE);
temp[2] =OWN_ID;//1
temp[3] =C_CANTX_frame;
mcp2515_bit_modify( TXB0CTRL, (1<<TXREQ)|(1<<TXP1)|(1<<TXP0), ~(1<<TXREQ)|(1<<TXP1)|(1<<TXP0) );//添加报文发送前(TXREQ)先置0
mcp2515_write_register_p( TXB0SIDH, temp, 4 );
mcp2515_write_register( TXB0DLC, lengthf );                        // 设定报文的数据字节数
mcp2515_write_register_p( TXB0D0, data, lengthf );// TXB0D0 数据发送寄存器0
        CAN2515_CSON;
        SPI_ReadWirte(SPI_RTS | 0x01);//0x01发送缓冲器为TXB0   启动发送  相当与TXREQ置1
        CAN2515_CSOFF;

出0入0汤圆

 楼主| 发表于 2010-8-31 21:00:18 | 显示全部楼层
用仿真器看时,他没死还在主程序中跑,但这时,MCP2515的中断脚已经是低电平了;这时通讯就接收不了数据;

出0入0汤圆

发表于 2010-8-31 21:01:58 | 显示全部楼层
总线关闭,是你两个节点波特率有误差或者通讯情况太差,导致错误寄存器溢出,产生总线关闭。

出0入0汤圆

 楼主| 发表于 2010-9-3 20:25:21 | 显示全部楼层
lnskngdc 你好,我的两个节点波特率是NBR=1/8TQ=1/(8*8)*1000K=15.625kbps都是一样的;请问如何来查这种错误寄存器的溢出呢?如何来处理?谢谢;
我发送时是这样的:
status0 = mcp2515_read_register(TXB0CTRL);//先读出状态;
if ((status0&(1<<TXREQ))==0)       //缓冲区0空
                  {
                  can_send_messageframeDAT(CANTX_Adata+i*8, CANlength_TX
                  }
else //老是会到这里
                 {
if ((status0&0x30)!=0)
mcp2515_bit_modify( TXB0CTRL, (1<<TXREQ), ~(1<<TXREQ) );
mcp2515_bit_modify( CANCTRL, (1<<ABAT), (1<<ABAT) );//中止发送       
              }

出0入0汤圆

 楼主| 发表于 2010-9-6 09:51:05 | 显示全部楼层
lnskngdc 你好,我的两个节点波特率是NBR=1/8TQ=1/(8*8)*1000K=15.625kbps都是一样的;请问如何来查这种错误寄存器的溢出呢?如何来处理?谢谢;
我发送时是这样的:
status0 = mcp2515_read_register(TXB0CTRL);//先读出状态;
if ((status0&(1<<TXREQ))==0)       //缓冲区0空
  {
  can_send_messageframeDAT(CANTX_Adata+i*8, CANlength_TX
  }
else //老是会到这里
{
if ((status0&0x30)!=0)
mcp2515_bit_modify( TXB0CTRL, (1<<TXREQ), ~(1<<TXREQ) );
mcp2515_bit_modify( CANCTRL, (1<<ABAT), (1<<ABAT) );//中止发送
              }

出0入0汤圆

 楼主| 发表于 2010-9-6 09:52:32 | 显示全部楼层
lnskngdc兄 你好麻烦你帮我看看是否上边程序有问题?

出0入0汤圆

 楼主| 发表于 2010-9-6 13:09:40 | 显示全部楼层
d

出0入0汤圆

发表于 2010-9-6 16:14:46 | 显示全部楼层
查看12节 说明 如果使用自动连续地址读取数据 不需要手动清除中断 会自动清除中断。我用Linux也是忽略这点 导致丢失数据。
可以连续读取ID和数据的 不需要一次一次读取寄存器。

出0入0汤圆

 楼主| 发表于 2010-9-7 08:48:35 | 显示全部楼层
谢谢,zm2002我试试看;

出0入0汤圆

 楼主| 发表于 2010-9-7 08:57:37 | 显示全部楼层
zm2002 请问下怎样的才是自动连续地址读取数据呢?

出0入0汤圆

 楼主| 发表于 2010-9-7 11:59:41 | 显示全部楼层
zm2002有在么这个不明白请问“可以连续读取ID和数据的 不需要一次一次读取寄存器”是指哪个寄存器?

出0入0汤圆

 楼主| 发表于 2010-9-7 15:31:53 | 显示全部楼层
dd

出0入0汤圆

发表于 2011-1-6 15:59:41 | 显示全部楼层
你好avr2007051316
我的问题和你基本相同,我的开发板是atmel 9260,问题出现的情况和你基本雷同,不知你解决了没有,如果解决了可以把你的解决方法给我说下么,谢谢......
我的email: zhu234223@126.com

再次向你表示谢意!

出0入0汤圆

发表于 2011-1-9 10:41:45 | 显示全部楼层
回复【16楼】zhu234223
-----------------------------------------------------------------------

我也遇到差不多相同的问题,在linux下,2515只负责接收,但接收几分钟后就不能接收了,手工让int输出脚变成低电平一下,有能继续接收,开始怀疑是2515的问题,换了一个后还是这样,哎,问题太奇怪了。

出0入0汤圆

发表于 2011-1-21 09:09:05 | 显示全部楼层
回复【楼主位】avr2007051316
-----------------------------------------------------------------------

请问楼主:可否分享下你的spi通讯部分的代码?我也在调试mcp2515我的SPI通讯有问题。

出0入17汤圆

发表于 2011-6-14 21:34:38 | 显示全部楼层
回复【4楼】avr2007051316
-----------------------------------------------------------------------

虽然CAN是全双工,但并不代表CAN控制器芯片是全双工。请注意SPI收发的互斥。因为发送的时候,有可能接收中断来了,导致数据错误。

出0入0汤圆

发表于 2012-2-16 10:01:14 | 显示全部楼层
回复【19楼】think_a_second  
回复【4楼】avr2007051316
-----------------------------------------------------------------------
虽然can是全双工,但并不代表can控制器芯片是全双工。请注意spi收发的互斥。因为发送的时候,有可能接收中断来了,导致数据错误。
-----------------------------------------------------------------------

说得很对,MCP2515的一次命令操作是一个原子操作,操作时必须屏蔽其他中断。

出0入0汤圆

 楼主| 发表于 2012-2-21 13:25:58 | 显示全部楼层
谢谢各位,本人因辞职后项目没做完也就一直停留在这里;
对zhu234223说声对不起,我现在才看到我这个帖子,这个问题目前我也不知道我那个接手的人有没处理;

出0入0汤圆

发表于 2012-2-21 13:55:23 | 显示全部楼层
看看我的淘宝上有这个小板。方便调试。

出0入0汤圆

发表于 2012-2-21 14:07:09 | 显示全部楼层
回复【21楼】avr2007051316
谢谢各位,本人因辞职后项目没做完也就一直停留在这里;
对zhu234223说声对不起,我现在才看到我这个帖子,这个问题目前我也不知道我那个接手的人有没处理;
-----------------------------------------------------------------------

做程序的都怕接收上一个未完成的东西,,,


偶宁可重写

出0入0汤圆

发表于 2012-5-3 13:52:38 | 显示全部楼层
很好很强大很强大

出0入0汤圆

发表于 2019-4-18 10:56:50 | 显示全部楼层
avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中  谢谢您;
  是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...

你好,这段程序  
/*我的发送程序如下:
temp[0] =AIM_ID;//1
temp[1] =B_CANTXnext_frame|(1<<EXIDE);
temp[2] =OWN_ID;//1
temp[3] =C_CANTX_frame;
mcp2515_bit_modify( TXB0CTRL, (1<<TXREQ)|(1<<TXP1)|(1<<TXP0), ~(1<<TXREQ)|(1<<TXP1)|(1<<TXP0) );//添加报文发送前(TXREQ)先置0
mcp2515_write_register_p( TXB0SIDH, temp, 4 );
mcp2515_write_register( TXB0DLC, lengthf );                        // 设定报文的数据字节数
mcp2515_write_register_p( TXB0D0, data, lengthf );// TXB0D0 数据发送寄存器0
        CAN2515_CSON;
        SPI_ReadWirte(SPI_RTS | 0x01);//0x01发送缓冲器为TXB0   启动发送  相当与TXREQ置1
        CAN2515_CSOFF;
*/
这里的 mcp2515_write_register_p( TXB0D0, data, lengthf );// TXB0D0 数据发送寄存器0 ;data是temp[3]吗,也就是数据内容,有相关函数的原型吗?
我也是这个芯片发送数据的,可是can分析仪没有收到啊,求协助,谢谢

出0入0汤圆

发表于 2019-4-18 11:01:17 | 显示全部楼层
avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中  谢谢您;
  是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...

你好,博主您的temp变量那4个元素分别是什么呀,注释的有些不明白,求解释,十分谢谢

出0入0汤圆

发表于 2019-4-18 17:22:59 | 显示全部楼层
dami 发表于 2012-2-21 13:55
看看我的淘宝上有这个小板。方便调试。

哪里啊,大侠,请告知下,我也很苦恼,can报文用这个芯片怎么发送和接收的呀,有完整的例子吗?谢谢

出0入0汤圆

发表于 2019-4-18 19:26:09 | 显示全部楼层
本帖最后由 铁马冰河 于 2019-4-18 19:33 编辑
avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中  谢谢您;
  是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...


你好,博主,我参考了下您的样子,可以收到啊,但是收到的ID对不上啊,再指导下嘛,非常谢谢

出0入0汤圆

发表于 2019-4-23 08:50:04 | 显示全部楼层
你好,这个接收数据是自动的呀,如果没有发送就没有接收的。我也是这个芯片

出0入0汤圆

发表于 2019-4-29 14:39:53 | 显示全部楼层
你好,楼主!解决了吗,你配置个寄存器啊低位的,我没用出现这个问题了。

出0入0汤圆

发表于 2019-5-17 17:00:41 | 显示全部楼层
本帖最后由 铁马冰河 于 2019-5-17 17:02 编辑

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

本版积分规则

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

GMT+8, 2024-4-24 09:56

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

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