avr2007051316 发表于 2010-8-28 19:31:46

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

用MCP2515做CAN通讯,系统开始能正常发送接收数据,过了个半小时后居然接收不了数据,示波器查看其发送与接收脚都有数据波形,但就是其中断脚一直是高电平,不产生中断,请问这是为何?

avr2007051316 发表于 2010-8-30 19:38:30

真遗憾啊,怎么没人来帮忙啊;搞了好多天了;

avr2007051316 发表于 2010-8-30 20:28:20

中断脚有时是一直高,有时是一直的低电平,很奇怪啊;

linghu2 发表于 2010-8-30 21:01:04

还是你程序问题呀,比如你发送成功有没有中断?接收到数据有没有中断?你是否真的清除了这些中断?
最后把你程序写一下流程,才好判断问题

avr2007051316 发表于 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 =AIM_ID;//1
temp =B_CANTXnext_frame|(1<<EXIDE);
temp =OWN_ID;//1
temp =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;

avr2007051316 发表于 2010-8-31 21:00:18

用仿真器看时,他没死还在主程序中跑,但这时,MCP2515的中断脚已经是低电平了;这时通讯就接收不了数据;

lnskngdc 发表于 2010-8-31 21:01:58

总线关闭,是你两个节点波特率有误差或者通讯情况太差,导致错误寄存器溢出,产生总线关闭。

avr2007051316 发表于 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) );//中止发送       
            }

avr2007051316 发表于 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) );//中止发送
            }

avr2007051316 发表于 2010-9-6 09:52:32

lnskngdc兄 你好麻烦你帮我看看是否上边程序有问题?

avr2007051316 发表于 2010-9-6 13:09:40

d

zm2002 发表于 2010-9-6 16:14:46

查看12节 说明 如果使用自动连续地址读取数据 不需要手动清除中断 会自动清除中断。我用Linux也是忽略这点 导致丢失数据。
可以连续读取ID和数据的 不需要一次一次读取寄存器。

avr2007051316 发表于 2010-9-7 08:48:35

谢谢,zm2002我试试看;

avr2007051316 发表于 2010-9-7 08:57:37

zm2002 请问下怎样的才是自动连续地址读取数据呢?

avr2007051316 发表于 2010-9-7 11:59:41

zm2002有在么这个不明白请问“可以连续读取ID和数据的 不需要一次一次读取寄存器”是指哪个寄存器?

avr2007051316 发表于 2010-9-7 15:31:53

dd

zhu234223 发表于 2011-1-6 15:59:41

你好avr2007051316
我的问题和你基本相同,我的开发板是atmel 9260,问题出现的情况和你基本雷同,不知你解决了没有,如果解决了可以把你的解决方法给我说下么,谢谢......
我的email: zhu234223@126.com

再次向你表示谢意!

flyeag 发表于 2011-1-9 10:41:45

回复【16楼】zhu234223
-----------------------------------------------------------------------

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

mml0318 发表于 2011-1-21 09:09:05

回复【楼主位】avr2007051316
-----------------------------------------------------------------------

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

think_a_second 发表于 2011-6-14 21:34:38

回复【4楼】avr2007051316
-----------------------------------------------------------------------

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

pilgrim_kevin 发表于 2012-2-16 10:01:14

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

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

avr2007051316 发表于 2012-2-21 13:25:58

谢谢各位,本人因辞职后项目没做完也就一直停留在这里;
对zhu234223说声对不起,我现在才看到我这个帖子,这个问题目前我也不知道我那个接手的人有没处理;

dami 发表于 2012-2-21 13:55:23

看看我的淘宝上有这个小板。方便调试。

zaixian 发表于 2012-2-21 14:07:09

回复【21楼】avr2007051316
谢谢各位,本人因辞职后项目没做完也就一直停留在这里;
对zhu234223说声对不起,我现在才看到我这个帖子,这个问题目前我也不知道我那个接手的人有没处理;
-----------------------------------------------------------------------

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


偶宁可重写

taotao34123 发表于 2012-5-3 13:52:38

很好很强大很强大

铁马冰河 发表于 2019-4-18 10:56:50

avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中谢谢您;
是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...

你好,这段程序
/*我的发送程序如下:
temp =AIM_ID;//1
temp =B_CANTXnext_frame|(1<<EXIDE);
temp =OWN_ID;//1
temp =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吗,也就是数据内容,有相关函数的原型吗?
我也是这个芯片发送数据的,可是can分析仪没有收到啊,求协助,谢谢

铁马冰河 发表于 2019-4-18 11:01:17

avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中谢谢您;
是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...

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

铁马冰河 发表于 2019-4-18 17:22:59

dami 发表于 2012-2-21 13:55
看看我的淘宝上有这个小板。方便调试。

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

铁马冰河 发表于 2019-4-18 19:26:09

本帖最后由 铁马冰河 于 2019-4-18 19:33 编辑

avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中谢谢您;
是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...

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

铁马冰河 发表于 2019-4-23 08:50:04

你好,这个接收数据是自动的呀,如果没有发送就没有接收的。我也是这个芯片

铁马冰河 发表于 2019-4-29 14:39:53

你好,楼主!解决了吗,你配置个寄存器啊低位的,我没用出现这个问题了。

铁马冰河 发表于 2019-5-17 17:00:41

本帖最后由 铁马冰河 于 2019-5-17 17:02 编辑

你好,我发现我的程序怎么只可以发送一次,马上只可以接收1次数据呢?然后就中断了因为后面还有数据它溢出了,怎么接收到所有的数据呢?各位大佬帮帮忙啊
页: [1]
查看完整版本: 用MCP2515做CAN通讯,系统开始能正常发送接收数据,过了个半小时后居然接收不了数据,示波