打印
[ZLG-ARM]

mcp2515通讯问题

[复制链接]
5317|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ghostvip|  楼主 | 2009-8-19 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在弄mcp2515通讯,出了点问题,望大伙指教:
在使用2515通讯的时候,在环回模式下,收发一切正常;但在正常模式下,收发均不成功,
与ZLG USBCAN通讯,USBCAN收不到任何的消息.我当时猜想是波特率问题,之后又觉
得设置的没错,相关设置如下:
mcp2515使用的晶振是16M
BRP = 4     //16M/(2 *(BRP + 1)) = 1.6M
同步段为 1
ps1 = 3     //PSEG1 = (ps1 + 1) = 4
ps2 = 3     //PSEG2 = (ps2 + 1) = 4
prop = 6     //传播段为(prop + 1) = 7

则波特率为1.6M/(1+4+4+7) = 100K

相关帖子

沙发
synics| | 2009-8-23 16:12 | 只看该作者
//**********************************************************//
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) );//接收满后中断

使用特权

评论回复
板凳
synics| | 2009-8-23 16:12 | 只看该作者
//设置数据接收相关寄存器

// 设置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);//
}

使用特权

评论回复
地板
synics| | 2009-8-23 16:12 | 只看该作者
//设置数据接收相关寄存器

// 设置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);//
}

使用特权

评论回复
5
synics| | 2009-8-23 16:13 | 只看该作者
以上这些可能对你有帮助。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

86

帖子

0

粉丝