带spi接口的mcp2515 datasheet调试时需要哪些东西

CAN bus driver(19)
MCP2515是一SPI转CAN总线的芯片,对于CPU来说,CPU就是主设备,SPI就是从设备,所以在内核里,MCP2515就是一个SPI设备,而SPI设备在内核中的结构是对应的,是一个spi控制器对应一个SPI设备,也就是一个spi_master对应一个spi设备,而SPI设备在内核中,尤其是新的内核中(新的内核越来越注重分层和分离的结构),则是在驱动中填充spi_driver驱动信息,在板载中填充spi_board_info信息.
要移植好SPI设备,有几点是要注意的.
1,make menuconfig中,CONFIG_SPI_S3C54XX和SPI_SPIDEV这两个及其相关的选项需要打开,因为第一个是spi控制器(驱动在dev-spi.c里),第二个就是SPI设备.
2,当然作为主角的MCP251x.c的驱动选项页当然要打开,内核中,MCP251X.C这个源码已经包含,在drivers/net/can下,检查下Makefile和Kconfig,然后menuconfig里打开编译选项,这一步大概也不会有什么问题.唯一要注意的是在此源码中,需要改一下DEVICE_NAME这个宏,要跟下面提到的modalias一致,因为这是用来match用的.
3,SPI控制器好了,SPI设备驱动有了,那就还差的是SPI控制器配置,SPI的设备信息等的填充了.在/arch/arm/mach-exynos/下的machine_init函数所在源码文件中添加填充
static struct s3c64xx_spi_csinfo spi0_csi[]=
//这个结构体用来设置片选引脚的
.line =&//片选引脚
.set_level = gpio_set_value,
.fb_delay = 0x2,
static struct mcp251x_platform_data mcp251x_info
//这个结构体用来设置振荡器频率的,至于剩下的参数要不要设,需要具体看原理图的接线情况,头文件在
//\include\linux\can\platform\mcp251x.h
static struct spi_board_info spi0_board_info[]=
//这个结构体用来配置SPI设备,也就是对应MCP251X.c这个设备驱动用的,注意modalias要对上.
.modalias = ,
//要跟mcp251x.c上的DEVICE_NAME宏对上
.max_speed_hz = ,//CPU支持最高50MHz,但MCP2515芯片最高只支持到10MHZ,这里要好好权衡一下
.bus_num = ,
//SPI总线的选择,CPU提供3条SPI总线
.chip_select = ,//SPI总线上第几个设备的选择
.mode = SPI_MODE_0,//关于CPOL
CPHA这2个值得选择,有4种模式 00 01 10 11
.platform_data = &mcp251x_info,//传给mcp251x.c驱动用的参数,就是上面的一个结构体.
.controller_data = &spi0_csi[0],//上面的一结构体,片选所用
.irq = ,//mcp2515芯片有一中断脚连到CPU,把复用后的中断量复制在此
这三个结构体填充完后(记得加上相应的头文件),就在static struct platform_device上添加初始化用的设备的变量exynos_device_spi的地址,这是给machine_init函数在添加这三个变量的时候用的,
struct clk *sclk = NULL;
struct clk *prnt = NULL;
struct device *spi0_dev = &exynos_device_spi0.
sclk = clk_get(spi0_dev, &dout_spi0&);
if (IS_ERR(sclk))
dev_err(spi0_dev, &failed to get sclk for SPI-0\n&);
prnt = clk_get(spi0_dev, &mout_mpll_user&);
if (IS_ERR(prnt))
dev_err(spi0_dev, &failed to get prnt\n&);
if (clk_set_parent(sclk, prnt))
printk(KERN_ERR &Unable to set parent %s of clock %s.\n&,
prnt-&name, sclk-&name);
clk_set_rate(sclk, 10 * 1000 * 1000);
clk_put(sclk);
clk_put(prnt);
if (!gpio_request(片选引脚宏地址, 片选引脚名)) {
gpio_direction_output(片选引脚宏地址, 1);
s3c_gpio_cfgpin(片选引脚宏地址, S3C_GPIO_SFN(1));
s3c_gpio_setpull(片选引脚宏地址, S3C_GPIO_PULL_UP);
exynos_spi_set_info(0, EXYNOS_SPI_SRCCLK_SCLK,
ARRAY_SIZE(spi0_csi));
spi_register_board_info(spi0_board_info, ARRAY_SIZE(spi0_board_info));
而这里主要是注册SPI设备和SPI的时钟配置,配置好这些后正常的话就已经把mcp2515的can0设备驱动移植好了.
如果在这里出了问题,不防先设置好spidev.c的驱动,先调好spi的控制器,再把spidev替换成mcp2515.
4,CAN总线在新版本的内核中,并不是以字符设备的形式出现的,原因内核也有说明,主要是因为内核把CAN设备看成了网络设备(当然由于CAN设备的特殊性,CAN是没有IP地址可言的),需要用到socketcan协议,所以要想运行CAN总线,那么就要再menuconfig上打开can的协议(打开项在Networking support--&CAN bus subsystem support下).
5,内核部分完成后,就到Android部分了,由于不是字符设备,不能对其进行简单的读写操作,所以要用到2个工具,iproute2 和 canutil
iproute2在安卓源码上就有,external/iproute2,
而canutil则在网上可以下到,而是用canutil内的命令,还需要用到libsocketcan的库.
在刚开始调试的时候,spi在内核中的框架并不熟悉,困惑于spidev.c和mcp251x.c之间的关系怎么处理,spi的设备怎么设置时钟,为什么mcp251x.c驱动调出来之后再spi下的目录里没有mcp251x的字符设备可供调用等等.
其实spidev跟mcp251x是处于同一位置的spi设备,都由spi控制器控制,或许是可以在spi0_board_info结构体填充chip_select的时候填上排序的序号,可是最后没有用上,因为spidev不是一个实质的设备.而spi下没有mc251x的字符设备供调用是因为mcp251x的驱动节点在net/can0里,意味着内核把它注册为网络设备.这里在调试的时候最好还是先用spidev来先调好spi控制器,因为spidev的驱动提供了可调用的 spi下的字符设备节点,而在内核中,已经提供了spi设备的测试在document/spi下,在编译好后放到开发板上,并将spi发送接收的2条线接上,那么正常的情况下spi就能实现自收自发,这时再去调试mcp251x.c的驱动,就可以不用担心spi在系统上出太大问题了(不过关于时钟这一部分,需要好好地配置).
然后再测试can接口的时候,iproute2这个工具出现过bitrate这个参数无法辨认的情况,其实是在iproute2/ip目录下对iplink_can.c并没有实际调用,归根到底,是在编译android的时候,某些iplink_can.c内某些头文件没有顺利调用导致最后ip命令的参数不支持can,最后吧头文件的include写成了相对地址来调用,就可以了.
而对于canutil这个工具,要顺利编译好,也经过了一些波折,自己用的编译器比较多,环境变量不全,是个挺麻烦的问题,最后自己添加了环境变量,同时无视了伯克利相关的库后,勉强编译成功了cansend candump canecho和cansequence四个工具去调用.
现在,使用ip link set can0 type can bitrate xxx这些命令来设置波特率,用cansend和candump来发送接收,能用示波器看到波形了,但是数据在接收那边还没能出来,这个在之后得后续更新原因.
6、本文主要验证Linux-imx_share\Documentation\spi目录下spidev_test.c的测试例程,能否正常控制SPI接口。在命令行下输入,已经出现信息

&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:87896次
积分:2863
积分:2863
排名:第13433名
原创:171篇
转载:257篇
(3)(2)(39)(7)(1)(63)(29)(8)(27)(33)(36)(20)(23)(25)(54)(41)(17)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'MCP2515调试_中华文本库
第1页/共3页
1.注意复位是否成功
2. CAN悬空发送是查看示波器波形
3. 总线错误是波特率的问题
4 注意SPI的输出模式
5 两块板调试CAN通信
步骤1:(主要改波特率)
设置波特率使2者一致。
SJA1000及MCP2515由自测模式改成正常模式。
MCP2515设置关闭屏蔽接收所有帧,RXB0CTRL.RXM。
CAN通讯成功。证明我的双机硬件连线都正确
步骤2:(主要改滤波)
在步骤1的基础上
1)修改MCP2515的RXB0CTRL.RXM,使其只接收符合滤波器条件的带有扩展标识符的有效报文。
2)修改屏蔽寄存都为0,对应的标识符位将被自动接收而不进行滤波。
CAN通讯成功。
步骤3:(主要改滤波)
在步骤2的基础上
修改SJA1000的ID,改成ID1=1.即
unsigned char Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x0,0x11};地址20是0x11,就是设置ID1=1.
修改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的一些标志位)
Write_SJA1000(REG_CAN_MOD,0x05);
Write_SJA1000(REG_CAN_CMR,0x010);//使能自发自收请求。
放在while循环外,已发送一次。
Write_SJA1000(REG_CAN_MOD,0x01);
//正常发送接收。
Write_SJA1000(REG_CAN_CMR,0x010);//自收发请求
放在while循环外,已发送一次。
ecc显示0xD9,自动重复发送,发送完毕一直是为完毕。状态为0x60
Write_SJA1000(REG_CAN_MOD,0x05);
Write_SJA1000(REG_CAN_CMR,0x01);//正常发送请求
从状态来看显,示0xC,就是说数据已经正常发送出去了。但是没有响应接收中断。我把canl和canh相连也不报错。
后来用示波器查看,发现这样的设置信息根本没发送出去。
所以总结下:
1,希望单机硬件自测的话,CMR要设置为自收发,MOD要设置为自检测。
2,要实现正常的收发,至少需要2台CAN机在网络上。
第1页/共3页
寻找更多 ""基于MCP2515的SPI接口CAN总线控制器的;摘要:CAN总线是德国bosch公司在1986年;一、总线系统结构:CAN总线属于目前众多现场总线;CAN总线通过CAN控制器的两个输出端CANH和;其结构特性使总线避免了当系统出现错误,多节点同时;一般并口CAN总线控制器芯片为SJA1000或8;SPI接口是标准串行外设接口(SerialPer;三、CAN
基于MCP2515的SPI接口CAN总线控制器的软件设计 摘要:CAN总线是德国bosch公司在1986年面向汽车各子系统间通信而开发出的通信协议。由于它的高性能和可靠性已被广泛地应用于工业自动化、安防、船舶、医疗设备、工业设备等其他领域,并已成为现场总线技术的发展热点之一。目前工业设计中较多使用并口can总线控制器,并口can总线芯片占用了MCU较多的普通IO口资源。而目前MCU中大都包含着SPI接口模块,如能通过SPI接口对can总线控制器进行设置和收发,将使MCU的IO接口得到了高效的使用。本论文将就使用MCU的SPI接口的can总线控制器的软件设计进行分析。关键词:MCP2515 MCUCAN总线控制器 SPI接口 一、总线系统结构:CAN总线属于目前众多现场总线的一种,是一种集散型多主方式控制的串行通信网络。网络中各节点根据各自的总线访问优先权(即标准或扩展报文标识符),采用仲裁方式竞向总线发送数据。 CAN总线通过CAN控制器的两个输出端CANH和CANL与物理总线连接,特点: 1、CANH端是高电平或悬浮状态;2、CANL端是低电平或悬浮状态; 其结构特性使总线避免了当系统出现错误,多节点同时发送数据造成的总线短路。另外,CAN总线节点在错误情况下具有自锁功能,可有效避免总线瘫痪。由于采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠。它所具有的卓越性能和独特设计,特别适合工业设备测控单元互连,公认为最有前途的现场总线之一。二、串、并口CAN总线控制器概述 1、并口CAN总线控制器特点 一般并口CAN总线控制器芯片为SJA,并口的优点是数据读写速度快,但占用I/O口较多,硬件较复杂。在与MCU的接线中,最少使用13个IO口。 2、SPI接口的CAN总线控制器特点 SPI接口是标准串行外设接口(SerialPeripheralInterface,SPI),是芯片间通信总线。常见SPI接口can总线节点控制器microchip公司的MCP2510和MCP2515。其中,MCP2515完全支持CANV2.0B技术规范,它不仅能发送和接收标准和扩展数据帧以及远程帧。还自带两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文。MCP2515与MCU的连接是通过SPI接口来实现的,接线使用了4个IO接口,因此减少了MCU的硬件开销,但提高了软件设计难度。 三、CAN总线控制器MCP2515的软件设计 以microchip的MCU芯片编写软件,分为四部分:SPI接口读写、CAN节点初始化、报文发送和报文接收。 1、MCP2515的SPI接口读写 SPI是标准四线同步的高速双向串行总线。由时钟线SCK、数据输入SDI、数据输出SDO、片选CS组成。通讯原理是:由SCK提供时钟脉冲,SDI,SDO则基于此脉冲一位一位的串行完成数据传输。其中,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。对于microchip的中档MCU,芯片内部包含了SPI模块,所以软件设计时不用再考虑传输原理,使SPI的编程变得非常简单。 voidsend_SPI(unsignedchardata1)/*写SPI函数*/{SSPBUF=data1;//启动发送while(SSPIF==0);//等待发送完毕SSPIF=0; } //清除SSPIF标志 ---------------------unsignedcharreceive_SPI(void)/*读SPI函数*/ {unsignedchardata2;SSPBUF=0;//清除SPI缓存while(SSPIF==0);//查询数据接收完毕否SSPIF=0;data2=SSPBUF;return(data2);} 2、对于MCP2515的CAN初始化: MCP2515在正常运行之前必须进行初始化。MCP2515有配置模式、正常模式、休眠模式、监听模式、环回模式五种工作模式,通过CANCTRL.REQOP位的设置才能进入相应工作模式。CAN的初始化只有在配置模式下才能进行。配置模式下,可以对CNF1、CNF2和CNF3波特率设置寄存器以及TXRTSCTRL发送控制寄存器和验收过滤寄存器进行修改。初始化设置的次序: a.设置CANCTRL,进入CAN配置模式;读CANSTAT状态,判断是否进入配置状态。 b.设置CAN总线的波特率---CNF1/CNF2/CNF3; c.设置TXRTSCTRL(发送请求控制寄存器),确定TX0RTS~TX2RTS引脚的适用状态;d.设置TXBnCTRL(发送邮箱控制寄存器),确定邮箱0、邮箱1、邮箱2的优先级,以及ABTF位/MLOA位/TXERR位/TXREQ位清零 报文写入邮箱之前,清零TXBnCTRL.TXREQ,表明发送邮箱无旧报文要发送;e.设置TXBnSIDH/TXBnSIDL(邮箱n的标准标识符); TXBnEID8/TXBnEID0(邮箱n的扩展标识符);并将TXBnSIDL.EXIDE置一(扩展符状态)。 f.设置TXBnDLC(邮箱长度码),确定数据长度(0-8字节) g设置TXBnDn,发送邮箱n的数据字节;例TXB0D0、TXB0D1........TXB0D7 h.设置CANINTE.TXnIE初始化,以便报文发送时,禁止或使能中断。 I.设置CANCTRL,进入CAN巡回/正常模式; voidInit_MCP2515(void)//MCP2515初始化函数{reset_MCP2515(); //复位MCP2515 bit_modify_MCP2515(CANCTRL,0bb);//配置模式write_MCP2515(CNF1,0b);//设置波特率write_MCP2515(CNF2,0b);//设置波特率write_MCP2515(CNF3,0b);//设置波特率 write_MCP2515(RXB0CTRL,0b); bit_modify_MCP2515(CANCTRL,0bb);//返回正常模式write_MCP2515(CANINTF,0b);//接收缓冲器0满中断标志位清零 write_MCP2515(CANINTE,0b);} //接收缓冲器0满中断使能3、MCP2515的报文发送 MCP2515有三个发送缓冲器。每个发送缓冲器占用14字节的SRAM,并映射到器件存储器中。其中第一个字节TXBnCTRL是与报文缓冲器相关的控制寄存器。该寄存器中的信息决定了报文在何种条件下发送,并在报文发送时指示其状态。 启动发送:设置TXBnCTRL.TXREQ为一,表明数据准备好,等待总线空闲时发送。发送的三种方式: a、利用SPI写命令写寄存器,启动;b、发送SPI的RTS命令,启动;c、置TXnRTS引脚为低电平,启动;报文发送函数: write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级write_MCP2515(TXB0SIDH,0xFF);//SID10--SID3write_MCP2515(TXB0SIDL,0xE0);//SID2--SID0 write_MCP2515(TXB0DLC,0x08);//发送数据长度为8字节write_MCP2515(TXB0D0,0x88);//发送的数据88send_TXB0(); //请求发送while((read_MCP2515(TXB0CTRL)&0x08)==0x08);//等待发送完毕 4、MCP2515的报文接收 MCP2515具有两个全接收缓冲器,应接收不同的缓冲器有两个验收屏蔽寄存器和六个验收滤波寄存器。除上述专用接收缓冲器外,MCP2515还具有单独的报文集成缓冲器(MessageAssemblyBuffer,MAB),可作为第三个接收缓冲器。报文接收开始时首先检测起始帧,清接收缓存对应的中断标志,进入接收状态,数据进入报文过滤和屏蔽处理。 报文接收函数: bit_modify_MCP2515(CANINTF,0x01,0x00);//接收缓冲器0满中断标志位清零 read_MCP2515(RXB0SIDH);//接收到的标准标识符高字节read_MCP2515(RXB0SIDL);//接收到的标准标识符低字节 read_MCP2515(RXB0EID8);//接收到的扩展标识符高字节(看RXB0EXID而定)read_MCP2515(RXB0EID0);//接收到的扩展标识符低字节(看RXB0EXID而定)read_MCP2515(RXB0DLC);//接收到的数据长度read_MCP2515(RXB0D0);//接收到的数据 。。。。。。数据处理。。。。。。 5、对于can总线设计到的抗干扰问题主要从软件和硬件两个方面考虑。硬件结构上考虑CAN控制器和物理层总线之间的接口隔离设计;从软件方面,为防止物理总线上传来的干扰,软件中应作必要的抗干扰处理和设计,一般,首先采取重复设定不影响当前工作的特殊寄存器值,避免偶然脉冲干扰改变CPU内部寄存器数据;其次,对关键数据进行备份,采用主副本数据校验和或分组BCH校验来保证数据的准确性。 四、结束语 这里主要论述了基于MCP2515的SPI接口CAN总线控制器的软件设计要点,作为现场总线,CAN具体应用非常广泛,所涉及到其它的数据类传输,如AD、DA、传感器以及控制模块也越来越多。此文章所涉及到的内容也在工业的生产实践中得到了应用。
/*============================================================
C file about MCP2515
V1.00 ============================================================== Chip:
MCP2515 Function:
The controller of CAN-BUS Writer:
Fenghui Zhu Data:
Reference:
\=============================================================*/ //*********************
//* 头 文 件 配 置 区 *
//********************* #include \//**********************
函 数 声 明 区
//**********************
void mcp2515_init(void); void mcp2515_write_register(u08 data, u08 adress); u08 mcp2515_read_register(u08 adress); void mcp2515_bit_modify(u08 data, u08 mask, u08 adress); void mcp2515_write_register_p( u08 adress, u08 *data, u08 length ); //**********************
函 数 定 义 区
//********************** //**********************************************************//
函数说明:MCP2515初始化程序
调用函数:
// //**********************************************************// void mcp2515_init(void) {
//初始化MCU的SPI总线
//SPI_MasterInit();
// MCP2515 启动前进行软件复位
SPI_PORT &= ~(1<<SPI_CS);
//MCP2515的CS有效 三亿文库包含各类专业文献、行业资料、文学作品欣赏、高等教育、专业论文、应用写作文书、幼儿教育、小学教育、生活休闲娱乐、MCP2515软件设计09等内容。 
 MCP2515 初始化程序 // // 输入: 无 // // 输出: 无 // // 调用函数: // //***// void mcp2515_init(void) { //初始化 MCU 的 SPI 总线 /...  mcp2515驱动的实现_信息与通信_工程科技_专业资料。mcp2515驱动的实现 ...mcp251x 添加设备文件 mknod /dev/mcp251x c 252 0 执行应用程序 ./can_...  MCP2515软件设计_信息与通信_工程科技_专业资料。MCP2515软件设计 MCP2515.C MCP2515.h基于MCP2515 的 SPI 接口 CAN 总线控制器的软件设计 摘要:CAN 总线是德国...  以 samsung 公司的 s3c2440 处理器与 can 总线控制器 mcp2515 作为开发实例, 简单介绍了嵌入式 linux 操作系统下的基于 mcp2515 的 can 总线驱动程序的设计方法...  (2510) mcp2515_init(); init_filter(controler_addr,board_addr); //ENTER...T0定时器中断服务程序,喂看门狗 //===...  龙源期刊网 .cn 基于 MCP2515 的 CAN 总线通信单元设计 作者:丁雪静 许永辉 来源:《现代电子技术》2015 年第 21 期 摘要: CAN 总线...  /* Define to prevent recursive inclusion ---*/ #ifndef __MCP2515_H #define __MCP2515_H /* Includes ---*/ #include &stm8s_eval_mcp2515.h&...  Stm32+MCP2515 CAN波特率设置_计算机软件及应用_IT/计算机_专业资料。调试CAN总线时,只要把握住几点就可实现通讯,其中最重要的是波特率。...【图文】带有SPI接口的独立CAN控制器MCP2515_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
带有SPI接口的独立CAN控制器MCP2515
大小:938.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢}

我要回帖

更多关于 mcp2515调试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信