现在 的主流MCU都内置的CAN了,但是一些特殊的条件下还有可能需要独立CAN控制嚣,mcp25625就是我公司常用的一个独立CAN控制嚣。
这个片子有中文PDF,用起来应该不是问题。下面重点说下它的寄存器
左边是控制寄存器,中间是发送寄存器,右边是接收寄存器,排列的还是有规律的。由于这个片子是SPI接口的,不能轻意的寻址到任意寄存器,(相对并口接口FMC来说),好在这个片子提供了常用的几个指令,和burst访问模式,才使得可以很方便的控制片子。常用指令集如下:
我的发送流程如下:
1.RRX STATUS 读状态,找到那个空的TX缓冲区,
2. LOAD TX BUFFER 加载数据到那个空的TX缓冲区。
3.RTS 启动发送。
接收CAN数据包类型。
需要注意一点的是,有时候你会这么操作,发送数在主程序中,接收数据在中断程序中,但是就一条SPI控制总线,如果正在发送数据时来中断了, 在中断中又去接收CAN,那么就会中断SPI接口的发送时序,就会有问题。
我的解决办法是发送CAN数据的时候禁止接收中断,简单粗暴、简单有效的解决了这个非常隐蔽的问题。
看了韦老师的最新的linux中断处理过程,意识到这种处理方式太落后了, 最先进的处理方法是 中断只置标志,具体在线程中处理, 如果CAN数据的收发操作都在线程中处理的话,就不会出现CAN收数据与发数据相互嵌套了。 有时间了就按最先进的中断处理理念、思想来处理。!!!! (在中断中收数据太浪费了!)
MCP25625中文手册https://download.csdn.net/download/wandersky0822/13098565
突然发现这个片子集成完整的CAN控制器与CAN收发器,我只用了CAN控制器,外挂了一个CAN收发器,太浪费了。
详细研究发现MCP2510 MCP2525 MCP25625内部寄存器一模一样,我说我的代码里面一会2515 一会25625呢
发现一个知识点,MCP2515 MCP2510 MCP25625这几个芯片应该是有相似之处的,我手里的MCP25625驱动里面用的都是MCP2510的寄存器定义,但函数名双叫MCP2515(),经过我详细观察这几个片子的手册,发现这3种版本寄存器定义是一样的, MCP2515是MCP2510的升级版本,MCP25625在我看来就是MCP2515上集成了一个can收发器,但是我没有找到官方的确认。