[电工&电子] 51单片机CAN总线通讯,MCP2515模块,普中科技单片机电路板--正常模式,扩展

[复制链接]
查看122 | 回复0 | 2024-7-20 16:19:41 | 显示全部楼层 |阅读模式
>

1、其它不用变化,只是改变MCP初始化程序中的发送缓冲器低位为扩展报文,并设定发送的标准与扩展报文ID.

  MCP2515_WriteByte(TXB0SIDH,0x00);//发送缓冲器0标准标识符高位  MCP2515_WriteByte(TXB0SIDL,0x68);//发送缓冲器0标准标识符低位 扩展报文  MCP2515_WriteByte(TXB0EID8,0x00);//发送缓冲器0扩展标识符高位  MCP2515_WriteByte(TXB0EID0,0x00);//发送缓冲器0扩展标识符低位/

  2、清空接受缓冲器标准与扩展标识符

  MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收缓冲器0的标准标识符高位  MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收缓冲器0的标准标识符低位  MCP2515_WriteByte(RXB0EID8,0x00);//清空接收缓冲器0的扩展标识符高位  MCP2515_WriteByte(RXB0EID0,0x00);//清空接收缓冲器0的扩展标识符低位

 3、设定接受的报文类别,

11 = 关闭屏蔽/滤波功能;接收所有报文
10 = 只接收符合滤波器条件的带有扩展标识符的有效报文
01 = 只接收符合滤波器条件的带有标准标识符的有效报文
00 = 接收符合滤波器条件的所有带扩展标识符或标准标识符的有效报文

MCP2515_WriteByte(RXB0CTRL,0x00);//接收所有符合条件标识符的有效信息

4、配置滤波寄存器标准标识符与扩展标识符,配置为扩展报文滤波。

  MCP2515_WriteByte(RXF0SIDH,0x00);//配置验收滤波寄存器n标准标识符高位  MCP2515_WriteByte(RXF0SIDL,0x48);//配置验收滤波寄存器n标准标识符低位 报文滤波仅用于扩展帧  MCP2515_WriteByte(RXF0EID8,0x00);//配置验收滤波寄存器n扩展标识符高位  MCP2515_WriteByte(RXF0EID0,0x02);//配置验收滤波寄存器n扩展标识符低位

5、配置屏蔽寄存器的标准报文与扩展报文位

  MCP2515_WriteByte(RXM0SIDH,0xff);//配置验收屏蔽寄存器n标准标识符高位  MCP2515_WriteByte(RXM0SIDL,0xE0);//配置验收屏蔽寄存器n标准标识符低位  MCP2515_WriteByte(RXM0EID8,0xff);//配置验收屏蔽寄存器n扩展标识符高位  MCP2515_WriteByte(RXM0EID0,0xFC);//配置验收屏蔽寄存器n扩展标识符低位

注意接受的报文滤波应该设置为发送方的发送报文ID,这样就可以选择接受对方的信号了。

A机的MCP初始化代码为:

