加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

模拟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);//选定正常工作模式
 
}


我们一直致力于现场总线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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有