版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于MCP2515的SPI接口CAN总线控制器的软件设计摘要:CAN总线是德国bosch公司在1986年面向汽车各子系统间通信而开发出的通信协议。由于它的高性能和可靠性已被广泛地应用于工业自动化、安防、船舶、医疗设备、工业设备等其他领域,并已成为现场总线技术的发展热点之一。目前工业设计中较多使用并口can总线控制器,并口can总线芯片占用了MCU较多的普通IO口资源。而目前MCU中大都包含着SPI接口模块,如能通过SPI接口对can总线控制器进行设置和收发,将使MCU的IO接口得到了高效的使用。本论文将就使用MCU的SPI接口的can总线控制器的软件设计进行分析。关键词:MCP2515MCUC
2、AN总线控制器SPI接口一、总线系统结构:CAN总线属于目前众多现场总线的一种,是一种集散型多主方式控制的串行通信网络。网络中各节点根据各自的总线访问优先权(即标准或扩展报文标识符),采用仲裁方式竞向总线发送数据。CAN总线通过CAN控制器的两个输出端CANH和CANL与物理总线连接,特点:1、CANH端是高电平或悬浮状态;2、CANL端是低电平或悬浮状态;其结构特性使总线避免了当系统出现错误,多节点同时发送数据造成的总线短路。另外,CAN总线节点在错误情况下具有自锁功能,可有效避免总线瘫痪。由于采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠。它所具有的卓越性能和独特设计,特别
3、适合工业设备测控单元互连,公认为最有前途的现场总线之一。二、串、并口CAN总线控制器概述1、并口CAN总线控制器特点一般并口CAN总线控制器芯片为SJA1000或82C200,并口的优点是数据读写速度快,但占用I/O口较多,硬件较复杂。在与MCU的接线中,最少使用13个IO口。2、SPI接口的CAN总线控制器特点SPI接口是标准串行外设接口(SerialPeripheralInterface,SPI),是芯片间通信总线。常见SPI接口can总线节点控制器microchip公司的MCP2510和MCP2515。其中,MCP2515完全支持CANV2.0B技术规范,它不仅能发送和接收标准和扩展数据
4、帧以及远程帧。还自带两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文。MCP2515与MCU的连接是通过SPI接口来实现的,接线使用了4个IO接口,因此减少了MCU的硬件开销,但提高了软件设计难度。三、CAN总线控制器MCP2515的软件设计以microchip的MCU芯片编写软件,分为四部分:SPI接口读写、CAN节点初始化、报文发送和报文接收。1、MCP2515的SPI接口读写SPI是标准四线同步的高速双向串行总线。由时钟线SCK、数据输入SDI、数据输出SDO、片选CS组成。通讯原理是:由SCK提供时钟脉冲,SDI,SDO则基于此脉冲一位一位的串行完成数据传输。其中,数据在时
5、钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。对于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;dat
6、a2=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.
7、设置TXRTSCTRL(发送请求控制寄存器),确定TX0RTSTX2RTS引脚的适用状态;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的数据字节;例TX
8、B0D0、TXB0D1.TXB0D7h.设置CANINTE.TXnIE初始化,以便报文发送时,禁止或使能中断。I.设置CANCTRL,进入CAN巡回/正常模式;voidInit_MCP2515(void)/MCP2515初始化函数reset_MCP2515();/复位MCP2515bit_modify_MCP2515(CANCTRL,0b11100000,0b10000000);/配置模式write_MCP2515(CNF1,0b00001001);/设置波特率write_MCP2515(CNF2,0b10010000);/设置波特率write_MCP2515(CNF3,0b01000010)
9、;/设置波特率write_MCP2515(RXB0CTRL,0b01100000);bit_modify_MCP2515(CANCTRL,0b11100000,0b00000000);/返回正常模式write_MCP2515(CANINTF,0b00000000);/接收缓冲器0满中断标志位清零write_MCP2515(CANINTE,0b00000001);/接收缓冲器0满中断使能3、MCP2515的报文发送MCP2515有三个发送缓冲器。每个发送缓冲器占用14字节的SRAM,并映射到器件存储器中。其中第一个字节TXBnCTRL是与报文缓冲器相关的控制寄存器。该寄存器中的信息决定了报文在何
10、种条件下发送,并在报文发送时指示其状态。启动发送:设置TXBnCTRL.TXREQ为一,表明数据准备好,等待总线空闲时发送。发送的三种方式:a、利用SPI写命令写寄存器,启动;b、发送SPI的RTS命令,启动;c、置TXnRTS引脚为低电平,启动;报文发送函数:write_MCP2515(TXB0CTRL,0x03);/设置为发送最高优先级write_MCP2515(TXB0SIDH,0xFF);/SID10-SID3write_MCP2515(TXB0SIDL,0xE0);/SID2-SID0write_MCP2515(TXB0DLC,0x08);/发送数据长度为8字节write_MCP25
11、15(TXB0D0,0x88);/发送的数据88send_TXB0();/请求发送while(read_MCP2515(TXB0CTRL)&0x08)=0x08);/等待发送完毕4、MCP2515的报文接收MCP2515具有两个全接收缓冲器,应接收不同的缓冲器有两个验收屏蔽寄存器和六个验收滤波寄存器。除上述专用接收缓冲器外,MCP2515还具有单独的报文集成缓冲器(MessageAssemblyBuffer,MAB),可作为第三个接收缓冲器。报文接收开始时首先检测起始帧,清接收缓存对应的中断标志,进入接收状态,数据进入报文过滤和屏蔽处理。报文接收函数:bit_modify_MCP251
12、5(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总线设计到的抗干扰问题主要从软件和硬件两个方
13、面考虑。硬件结构上考虑CAN控制器和物理层总线之间的接口隔离设计;从软件方面,为防止物理总线上传来的干扰,软件中应作必要的抗干扰处理和设计,一般,首先采取重复设定不影响当前工作的特殊寄存器值,避免偶然脉冲干扰改变CPU内部寄存器数据;其次,对关键数据进行备份,采用主副本数据校验和或分组BCH校验来保证数据的准确性。四、结束语这里主要论述了基于MCP2515的SPI接口CAN总线控制器的软件设计要点,作为现场总线,CAN具体应用非常广泛,所涉及到其它的数据类传输,如AD、DA、传感器以及控制模块也越来越多。此文章所涉及到的内容也在工业的生产实践中得到了应用。/*=
14、160; C file about MCP2515 V1.00=Chip: MCP2515Function: The controller of CAN-BUSWriter: Fenghui ZhuData: 2009.3.31Reference: "mcp2515.c" of Fabian Greif=*/* /* 头 文 件 配 置 区 * /*#include "mcp2515.h&q
15、uot;/* /* 函 数 声 明 区 * /*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 );/* /* 函 数 定 义 区
16、0; * /*/*/ / 函数说明:MCP2515初始化程序 / / 输入: 无 / / 输出: &
17、#160; 无 / / 调用函数: /*/vo
18、id mcp2515_init(void) /初始化MCU的SPI总线 /SPI_MasterInit(); / MCP2515 启动前进行软件复位 SPI_PORT &= (1<<SPI_CS); /MCP2515的CS有效 SPI_MasterTransmit( SPI_RESET ); SPI_PORT |= (1<<SPI_CS); /MCP2515的CS无效 /使用位修改指令将MCP2515设置为配置模式 /也就是将CANCT
19、RL寄存器的REQOP2:0设置为100 mcp2515_bit_modify( CANCTRL, 0xE0, (1<<REQOP2) ); /* /计算并设置MCP2515的位时间 / 时钟频率:Fosc = 16MHz / 分频控制器 CNF1.BRP5:0 = 7 / 最小时间份额 TQ = 2 * ( BRP + 1 ) / Fosc = 2*(7+1)/16M = 1uS / 同步段 Sync Seg = 1TQ / 传播段 Pr
20、op Seg = ( PRSEG + 1 ) * TQ = 1 TQ / 相位缓冲段 Phase Seg1 = ( PHSEG1 + 1 ) * TQ = 3 TQ / 相位缓冲段 Phase Seg2 = ( PHSEG2 + 1 ) * TQ = 3 TQ / 同步跳转长度设置为 CNF1.SJW1:0 = 00, 即 1TQ / 总线波特率 NBR = Fbit = 1/(sync seg + Prop seg + PS1 + PS2 ) / &
21、#160; = 1/(8TQ) = 1/8uS = 125kHz /设置分频控制器CNF1.BRP5:0 = 7,同步跳转长度设置为 CNF1.SJW1:0 = 00 mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) ); / 设置传播段 Prop Seg 为00,即1TQ,相位缓冲段 Phase Seg1的长度3TQ mcp2515_write_regi
22、ster( CNF2, (1<<BTLMODE)|(1<<PHSEG11) ); / 设置 相位缓冲段 Phase Seg2为 3TQ , 禁用唤醒滤波器 mcp2515_write_register( CNF3, (1<<PHSEG21) ); */ /设置为500kbps ,TQ = 1/8us /设置分频控制器CNF1.BRP5:0 = 0,同步跳转长度设置为 CNF1.SJW1:0 = 01/ mcp2515_write_register( CNF1, (1<<BR
23、P0)|(1<<SJW0) ); / 500kbps mcp2515_write_register( CNF1, (1<<SJW0) ); /1Mbps / 设置传播段 Prop Seg 为00,即1TQ,相位缓冲段 Phase Seg1的长度3TQ mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) ); / 设置 相位缓
24、冲段 Phase Seg2为 3TQ , 禁用唤醒滤波器 mcp2515_write_register( CNF3, (1<<PHSEG21) ); / 设置MCP2515中断使能寄存器,禁用所有中断/ mcp2515_write_register( CANINTE, /*(1<<RX1IE)|(1<<RX0IE)*/ 0 ); / 设置MCP2515中断使能寄存器,使能接收缓冲器中断 mcp2515_write_register( CANINTE, (1<<RX1IE)
25、|(1<<RX0IE) ); /设置数据接收相关寄存器 / 设置RXM1:0=11,关闭接收缓冲器0屏蔽/滤波功能,接收所有报文;禁止滚存功能 mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) ); / 设置RXM1:0=11,关闭接收缓冲器1屏蔽/滤波功能,接收所有报文; mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) ); u08 tem
26、p4 = 0, 0, 0, 0 ; /设置6个验收滤波寄存器为0, mcp2515_write_register_p( RXF0SIDH, temp, 4 ); mcp2515_write_register_p( RXF1SIDH, temp, 4 ); mcp2515_write_register_p( RXF2SIDH, temp, 4 ); mcp2515_write_register_p( RXF3SIDH, temp, 4 ); mcp2515_write_register_p( RXF4SIDH, temp,
27、4 ); mcp2515_write_register_p( RXF5SIDH, temp, 4 ); /设置2个验收滤波寄存器为0, mcp2515_write_register_p( RXM0SIDH, temp, 4 ); mcp2515_write_register_p( RXM1SIDH, temp, 4 ); /配置引脚 /设置接收相关引脚控制寄存器,配置它们禁用第二功能 mcp2515_write_register( BFPCTRL, 0 ); /调试使用,设置BF
28、PCTRL使RX0BF,RX1BF设置为数字输出。 /mcp2515_bit_modify( BFPCTRL, (1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM), (1<<B1BFE)|(1<<B0BFE) ); /设置发送相关引脚控制寄存器,配置它们禁用第二功能 mcp2515_write_register( TXRTSCTRL, 0 ); /MCP2515进入环回模式,进行功能测试 /mcp251
29、5_bit_modify( CANCTRL, 0XE0, (1<<REQOP1) ); /MCP2515进入正常模式 mcp2515_bit_modify( CANCTRL, 0xE0, 0);/*/ / 函数说明:MCP2515写控制寄存器程序 / / 输入: 寄存器地址,写入数据
30、0; / / 输出: 无 / / 调用函数:SPI发送程序SPI_MasterTransmit
31、160; /*/void mcp2515_write_register( u08 adress, u08 data ) / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS); SPI_MasterTransmit(SPI_WRITE); / 发送SPI写寄存器控制字 SPI_MasterTransmit(adress); /发送寄存器地址 SPI_MasterTransmit(data); &
32、#160; /发送寄存器数据 /CS high ,MCP2515 disable SPI_PORT |= (1<<SPI_CS);/*/ / 函数说明:MCP2515读控制寄存器程序 / / 输入: 寄存器地址,
33、; / / 输出: 寄存器数据 / / 调用函数:SPI发送程序SPI_MasterTransmit /*/u08 mcp2515_read_r
34、egister(u08 adress) u08 data; / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS); SPI_MasterTransmit(SPI_READ); / 发送SPI写寄存器控制字 SPI_MasterTransmit(adress); /发送寄存器地址 data = SPI_MasterTransmit(0xff); /回读寄存器数据 /CS high ,MCP2515 dis
35、able SPI_PORT |= (1<<SPI_CS); return data;/*/ / 函数说明:读MCP2515接收缓冲器程序 / / 输入: 缓冲器地址,
36、 / / 输出: 缓冲器数据 / / 调用函数:SPI发送程序SPI_MasterTransmit /*/u08 mcp2515_read_rx_buffer(u08 adress)
37、60;u08 data; / 判断adress是否有效,除了1,2位,其余都应为0 if (adress & 0xF9) return 0; / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS); SPI_MasterTransmit(SPI_READ_RX | adress); /发送读取控制字 data = SPI_MasterTransmit(0xff); /读回数据 /CS high ,
38、MCP2515 disable SPI_PORT |= (1<<SPI_CS); return data;/*/ / 函数说明:MCP2515控制寄存器位修改程序 / / 输入: 寄存器地址,修改位,修改数据 / / 输出: 无
39、 / / 调用函数:SPI发送程序SPI_MasterTransmit /*/void mcp2515_bit_modify(u08 adress, u08 mask, u08 data) / CS low ,MCP
40、2515 enable SPI_PORT &= (1<<SPI_CS); SPI_MasterTransmit(SPI_BIT_MODIFY); /SPI位修改指令 SPI_MasterTransmit(adress); /发送寄存器地址 SPI_MasterTransmit(mask); /发送屏蔽字节, /屏蔽字节中“1
41、”表示允许对相应位修改,“0”表示禁止修改 SPI_MasterTransmit(data); /发送数据字节 /CS high ,MCP2515 disable SPI_PORT |= (1<<SPI_CS);/*/ / 函数说明:对MCP2515连续寄存器进行连续写操作 / / 输入: 连续寄存器起始地址,数据指针,数据长度 / /
42、输出: 无 / / 调用函数:SPI发送程序SPI_MasterTransmit /*/void mcp2515_write_register_p( u08 adress, u08 *d
43、ata, u08 length ) u08 i; / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS); SPI_MasterTransmit(SPI_WRITE); /发送SPI写指令 SPI_MasterTransmit(adress); /发送起始寄存器地址 for (i=0; i<length ;i+ ) SPI_MasterTransmit(*data+);
44、 /发送数据 /CS high ,MCP2515 disable SPI_PORT |= (1<<SPI_CS);/*/ / 函数说明:对MCP2515连续寄存器进行连续读操作 / / 输入: 连续寄存器起始地址,数据指针,数据长度 / / 输出: 无
45、60; / / 调用函数:SPI发送程序SPI_MasterTransmit /*/void mcp2515_read_register_p( u08 adress, u08 *data, u08 length ) u08 i; / CS low ,MCP2515
46、 enable SPI_PORT &= (1<<SPI_CS); SPI_MasterTransmit(SPI_READ); /发送SPI读指令 SPI_MasterTransmit(adress); /发送起始寄存器地址 for (i=0; i<length ;i+ ) *data+ = SPI_MasterTransmit(0xff); /数据保存 /CS high ,MCP2515 disable SPI_
47、PORT |= (1<<SPI_CS);头文件:/*= Headfile about MCP2515 V1.00=Chip: MCP2515Function: The controller of CAN-BUSWriter: Fenghui ZhuData: 2009-3-31Reference: "mcp2515.h" of Fabian Grei
48、f=*/#ifndef _MCP2515_H_#define _MCP2515_H_/* /* 用户类型定义区 * /*/* /* 头 文 件 配 置 区 * /*#include "Habit_Frank.h"#include "SPI_Ctrl.h"/* /* 系 统 宏 定 义 * /* / 定义寄存器地址#define RXF0SIDH 0x00#define RXF0SIDL 0x01#define RXF0EID8 0x02#define RXF0EID0 0x03#define RXF1SI
49、DH 0x04#define RXF1SIDL 0x05#define RXF1EID8 0x06#define RXF1EID0 0x07#define RXF2SIDH 0x08#define RXF2SIDL 0x09#define RXF2EID8 0x0A#define RXF2EID0 0x0B#define BFPCTRL 0x0C#define TXRTSCTRL 0x0D#define CANSTAT 0x0E#define CANCTRL 0x0F#define RXF3SIDH 0x10#define RXF3SIDL 0x11#def
50、ine RXF3EID8 0x12#define RXF3EID0 0x13#define RXF4SIDH 0x14#define RXF4SIDL 0x15#define RXF4EID8 0x16#define RXF4EID0 0x17#define RXF5SIDH 0x18#define RXF5SIDL 0x19#define RXF5EID8 0x1A#define RXF5EID0 0x1B#define TEC 0x1C#define REC 0x1D#define RXM0SIDH 0x20#define
51、 RXM0SIDL 0x21#define RXM0EID8 0x22#define RXM0EID0 0x23#define RXM1SIDH 0x24#define RXM1SIDL 0x25#define RXM1EID8 0x26#define RXM1EID0 0x27#define CNF3 0x28#define CNF2 0x29#define CNF1 0x2A#define CANINTE 0x2B#define CANINTF 0x2C#define EFLG 0x2D#define TXB0
52、CTRL 0x30#define TXB0SIDH 0x31#define TXB0SIDL 0x32#define TXB0EID8 0x33#define TXB0EID0 0x34#define TXB0DLC 0x35#define TXB0D0 0x36#define TXB0D1 0x37#define TXB0D2 0x38#define TXB0D3 0x39#define TXB0D4 0x3A#define TXB0D5 0x3B#define TXB0D6 0x3C#defin
53、e TXB0D7 0x3D#define TXB1CTRL 0x40#define TXB1SIDH 0x41#define TXB1SIDL 0x42#define TXB1EID8 0x43#define TXB1EID0 0x44#define TXB1DLC 0x45#define TXB1D0 0x46#define TXB1D1 0x47#define TXB1D2 0x48#define TXB1D3 0x49#define TXB1D4 0x4A#define TXB1D5 0x4B
54、#define TXB1D6 0x4C#define TXB1D7 0x4D#define TXB2CTRL 0x50#define TXB2SIDH 0x51#define TXB2SIDL 0x52#define TXB2EID8 0x53#define TXB2EID0 0x54#define TXB2DLC 0x55#define TXB2D0 0x56#define TXB2D1 0x57#define TXB2D2 0x58#define TXB2D3 0x59#define TXB2D4
55、0;0x5A#define TXB2D5 0x5B#define TXB2D6 0x5C#define TXB2D7 0x5D#define RXB0CTRL 0x60#define RXB0SIDH 0x61#define RXB0SIDL 0x62#define RXB0EID8 0x63#define RXB0EID0 0x64#define RXB0DLC 0x65#define RXB0D0 0x66#define RXB0D1 0x67#define RXB0D2 0x68#define RXB0D
56、3 0x69#define RXB0D4 0x6A#define RXB0D5 0x6B#define RXB0D6 0x6C#define RXB0D7 0x6D#define RXB1CTRL 0x70#define RXB1SIDH 0x71#define RXB1SIDL 0x72#define RXB1EID8 0x73#define RXB1EID0 0x74#define RXB1DLC 0x75#define RXB1D0 0x76#define RXB1D1 0x77#define
57、 RXB1D2 0x78#define RXB1D3 0x79#define RXB1D4 0x7A#define RXB1D5 0x7B#define RXB1D6 0x7C#define RXB1D7 0x7D/定义寄存器BFPCTRL位信息#define B1BFS 5#define B0BFS 4#define B1BFE 3#define B0BFE 2#define B1BFM 1#define B0BFM 0/定义寄存器TXRTSCTRL
58、位信息#define B2RTS 5#define B1RTS 4#define B0RTS 3#define B2RTSM 2#define B1RTSM 1#define B0RTSM 0/定义寄存器CANSTAT位信息#define OPMOD2 7#define OPMOD1 6#define OPMOD0 5#define ICOD2 3#define ICOD1 2#define ICOD0 1/定义寄存器CANCTRL位信息#define
59、 REQOP2 7#define REQOP1 6#define REQOP0 5#define ABAT 4#define CLKEN 2#define CLKPRE1 1#define CLKPRE0 0 /定义寄存器CNF3位信息#define WAKFIL 6#define PHSEG22 2#define PHSEG21 1#define PHSEG20 0 /定义寄存器CNF2位信息#define BTLMODE 7#d
60、efine SAM 6#define PHSEG12 5#define PHSEG11 4#define PHSEG10 3#define PHSEG2 2#define PHSEG1 1#define PHSEG0 0 /定义寄存器CNF1位信息#define SJW1 7#define SJW0 6#define BRP5 5#define BRP4 4#define BRP3 3#define BRP2 2#define
61、BRP1 1#define BRP0 0 /定义寄存器CANINTE位信息#define MERRE 7#define WAKIE 6#define ERRIE 5#define TX2IE 4#define TX1IE 3#define TX0IE 2#define RX1IE 1#define RX0IE 0 /定义寄存器CANINTF位信息#define MERRF 7#define WAKIF 6#define ERRIF
62、 5#define TX2IF 4#define TX1IF 3#define TX0IF 2#define RX1IF 1#define RX0IF 0 /定义寄存器EFLG位信息#define RX1OVR 7#define RX0OVR 6#define TXB0 5#define TXEP 4#define RXEP 3#define TXWAR 2#define RXWAR 1#define EWARN 0
63、160;/定义寄存器TXBnCTRL ( n = 0, 1, 2 )位信息#define ABTF 6#define MLOA 5#define TXERR 4#define TXREQ 3#define TXP1 1#define TXP0 0 /定义寄存器RXB0CTRL位信息#define RXM1 6#define RXM0 5#define RXRTR 3#define BUKT 2#define BUKT1 1#define FILHIT0
64、 0/定义发送缓冲寄存器 TXBnSIDL ( n = 0, 1 )的位信息#define EXIDE 3/定义接受缓冲器1控制寄存器的位信息#define FILHIT2 2#define FILHIT1 1/* * 定义接收缓冲器n标准标示符低位 RXBnSIDL ( n = 0, 1 )的位信息 */#define SRR 4#define IDE 3/ 定义接收缓冲器n数据长度码 RXBnDLC ( n = 0, 1 )的位信息#define RTR 6#define DLC3
65、 3#define DLC2 2#define DLC1 1#define DLC0 0 /定义SPI控制命令字#define SPI_RESET 0xC0#define SPI_READ 0x03#define SPI_READ_RX 0x90#define SPI_WRITE 0x02#define SPI_WRITE_TX 0x40#define SPI_RTS 0x80#define SPI_READ_STATUS 0xA0#define SPI_RX_STATUS 0xB0#define SPI_BIT_MODIFY 0x05/* /* 常 数 宏 定 义 * /*/* /* 动 作 宏 定 义 * /*/* /* 全局变量声明区 * /*/* /* 函 数 声 明 区 * /* /*/ / 函数说明:MCP2515初始化程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电机与拖动技术项目化教程 课件 孙方霞 项目1-3 变压器的工作原理、用途及分类-单相异步电机的分类及运行控制
- 5.2基本政治制度随堂作业-八年级道德与法治下册(统编版)(解析版)
- 小学卫生自查报告
- 太平洋半年工作总结
- 小学初中高中课件
- 我们要节约粮食 珍惜粮食主题班会
- 深圳市园林花卉租赁合同(33篇)
- 高中语文组教研工作计划(3篇)
- 有关读书心得范文
- 小学综合实践活动教案汇编【15篇】
- 个人业务自传范文(8篇)
- 幼儿园必读绘本课件:《排好队一个接一个》
- 学生应征入伍保留学籍申请表
- 全国一级建造师《建筑实务》经典案例103题(后附答案解析)
- 医疗纠纷的防范和处理方案培训课件
- 定价策略案例分析
- 幼儿园课件-神奇的中草药
- 小儿泄泻中医护理常规课件
- 高级蔬菜育种学
- 分数除法应用题专项练习210题(有答案过程)ok
- 铁路工程项目日常检查问题库(一般问题)
评论
0/150
提交评论