当前位置:首页 >> 电子/电路 >>

MCP2515调试


1.注意复位是否成功

2. CAN悬空发送是查看示波器波形

3. 总线错误是波特率的问题

4 注意SPI的输出模式

5 两块板调试CAN通信

步骤1:(主要改波特率)

1) 设置波特率使2者一致。

2) SJA1000及MCP2515由自测模式改成正常模式。

3) MCP2515设置关闭屏蔽接收所有帧,RXB0CTRL.RXM。

CAN通讯成功。证明我的双机硬件连线都正确


步骤2:(主要改滤波)

在步骤1的基础上

1)修改MCP2515的RXB0CTRL.RXM,使其只接收符合滤波器条件的带有扩展标识符的有效报文。

2)修改屏蔽寄存都为0,对应的标识符位将被自动接收而不进行滤波。

CAN通讯成功。

步骤3:(主要改滤波)

在步骤2的基础上

1) 修改SJA1000的ID,改成ID1=1.即

unsigned char Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x0,0x11};地址20是0x11,就是设置ID1=1.

2) 修改MCP2515的ID,把滤波屏蔽全0改成全1,一定要接收ID与验收滤波一致才可通讯。SPIByteWrite(RXF0EID0,0x02);就是设置ID1=1.

CAN通讯成功。

步骤4:(主要修改ID)

在步骤3的基础上

1)修改SJA1000的ID,改成ID1=1.即

unsigned char Send_CAN_Info_ID[5]={0x88,0x00,0x40,0x0,0x11};地址20是0x11,就是设置ID19=1.

2)修改MCP2515的ID SPIByteWrite(RXF0SIDL,0x48);就是设置ID19=1. EXIDE要设置为1.

步骤5:(配合滤波修改ID)

在步骤4的基础上

1)修改MCP2515的ID SPIByteWrite(RXF0SIDL,0x68);就是设置ID19=1. EXIDE要设置为1.

由于ID通过滤波后是不同的,所以通讯应该失败。验证ok。

2)修改滤波,使其对ID19,ID20,ID21忽略,设置SPIByteWrite(RXM0SIDL,0x0F);

CAN双机通讯成功。打印时候显示接收的ID及数据,见最终效果图。



说明:ID一致才能接收。




第四部分

9,调试记录(这次调试主要是在自发自收代码中设置MOD和CMR的一些标志位)
1)
Write_SJA1000(REG_CAN_MOD,0x05); //自测。
Write_SJA1000(REG_CAN_CMR,0x010);//使能自发自收请求。
放在while循环外,已发送一次。

2)
Write_SJA1000(REG_CAN_MOD,0x01); //正常发送接收。
Write_SJA1000(REG_CAN_CMR,0x010);//自收发请求
放在while循环外,已发送一次。

ecc显示0xD9,自动重复发送,发送完毕一直是为完毕。状态为0x60

3)
Write_SJA1000(REG_CAN_MOD,0x05); //自测。
Write_SJA1000(REG_CAN_CMR,0x01);//正常发送请求
从状态来看显,示0xC,就是说数据已经正常发送出去了。但是没有响应接收中断。我把canl和canh相连也不报错。
后来用示波器查看,发现这样的设置信息根本没发送出去。

所以总结下:
1,希望单机硬件自测的话,CMR要设置为自收发,MOD要设置为自检测。
2,要实现正常的收发,至少需要2台CAN机在网络上。


第三部分

1.波特率计算

MCP2515的波特率是发送一帧的时间的倒数,

一帧时间由以下四部分构成

当要设定某一波特率时,可以使用波特率计算器,选择控制器晶振频率后计算即可,算出有很多结果,可任选一个使用配置即可。

2.报文发送

报文发送期间发生总线错误一般是波特率设定的问题,确认一下MCP2515的晶振是否选择正确。

3.hitech编译器 int类型占2个字节空间,不足以保存扩展帧ID(29位),得用long类型

5.MCP2515只支持SPI的0,0和1,1模式,因此是在上升沿采样MCU发来的数据,下降沿输出数据。

6.SPI模式(CPOL(时钟极性),CPHA(时钟相位))。CPOL表示SCLK空闲时的电平,低电平为0,高电平为1;CPHA表示采样数据是在第一个边沿还是第二个边沿,第一个边沿为0,第二个边沿为1.




第二部分

1‘同时MCP2515复位引脚接了ATMEIL9260的GPIO引脚(驱动中没用GPIO复位功能),因此,要么MCP2515的SPI复位命令没有成功,
仔细查看复位

2. 也查看了/sys/class/net/can0/目录下的一些统计、状态等信息,似乎也找不出什么问题。

3.找了好久没找到,就在这时,突然想到,会不会又是IO引脚冲突引脚的。于是查看了下MCP2515用到的其它IO,它还用到了中断GPIO引脚。再次分析电路图,oh my god,真是又是冲突了。解决方法如第1个问题。解决后,可以正常收发帧数据了。

3. CAN不连接其它节点即CAN总线空悬着,这时候进行帧发送测试,第1次可以发送成功(用示波器量波形可以证明),但后面再次发送就不能正常在PC机上收到帧数据,除非ifconfig can0 down再ifconfig can0 up一下,则可正常收发帧数据。

