用MCP2515做CAN通讯,系统开始能正常发送接收数据,过了个半小时后居然接收不了数据,示波
用MCP2515做CAN通讯,系统开始能正常发送接收数据,过了个半小时后居然接收不了数据,示波器查看其发送与接收脚都有数据波形,但就是其中断脚一直是高电平,不产生中断,请问这是为何? 真遗憾啊,怎么没人来帮忙啊;搞了好多天了; 中断脚有时是一直高,有时是一直的低电平,很奇怪啊; 还是你程序问题呀,比如你发送成功有没有中断?接收到数据有没有中断?你是否真的清除了这些中断?最后把你程序写一下流程,才好判断问题 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; 用仿真器看时,他没死还在主程序中跑,但这时,MCP2515的中断脚已经是低电平了;这时通讯就接收不了数据; 总线关闭,是你两个节点波特率有误差或者通讯情况太差,导致错误寄存器溢出,产生总线关闭。 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) );//中止发送
} 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) );//中止发送
} lnskngdc兄 你好麻烦你帮我看看是否上边程序有问题? d 查看12节 说明 如果使用自动连续地址读取数据 不需要手动清除中断 会自动清除中断。我用Linux也是忽略这点 导致丢失数据。
可以连续读取ID和数据的 不需要一次一次读取寄存器。 谢谢,zm2002我试试看; zm2002 请问下怎样的才是自动连续地址读取数据呢? zm2002有在么这个不明白请问“可以连续读取ID和数据的 不需要一次一次读取寄存器”是指哪个寄存器? dd 你好avr2007051316
我的问题和你基本相同,我的开发板是atmel 9260,问题出现的情况和你基本雷同,不知你解决了没有,如果解决了可以把你的解决方法给我说下么,谢谢......
我的email: zhu234223@126.com
再次向你表示谢意! 回复【16楼】zhu234223
-----------------------------------------------------------------------
我也遇到差不多相同的问题,在linux下,2515只负责接收,但接收几分钟后就不能接收了,手工让int输出脚变成低电平一下,有能继续接收,开始怀疑是2515的问题,换了一个后还是这样,哎,问题太奇怪了。 回复【楼主位】avr2007051316
-----------------------------------------------------------------------
请问楼主:可否分享下你的spi通讯部分的代码?我也在调试mcp2515我的SPI通讯有问题。 回复【4楼】avr2007051316
-----------------------------------------------------------------------
虽然CAN是全双工,但并不代表CAN控制器芯片是全双工。请注意SPI收发的互斥。因为发送的时候,有可能接收中断来了,导致数据错误。 回复【19楼】think_a_second
回复【4楼】avr2007051316
-----------------------------------------------------------------------
虽然can是全双工,但并不代表can控制器芯片是全双工。请注意spi收发的互斥。因为发送的时候,有可能接收中断来了,导致数据错误。
-----------------------------------------------------------------------
说得很对,MCP2515的一次命令操作是一个原子操作,操作时必须屏蔽其他中断。 谢谢各位,本人因辞职后项目没做完也就一直停留在这里;
对zhu234223说声对不起,我现在才看到我这个帖子,这个问题目前我也不知道我那个接手的人有没处理; 看看我的淘宝上有这个小板。方便调试。 回复【21楼】avr2007051316
谢谢各位,本人因辞职后项目没做完也就一直停留在这里;
对zhu234223说声对不起,我现在才看到我这个帖子,这个问题目前我也不知道我那个接手的人有没处理;
-----------------------------------------------------------------------
做程序的都怕接收上一个未完成的东西,,,
偶宁可重写 很好很强大很强大 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分析仪没有收到啊,求协助,谢谢
avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中谢谢您;
是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...
你好,博主您的temp变量那4个元素分别是什么呀,注释的有些不明白,求解释,十分谢谢 dami 发表于 2012-2-21 13:55
看看我的淘宝上有这个小板。方便调试。
哪里啊,大侠,请告知下,我也很苦恼,can报文用这个芯片怎么发送和接收的呀,有完整的例子吗?谢谢 本帖最后由 铁马冰河 于 2019-4-18 19:33 编辑
avr2007051316 发表于 2010-8-31 19:39
linghu2 令狐二中谢谢您;
是这样的,我发送不是用中断来发送的,接收是用中断,我接收完成时是有清除 ...
你好,博主,我参考了下您的样子,可以收到啊,但是收到的ID对不上啊,再指导下嘛,非常谢谢 你好,这个接收数据是自动的呀,如果没有发送就没有接收的。我也是这个芯片 你好,楼主!解决了吗,你配置个寄存器啊低位的,我没用出现这个问题了。 本帖最后由 铁马冰河 于 2019-5-17 17:02 编辑
你好,我发现我的程序怎么只可以发送一次,马上只可以接收1次数据呢?然后就中断了因为后面还有数据它溢出了,怎么接收到所有的数据呢?各位大佬帮帮忙啊
页:
[1]