mcp2515是can控制器,简单的来讲,就是只要配置好寄存器,芯片就能够自动的解析can数据帧,同时保存到接收缓存中,提醒单片机可以读取can的数据字节。
读取的方式是快速spi,可以达到10Mbits/s。当然,调试的时候,可以放低速度。前一篇文章已经分析了spi的调试步骤,这里不再分析。
can控制器有设置过滤器的功能,通俗的讲:不是can控制器想要的东西,我就过滤不接收,不放到接收缓存上,这样可以屏蔽了很多can总线上的无用的数据。
mcp251的接收缓存器控制寄存器中,有两位RXM设置,可以设置屏蔽的工作模式。
bit 6-5 RXM :接收缓冲器工作模式位
11 = 关闭屏蔽/滤波功能;接收所有报文
10 = 只接收符合滤波器条件的带有扩展标识符的有效报文
01 = 只接收符合滤波器条件的带有标准标识符的有效报文
00 = 接收符合滤波器条件的所有带扩展标识符或标准标识符的有效报文
一般易用00和11,英文文档中,10 ,01是保留的,因此中文文档也有不对的地方。
1、在调试的时候,建议不过滤,上位机发什么数据,就接收什么数据,以验证硬件和软件的基本功能是否正确。
2、如果上一步已经调试成功,说明mcp2515的驱动基本上是ok了。
3、然后可以开启“接收符合滤波器条件的所有带扩展标识符或标准标识符的有效报文”的功能,具体的方法可以参考下图:
我的屏蔽寄存器设置如下:说明是开启所有位屏蔽功能。所有id数据必须和我设置一样才能接收数据。
MCP2515_WriteByte(TXB0SIDH, 0xFF); //发送缓冲器0标准标识符高位
MCP2515_WriteByte(TXB0SIDL, 0xEB); //发送缓冲器0标准标识符低位
MCP2515_WriteByte(TXB0EID8, 0xFF); //发送缓冲器0标准标识符高位
MCP2515_WriteByte(TXB0EID0, 0xFF); //发送缓冲器0标准标识符低位
如果过滤位n如果是0,那么报文中的id的第n位也要0,
如果过滤位n如果是1,那么报文中的id的第n位也要1,
满足以上的两个条件,才是可以接受的数据id,否则将过滤掉,不接受。
如果要是屏蔽第n位设置为0,说名报文第n位数据mcp2515就不过滤,统统接收。
另外,调试过程中一定要记住电源要接好。
stm32管脚的输出电压最多是3.3V而有些芯片比如1050芯片的工作电压是大于4.75.从而导致芯片不能正常工作,外接个5Vdc解决问题。