这个问题目前没找到原因。后续解决了再补上。

4. CAN收帧数据时,会收到额外数据,如收到正常帧数据“11 22 33 44 55 66 77 88”,会收到“00 10 00 00 00 00 00 00”多余的帧数据。

这个问题目前没找到原因。后续解决了再补上。




第一部分

1、在SPI调通的基础上,MCP软复位后要对读取CANSTAT寄存器的值以保证系统在复位后默认进入了配置模式,如果不放心,可以对CANSTAT写OPMOD_CONFIG

2、根据数据手册CNF1、CNF2、CNF3、MCP_TXRTSCTRL必须在配置模式下才能修改。

由于MCP的竞争使用的是8MHz,CAN的波特率选择100KHz,因此需要对8MHz进行

预分频,BRP=3 ,TQ =2*(BRP+1)/FOSC = 1us。一个时钟周期相当于10个TQ。为此将

SJW=1 ,PRSEG = 2,PS1=3,PS3=4。(时钟配置没看懂)


这里犯了个低级错误,在对CNF写的时候由于直接用复制粘贴,导致波特率设置错误,最后还是通过示波器一位一位的比对才发现波特率设置错误,经校查才发现CNF3写成了CNF1,浪费了一晚上的时间,但是对CAN的数据链路层有了更深的了解,比如在数据位如果大于等于连续5个相同位的情况,CAN控制器将自动添加一个相反位,接收时自动摈弃掉,这也是为了区分帧头和帧尾。

3、第7步中的程序原来写成如下:

MCP2515_RTS(0x01);//请求发送

temp= MCP2515_ReadReg(MCP_TXB0CTRL);

while((temp & 0x08) == 0x08); //等待发送完毕

发现发送数据时只能发送一次,之后一直在做while循环,temp的值一直是11,TXB0CTRL寄存器中标志数据缓冲区的位bit 3 TXREQ一直为1。数据虽然已经发出去,但是程序显示该位并未清零。

经仔细分析,上述程序的写法有误,temp是一个临时变量,执行temp= MCP2515_ReadReg(MCP_TXB0CTRL);后该值保持不变,而该语句直接在请求发送语句之后,我们知道数据发送是要一定时间的,当数据还未发送完毕,TXREQ的值自然为1,此时如果去读temp的值,则必然为1,与时while循环一直跳不出来。但是如果改成现在的形式,将查询TXREQ值的语句放在while循环中,则只要缓冲区发送完毕,便能查询到TXREQ值为0,可以跳出循环。根本的原因是微控制器和can控制器未能很好的同步。

赞助商链接
相关文章:
MCP2515头文件和源代码
( RXM1SIDH, temp, 4 ); //配置引脚 //设置接收相关引脚控制寄存器,配置它们禁用第二功能 mcp2515_write_register( BFPCTRL, 0 ); //调试使用,设置 BFP...
利用MCP2515的多路CAN总线接口及驱动程序设计
利用MCP2515的多路CAN总线接口及驱动程序设计_电子/电路_工程科技_专业资料。利用 MCP2515 的多路 CAN 总线接口及驱动程序设计 结合实际需求, 提出一种多路 CAN ...
LINUX下基于MCP2515的CAN总线驱动程序设计
LINUX下基于MCP2515的CAN总线驱动程序设计 - 摘要:本论文以 samsung 公司的 s3c2440 处理器与 can 总线控制器 mcp2515 作为开发实例, 简单介绍了嵌入式...
mcp2515驱动的实现
mcp2515驱动的实现_信息与通信_工程科技_专业资料。mcp2515驱动的实现 ...252 0 执行应用程序 ./can_test 显示如下 基本完成,接下来是接上硬件调试了...
MCP2515软件设计
MCP2515软件设计_信息与通信_工程科技_专业资料。MCP2515软件设计 MCP2515.C MCP2515.h基于MCP2515 的 SPI 接口 CAN 总线控制器的软件设计 摘要:CAN 总线是德国...
调试文档
调试文档_冶金/矿山/地质_工程科技_专业资料。基站通电前先目测芯片引脚是否存在...检查 MCP2515 是否有虚焊 Port1 口无信号输出,检查单片机引脚是否有虚焊、短接,...
MCP2512_CAN控制过程说明
MCP2512_CAN控制过程说明_信息与通信_工程科技_专业资料。MCP2515芯片控制CAN总线配置 MCP2515 芯片 CAN 配置总结标准帧格式如下所示: CAN 位时间 CAN 总线上的...
基于MCP2515的CAN总线通信单元设计_图文
基于MCP2515的CAN总线通信单元设计 - 龙源期刊网 http://www.qikan.com.cn 基于 MCP2515 的 CAN 总线通信单元设计 作者:丁雪静 许永辉 来源:《现...
MCP2515_H
/* Define to prevent recursive inclusion ---*/ #ifndef __MCP2515_H #define __MCP2515_H /* Includes ---*/ #include "stm8s_eval_mcp2515.h"...
嵌入式系统实验指导书12级完全
使用 MCP2515 芯片作为 CAN 总线控制器,通过 SPI 接口与 S3C2440 进行通信,...ADS1.2 下仿真、调试 在 ADS1.2 下进行仿真调试,首先要连接 J-LINK 然后...
更多相关文章: