STM32内建已经有CANBus了~这篇主要是练习SPI并透过MCP2515去实现CanBus通讯!
先来介绍一下MCP2515模组,他已经将MCP2515与TJA1050整合起来了,可以直接透过SPI去做驱动!
接下来我们来先看一下这块模组的DataSheet看看到底要如何使用它来实现CANBus通讯!
传送
这一段提到在发送之前至少需要将TxBnSIDH、TxBnSIDL、TxBnDLC写入对应位元,假设有资料要发送则需要将TxBnDm填入要发送的资料,同时将TXBnSIDL.EXIDE设为1。
下方的Note则提到发送之前需要将TXBnCTRL.TXREQ设为0(代表目前没有正在等待发送的资料)
接下来看看有关于传送到底有那些暂存器吧~
TXBnCTRL :发送缓冲器n控制暂存器,MCP2515具有3个发送缓冲器(TxB0-TxB2),主要设置优先权与触发传送。可以看到当中bit3为TXREQ再传送时须将此位设1,并在发送后会自动清0。






接收
再MCP2515当中有两个接收Buffer,分别是RXB0跟RXB1会优先使用RXB0来做接收。
上方图片为手册当中说明如何接收,当接收到资料时会将CANINTF.RXnIF位设置为1,代表着接收到讯息并触发中断,这部分必须要由MCU再次将它设置为0才可以接收下一笔讯息。
接着同样来看看与接收相关的暂存器有哪些吧!
RXB0CTRL : 接收缓冲控制暂存器,用来设定接收讯息的条件与是否可接受滚存。(滚存为当RXB0已存在讯息时,下一条讯息不管条件为何皆由RXB1先接收)






Mask 与 Filter设置
前一篇文有提到CANBus在接收讯息时会需要验证ID、Mask与Filter来确定资料是否接收。
在MCP2515当中同样需要去做设定~建议在做测试时将Mask通通设定为0即可!
Filter相关暂存器
RXFnSIDH/RXFnSIDL/RXFnEID8/RXFnEID0 : 同样依照是选择标準格式还是扩展格式来选填,标準格式只需填入RXFnSIDH/RXFnSIDL扩展格式则须写入4个暂存器。



Mask相关暂存器
RXMnSIDH/RXMnSIDL/RXMnEID8/RXMnEID0 : 与上方Filter设定方式相同,建议在Mask当中填入0去做测试,方便接收所有ID讯息。



BIT TIMING
CANBus当中所有节点都必须以相同的Nominal Bit rate进行通讯,但不是所有的节点设备都具有相同的系统时钟频率,所以需要去Prescaler去对单位时间(TQ)做调整已达到相同的Nominal Bit rate。
PropSeg : 补偿节点间的物理传输延迟时间,可设定1-8TQ
PS1与PS2 : 补偿Bus上的边缘相位误差,其中PS1可设定1-8TQ PS2可设置2-8TQ
如何计算TQ
BRP : Bit rate 预分频器
同步
硬同步 : Bus在空闲状态时发生1→0的跳变边沿状况时进行应同步再同步 : 可能会导致PS1延长orPS2缩短,由SJW(同步跳转宽度)决定,会有以下三种情况(PS1 = PS1+SJW PS2 = PS2-SJW),SJW可设定1-4TQ不发生再同步 : 当Input Single 发生跳变(1→0)在同步区段当中(SyncSeg),则无相位误差无须调整。


设置时间段时应注意
PropSeg + PS1 ≥ PS2PropSeg + PS2 ≥TdelayPS2>SJW相关暂存器设置
CNF1 : bit6-7为同步跳转宽度(SJW),通常设置为1-2TQ bit5-0则为预分频係数设置。


EX : 假如FOSC = 16M BRP=7 且希望得到BRT为125kbps
1.可以得知tbit = 1/125kpbs = 8us(SyncSeg + PropSeg + PS1 +PS2 = 8TQ)
2.TQ = 2 * (7+1) / 16M = 1us (这时则会在CNF1中填入0x07)
接着CNF2当中的bit 7 (BTLMODE)选择1,也就是由CNF3去决定PS2长度
3.SyncSeg固定为1TQ 而PropSeg也选择 1TQ,这时已有2TQ则代表PS1与PS2共为6TQ,希望採样点落在大约60~90%之间,可以选择PS1为3 or 4TQ。
假设为3则是(1+1+3)/8TQ=62.5% ; 4则为(1+1+4)/8TQ = 75%。
4.若选择PS1 = 3TQ则CNF2应该填入0x90
5.根据上方Sync = 1 Prop = 1 PS1 = 3,所以PS2 = 3。这时CNF3可以填入0x02
中断
CANINTE 中断致能暂存器 : 可以选择开启哪一类型中断,0位禁止1为开启。在测试时我们会使用RXB0去做接收,可以开启RXB0接收中断。

工作模式
有五种工作模式分别为设置、正常、休眠、监听、环回
当需要对ID Mask Filter做设置时,一定要进入设置模式才可以做修改,修改完毕后需要退出设置模式。手边有两组设备的话可以透过正常模式去做测试与接收,只有一组可以利用环回模式进行测试。
CANCTRL : CAN控制暂存器用来设置工作模式

SPI 指令
这边介绍几个较常使用的SPI指令,其余可以参考手册当中说明。



这一篇主要介绍MCP2515 如何去做使用以及详细的设置说明,下一篇会介绍如何撰写MCP2515的程式码~
以上参考资料来源 : MCP2515 DataSheet