模拟SPI口实现对CAN控制器mcp2515的操作程序

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模拟SPI口实现对CAN控制器mcp2515的操作程序(2009-06-18 11:33:20)标签:can总线mcp2515参考程序it

#include "2515.h"

#include "SPI.h"

#include "reg51.h"

#include "Function.h"

#define CAN_10Kbps 0x31

#define CAN_25Kbps 0x13

#define CAN_50Kbps 0x09

#define CAN_100Kbps 0x04

#define CAN_125Kbps 0x03

#define CAN_250Kbps 0x01

#define CAN_500Kbps 0x00

//void SPIReset(void);

//void SPIByteWrite(unsigned char ,unsigned char );

//unsigned char SPIByteRead(unsigned char );

unsigned char dummy;

void Init2515(unsigned int IDF)

{

SPIReset();

delay_ms(1);

//SPIByteWrite(CANCTRL,0x80);//CAN工作在配置模式

SPIByteWrite(RXM0SIDH,0x00);

SPIByteWrite(RXM0SIDL,0x00);

SPIByteWrite(RXF0SIDH,0x00);

SPIByteWrite(RXF0SIDL,0x00);

SPIByteWrite(RXM1SIDH,0x00);

SPIByteWrite(RXM1SIDL,0x00);

SPIByteWrite(RXF2SIDH,0x00);

SPIByteWrite(RXF2SIDL,0x00);

//设置波特率为10Kbps

//set CNF1,SJW=00,长度为1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us

SPIByteWrite(CNF1,CAN_125Kbps);

//set CNF2,SAM=0,在采样点对总线进行一次采样,

PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ

SPIByteWrite(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);

//set CNF3,PHSEG2=(2+1)TQ=3TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位

SPIByteWrite(CNF3,PHSEG2_3TQ);

//set TXB0,设置发送缓冲器0的标识符和发送的数据,以及发送的数据长度

SPIByteWrite(TXB0CTRL,0x03);//设置发送缓冲器0控制寄存器清零TXREQ,发送优先级最高

//BitModiMcp2515(TXB0CTRL,0x08,0x00);

SPIByteWrite(TXB0SIDH,IDF);//设置发送缓冲器0的标准标识符,待修改***

SPIByteWrite(TXB0SIDL,0xE0);//用到标准标识符

SPIByteWrite(TXB0DLC,DLC_8);//设置发送数据的长度为8个字节

//SPIByteWrite(TXB0D0,0x1E);//有待修改及确定是否使用

//SPIByteWrite(TXB0D1,0x10);//有待修改及确定是否使用

//设置接收缓冲器0的标识符和初始化数据

//SPIByteWrite(RXB0SIDH,0x55);//设置接收缓冲器0的标准标识符,待修改***

//SPIByteWrite(RXB0SIDL,0xE0);//用到标准标识符

SPIByteWrite(RXB0CTRL,0x20);//仅仅接收标准标识符的有效信息,FIILHIT0=0表示RXB0 ,采用FILHIT0

SPIByteWrite(RXB0DLC,DLC_8);//设置接收数据的长度为8个字节

SPIByteWrite(RXF0SIDH,0xE0);//初始化接收滤波器0,待修改***

SPIByteWrite(RXF0SIDL,0xE0);

SPIByteWrite(RXM0SIDH,0xFF);//初始化接收屏蔽器0,待修改***

SPIByteWrite(RXM0SIDL,0xE0);

//设置接收缓冲器1的标识符和初始化数据

//SPIByteWrite(RXB1SIDH,IDF); //设置接收缓冲器0的标准标识符,待修改***

//SPIByteWrite(RXB1SIDL,0xE0);//用到标准标识符

SPIByteWrite(RXB1CTRL,0x20);//仅仅接收标准标识符的有效信息,FIILHIT0=0表示RXB0 ,采用FILHIT0

SPIByteWrite(RXB1DLC,DLC_8);//设置接收数据的长度为8个字节

SPIByteWrite(RXF2SIDH,0x00);//初始化接收滤波器2,待修改***

SPIByteWrite(RXF2SIDL,0xE0);

SPIByteWrite(RXF3SIDH,0x01);//初始化接收滤波器3,待修改***

SPIByteWrite(RXF3SIDL,0xE0);

SPIByteWrite(RXF4SIDH,0x02);//初始化接收滤波器4,待修改***

SPIByteWrite(RXF4SIDL,0xE0);

SPIByteWrite(RXF5SIDH,0x56);//初始化接收滤波器5,待修改***

SPIByteWrite(RXF5SIDL,0xE0);

SPIByteWrite(RXM1SIDH,0xFF);//初始化接收屏蔽器1,待修改***

SPIByteWrite(RXM1SIDL,0xE0);

//设置接收缓冲器0中断

SPIByteWrite(CANINTF,0x00);//接收完一次必须对中断标志位清0

SPIByteWrite(CANINTE,0x02);//接收缓冲器0满中断使能位***修改成01-02

//设置单触发模式1 使能,报文尝试发送一次;0禁止。如有需要报文会重发

//BitModiMcp2515(CANCTRL,0x08,0x00);

SPIByteWrite(CANCTRL,REQOP_NORMAL | CLKOUT_ENABLED);//设置正常模式

BitModiMcp2515(CANCTRL,0xE7,0x04);

dummy=SPIByteRead(CANSTAT);

if (OPMODE_NORMAL != (dummy && 0xE0))

SPIByteWrite(CANCTRL,REQOP_NORMAL | CLKOUT_ENABLED);//判断进入正常工作模式 //SPIByteWrite(CANCTRL,0x00);//选定正常工作模式

}

相关文档
最新文档