估计是波特率设置问题,下面例子程序可能对你有帮助。
//**********************************************************//
void mcp2515_init(void)
{
//初始化MCU的SPI总线
//SPI_MasterInit();
unsigned char temp[4];
unsigned char j;
// MCP2515 启动前进行软件复位
SPI_MCPCSON; //MCP2515的CS有效
//delay_nms(10);
SPI_MasterTransmit( SPI_RESET );//上电复位后,芯片应工作于CONFIGURATION MODE 进行软件复位 11000000
SPI_MCPCSOFF; //MCP2515的CS无效
delay_nms(10);
//使用位修改指令将MCP2515设置为配置模式
//也就是将CANCTRL寄存器的REQOP[2:0]设置为100
mcp2515_bit_modify( CANCTRL, 0xE0, (1<<REQOP2) );
//设置为500kbps ,TQ = 1/8us
//设置分频控制器CNF1.BRP[5:0] = 0,同步跳转长度设置为 CNF1.SJW[1:0] = 01
mcp2515_write_register( CNF1, (1<<BRP0)|(1<<SJW0) ); // 500kbps
//temp[0] = mcp2515_read_register( CNF1);//读取值为 135
//mcp2515_write_register( CNF1, (1<<SJW0) ); //1Mbps
// 设置传播段 Prop Seg 为00,即1TQ,相位缓冲段 Phase Seg1的长度3TQ
mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) );
// 设置 相位缓冲段 Phase Seg2为 3TQ , 禁用唤醒滤波器
mcp2515_write_register( CNF3, (1<<PHSEG21) );
// 设置MCP2515中断使能寄存器,禁用所有中断
mcp2515_write_register( CANINTE, (1<<RX1IE)|(1<<RX0IE) );//接收满后中断
//设置数据接收相关寄存器
// 设置RXM[1:0]=11,关闭接收缓冲器0屏蔽/滤波功能,接收所有报文;禁止滚存功能
mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
// 设置RXM[1:0]=11,关闭接收缓冲器1屏蔽/滤波功能,接收所有报文;
mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );
temp[0]=0;
temp[1]=0;
temp[2]=0;
temp[3]=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, 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 );
//调试使用,设置BFPCTRL使RX0BF,RX1BF设置为数字输出。
//mcp2515_bit_modify( BFPCTRL, (1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM), (1<<B1BFE)|(1<<B0BFE) );
//设置发送相关引脚控制寄存器,配置它们禁用第二功能
mcp2515_write_register( TXRTSCTRL, 0 );
//MCP2515进入正常模式
mcp2515_bit_modify( CANCTRL, 0xE0, 0);//
}
//设置数据接收相关寄存器
// 设置RXM[1:0]=11,关闭接收缓冲器0屏蔽/滤波功能,接收所有报文;禁止滚存功能
mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
// 设置RXM[1:0]=11,关闭接收缓冲器1屏蔽/滤波功能,接收所有报文;
mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );
temp[0]=0;
temp[1]=0;
temp[2]=0;
temp[3]=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, 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 );
//调试使用,设置BFPCTRL使RX0BF,RX1BF设置为数字输出。
//mcp2515_bit_modify( BFPCTRL, (1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM), (1<<B1BFE)|(1<<B0BFE) );
//设置发送相关引脚控制寄存器,配置它们禁用第二功能
mcp2515_write_register( TXRTSCTRL, 0 );
//MCP2515进入正常模式
mcp2515_bit_modify( CANCTRL, 0xE0, 0);//
}