#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "AT91_SPI.h"
#include "MCP2515.h"
/*****************************************************************************
函数功能:MCP2515初始化
入口参数:无
返 回:无
备 注:无
******************************************************************************/
void MCP2515_Init()
{
//复位MCP2515
MCP2515_SPI_CMD( MCP2515_CMD_RESET, ARG_UNUSED, ARG_UNUSED, ARG_UNUSED );
//进入配置模式
MCP2515_SPI_CMD( MCP2515_CMD_BITMOD, TO_UINT(&(MCP2515_MAP->CANCTRL)), 0xe0, 0x80 );
//配置相关引脚
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->BFPCTRL)), BFPCTRL_INIT_VAL, ARG_UNUSED);
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXRTSCTRL)), TXRTSCTRL_INIT_VAL, ARG_UNUSED);
//设置波特率(125k)
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF1)), CNF1_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF2)), CNF2_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF3)), CNF3_INIT_VAL, ARG_UNUSED );
//配置中断
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CANINTE)), CANINTE_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CANINTF)), CANINTF_INIT_VAL, ARG_UNUSED );
//复位MCP2515的错误标志寄存器
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->EFLG)), EFLG_INIT_VAL, ARG_UNUSED);
//配置TXBnCTRL(发送缓冲器控制寄存器)
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB1CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB2CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );
//配置接收缓冲器控制寄存器
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXB0CTRL)), RXB0CTRL_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXB1CTRL)), RXB1CTRL_INIT_VAL, ARG_UNUSED );
//配置MCP2515的验收滤波寄存器
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXF0SIDL)), RXF0SIDL_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXF0SIDH)), RXF0SIDH_INIT_VAL, ARG_UNUSED );
//配置MCP2515的验收屏蔽寄存器
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXM0SIDL)), RXM0SIDL_INIT_VAL, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXM0SIDH)), RXM0SIDH_INIT_VAL, ARG_UNUSED );
//进入正常工作模式
MCP2515_SPI_CMD( MCP2515_CMD_BITMOD, TO_UINT(&(MCP2515_MAP->CANCTRL)), 0xe7, 0x04 );
}
/******************************** End of Function ****************************/
/*****************************************************************************
函数功能:MCP2515相关命令操作
入口参数:cmd: 对MCP2515的相关命令; add: 地址信息; arg1,arg2: 命令的相关参数
返 回:若命令要求有返回值,则返回相应的数据;如果没有返回值的,则返回0
备 注:无
******************************************************************************/
unsigned char MCP2515_SPI_CMD( unsigned char cmd, unsigned char addr, unsigned char arg1, unsigned char arg2 )
{
unsigned char data = 0x00;
switch(cmd)
{
case MCP2515_CMD_RESET:
AT91_SPI_SendByte( MCP2515_CMD_RESET );
break;
case MCP2515_CMD_BITMOD:
AT91_SPI_SendByte( MCP2515_CMD_BITMOD );
AT91_SPI_SendByte( addr );
AT91_SPI_SendByte( arg1 );
AT91_SPI_SendByte( arg2 );
break;
case MCP2515_CMD_WRITE:
AT91_SPI_SendByte( MCP2515_CMD_WRITE );
AT91_SPI_SendByte( addr );
AT91_SPI_SendByte( arg1 );
break;
case MCP2515_CMD_READ:
AT91_SPI_SendByte( MCP2515_CMD_READ );
AT91_SPI_SendByte( addr );
data = AT91_SPI_ReadByte();
break;
default:
data = 0x00;
break;
}
return data;
}
/******************************** End of Function ****************************/
/*****************************************************************************
函数功能:MCP2515发送一帧数据
入口参数:TXnBuf: 选择发送缓冲器; IDType: 标准帧或者扩展帧选择; id: 发送数据的ID号;
DataLen: 发送的数据长度; SendData: 指向要发送数据的首地址
返 回:无
备 注:无
******************************************************************************/
void MCP2515_TX( int TXnBuf, int IDType, unsigned int id, int DataLen, unsigned char *SendData )
{
int i, offset;
unsigned flag;
unsigned char finish;
switch( TXnBuf )
{
case TXBUF0:
offset = 0;
flag = 0x04;
break;
case TXBUF1:
offset = 0x10;
flag = 0x08;
break;
case TXBUF2:
offset = 0x20;
flag = 0x10;
break;
}
//发送帧ID
if( IDType == STAND_ID )
{
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDL))+offset, (id<<5)&0xe0, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDH))+offset, (id>>3)&0xff, ARG_UNUSED );
}
else if( IDType == EXT_ID )
{
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0EID0))+offset, id&0xff, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0EID8))+offset, (id>>8)&0xff, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDL))+offset, ((id>>16)&0x03)|((id>>13)&0xe0)|0x08, ARG_UNUSED );
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDH))+offset, (id>>21)&0xff, ARG_UNUSED );
}
//判别数据长度,若数据长度大于8,则取前8个数据
if( DataLen>8 )
DataLen = 8;
//发送数据长度
MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0DLC))+offset, DataLen, ARG_UNUSED );
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………