void MCP2515_Init(void){  unsigned char temp=0;
MCP2515_Reset(); //发送复位指令软件复位MCP2515 Delay_Nms(1); //通过软件延时约nms(不准确)
//设置波特率为125Kbps //set CNF1,SJW=00,长度为1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us MCP2515_WriteByte(CNF1,CAN_125Kbps); //set CNF2,SAM=0,在采样点对总线进行一次采样,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ MCP2515_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ); //set CNF3,PHSEG2=(2+1)TQ=3TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位 MCP2515_WriteByte(CNF3,PHSEG2_3TQ); MCP2515_WriteByte(TXB0SIDH,0x00);//发送缓冲器0标准标识符高位 MCP2515_WriteByte(TXB0SIDL,0x68);//发送缓冲器0标准标识符低位 扩展报文 MCP2515_WriteByte(TXB0EID8,0x00);//发送缓冲器0扩展标识符高位 MCP2515_WriteByte(TXB0EID0,0x00);//发送缓冲器0扩展标识符低位 MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收缓冲器0的标准标识符高位 MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收缓冲器0的标准标识符低位 MCP2515_WriteByte(RXB0EID8,0x00);//清空接收缓冲器0的扩展标识符高位 MCP2515_WriteByte(RXB0EID0,0x00);//清空接收缓冲器0的扩展标识符低位 MCP2515_WriteByte(RXB0CTRL,0x00);//接收所有符合条件标识符的有效信息 MCP2515_WriteByte(RXB0DLC,DLC_1);//设置接收数据的长度为8个字节 MCP2515_WriteByte(RXF0SIDH,0x00);//配置验收滤波寄存器n标准标识符高位 MCP2515_WriteByte(RXF0SIDL,0x48);//配置验收滤波寄存器n标准标识符低位 报文滤波仅用于扩展帧 MCP2515_WriteByte(RXF0EID8,0x00);//配置验收滤波寄存器n扩展标识符高位 MCP2515_WriteByte(RXF0EID0,0x02);//配置验收滤波寄存器n扩展标识符低位 // MCP2515_WriteByte(RXF1SIDH,0x00);//配置验收滤波寄存器n标准标识符高位// MCP2515_WriteByte(RXF1SIDL,0x60);//配置验收滤波寄存器n标准标识符低位 MCP2515_WriteByte(RXM0SIDH,0xff);//配置验收屏蔽寄存器n标准标识符高位 MCP2515_WriteByte(RXM0SIDL,0xE0);//配置验收屏蔽寄存器n标准标识符低位 MCP2515_WriteByte(RXM0EID8,0xff);//配置验收屏蔽寄存器n扩展标识符高位 MCP2515_WriteByte(RXM0EID0,0xFC);//配置验收屏蔽寄存器n扩展标识符低位 MCP2515_WriteByte(CANINTF,0x00);//清空CAN中断标志寄存器的所有位(必须由MCU清空) //MCP2515_WriteByte(CANINTE,0x01);//配置CAN中断使能寄存器的接收缓冲器0满中断使能,其它位禁止中断 MCP2515_WriteByte(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//将MCP2515设置为正常模式,退出配置模式 temp=MCP2515_ReadByte(CANSTAT);//读取CAN状态寄存器的值 if(OPMODE_NORMAL!=(temp&0xE0))//判断MCP2515是否已经进入正常模式 { MCP2515_WriteByte(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//再次将MCP2515设置为回环模式,退出配置模式 }}

B机的初始化代码为:

void MCP2515_Init(void){  unsigned char temp=0;
MCP2515_Reset(); //发送复位指令软件复位MCP2515 Delay_Nms(1); //通过软件延时约nms(不准确)
//设置波特率为125Kbps //set CNF1,SJW=00,长度为1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us MCP2515_WriteByte(CNF1,CAN_125Kbps); //set CNF2,SAM=0,在采样点对总线进行一次采样,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ MCP2515_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ); //set CNF3,PHSEG2=(2+1)TQ=3TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位 MCP2515_WriteByte(CNF3,PHSEG2_3TQ); MCP2515_WriteByte(TXB0SIDH,0x00);//发送缓冲器0标准标识符高位 MCP2515_WriteByte(TXB0SIDL,0x48);//发送缓冲器0标准标识符低位 扩展报文 MCP2515_WriteByte(TXB0EID8,0x00);//发送缓冲器0扩展标识符高位 MCP2515_WriteByte(TXB0EID0,0x00);//发送缓冲器0扩展标识符低位 MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收缓冲器0的标准标识符高位 MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收缓冲器0的标准标识符低位 MCP2515_WriteByte(RXB0EID8,0x00);//清空接收缓冲器0的扩展标识符高位 MCP2515_WriteByte(RXB0EID0,0x00);//清空接收缓冲器0的扩展标识符低位 MCP2515_WriteByte(RXB0CTRL,0x00);//接收所有符合条件标识符的有效信息 MCP2515_WriteByte(RXB0DLC,DLC_1);//设置接收数据的长度为8个字节 MCP2515_WriteByte(RXF0SIDH,0x00);//配置验收滤波寄存器n标准标识符高位 MCP2515_WriteByte(RXF0SIDL,0x68);//配置验收滤波寄存器n标准标识符低位 报文滤波仅用于扩展帧 MCP2515_WriteByte(RXF0EID8,0x00);//配置验收滤波寄存器n扩展标识符高位 MCP2515_WriteByte(RXF0EID0,0x01);//配置验收滤波寄存器n扩展标识符低位 // MCP2515_WriteByte(RXF1SIDH,0x00);//配置验收滤波寄存器n标准标识符高位// MCP2515_WriteByte(RXF1SIDL,0x60);//配置验收滤波寄存器n标准标识符低位 MCP2515_WriteByte(RXM0SIDH,0xff);//配置验收屏蔽寄存器n标准标识符高位 MCP2515_WriteByte(RXM0SIDL,0xE0);//配置验收屏蔽寄存器n标准标识符低位 MCP2515_WriteByte(RXM0EID8,0xff);//配置验收屏蔽寄存器n扩展标识符高位 MCP2515_WriteByte(RXM0EID0,0xFC);//配置验收屏蔽寄存器n扩展标识符低位 MCP2515_WriteByte(CANINTF,0x00);//清空CAN中断标志寄存器的所有位(必须由MCU清空) //MCP2515_WriteByte(CANINTE,0x01);//配置CAN中断使能寄存器的接收缓冲器0满中断使能,其它位禁止中断 MCP2515_WriteByte(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//将MCP2515设置为正常模式,退出配置模式 temp=MCP2515_ReadByte(CANSTAT);//读取CAN状态寄存器的值 if(OPMODE_NORMAL!=(temp&0xE0))//判断MCP2515是否已经进入正常模式 { MCP2515_WriteByte(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//再次将MCP2515设置为回环模式,退出配置模式 }}

因为扩展屏蔽寄存器的低位是:1111 1100 实际上,扩展ID的低位0-3都可以接受到。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则