#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);//选定正常工作模式
}
我们一直致力于现场总线CAN的应用与推广,相信专注的力量!!
MSG-3C
CAN总线开发板:
http://item.taobao.com/auction/item_detail-0db1-d554e697bb3b7714d3db4589d04afc47.htm?cm_cat=0
MSG-2C
CAN总线开发学习板:
http://item.taobao.com/auction/item_detail-0db1-2205276daa6251776dac2c82b78661f3.jhtml
加载中,请稍候......