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

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调试.txt
MCP2515调试 - 1.注意复位是否成功 2. CAN悬空发送是查看示波器波
mcp2515sja1000通讯调试记录.doc
MCP2515 SJA1000 通讯调试记录 一、CAN 总线 CAN 是控制器
MCP2515_CAN模块用户手册_图文.pdf
MCP2515_CAN模块用户手册 - 第 1 页 温馨提示 本用户手册由《泥人通信模块开发平台》开发团 队编写与审核,本手册仅适用于由泥人团队开发的 MCP2515_CAN 模块。...
Stm32+MCP2515 CAN波特率设置.doc
Stm32+MCP2515 CAN波特率设置_计算机软件及应用_IT/计算机_专业资料。调试CAN总线时,只要把握住几点就可实现通讯,其中最重要的是波特率。 ...
MCP2515的使用--经典.pdf
MCP2515的使用--经典 - MCP2515的模拟SPI,适用于51等没spi功能模块的单片机... MCP2515的使用--经典_工学_高等教育_...MCP2515调试 3页 免费 从MCP2510升级到...
MCP2515滤波配置.doc
MCP2515滤波配置 - MCP2515 的接收滤波功能相关的寄存器以 及滤波
模拟SPI口实现对CAN控制器mcp2515的操作程序.doc
模拟SPI 口实现对 CAN 控制器 mcp2515 的操作程序(2009-06-18 11:33:20) 标签:can 总线 mcp2515 参考程序 it #include "2515.h" #include "SPI.h" #...
CAN总线控制器MCP2515的原理及应用_图文.pdf
CAN总线控制器MCP2515的原理及应用 - 总第 ! 卷第 !#$ 期 电测
MCP2515数据手册_图文.pdf
MCP2515数据手册 - MCP2515 带有 SPI 接口的独立 CAN 控
带有SPI接口的独立CAN控制器MCP2515_图文.ppt
自收发,多用于调试 配置模式 ? MCP2515在正常运行之前必须进行初始化。只
带有SPI接口的独立CAN控制器MCP2515概要_图文.ppt
带有SPI接口的独立CAN控制器MCP2515概要 - CAN现场总线系统 的设计与应用 第5章 带有SPI接口的独立CAN控制器MCP2515 MCP2515简介 MCP2515是Micr...
MCP2515_CAN模块电路原理图.pdf
MCP2515_CAN模块电路原理图_电子/电路_工程科技_专业资料。MCP2515_CAN模块原理图,验证可用,工作良好 1 2 3 4 A A VCC C1 B 10uF/16V C2 0.1uF R1 1K ...
MCP2515头文件定义.txt
MCP2515头文件定义 - /* Define to prevent recursive...... __MCP2515_H #define __MCP2515_H /* Includes ---*/ #include "stm8s_eval_mcp2515....
mcp2515驱动的实现.doc
mcp2515驱动的实现_信息与通信_工程科技_专业资料。mcp2515驱动的实现 ...252 0 执行应用程序 ./can_test 显示如下 基本完成,接下来是接上硬件调试了...
MCP2515核心代码.doc
=0); //直到中断标志被清零 } //外中断(主要用于接收数据) void MCP2515_Int(void) interrupt 2 using 1 //中断调试成功 { SendString("RX is succeed\n...
MCP2515头文件和源代码.doc
( RXM1SIDH, temp, 4 ); //配置引脚 //设置接收相关引脚控制寄存器,配置它们禁用第二功能 mcp2515_write_register( BFPCTRL, 0 ); //调试使用,设置 BFP...
利用MCP2515的多路CAN总线接口及驱动程序设计.doc
利用MCP2515的多路CAN总线接口及驱动程序设计 - 利用 MCP2515 的多路 CAN 总线接口及驱动程序设计 结合实际需求, 提出一种多路 CAN 总线接口的设计方法。 系统硬件...
MCP2515软件设计.doc
MCP2515软件设计 - MCP2515软件设计 MCP2515.C MCP2515.h... 配置它们禁用第二功能 mcp2515_write_register( BFPCTRL, 0 ); //调试使用,设置 BFPCTRL 使 RX0...
基于缓冲管理的MCP2515驱动实现.txt
2 缓冲管理的驱动实现2.1 驱动框架和流程 按照WINCE的标准的分层结构来实现MCP2515的驱动,由于分层结构的WINCE驱动程序和操作系统内核是紧密结合在一起的,调试驱动...
MCP2515中文详解.pdf
MCP2515 1.4 发送 / 接收缓冲器/验收屏蔽寄存器 /验收滤波寄存器 MCP2515 有三...CAN控制器MCP2515在电梯... 3页 免费 MCP2515调试 3页 免费 喜欢...
更多相关文章: