STM32内建已经有CANBus了~这篇主要是练习SPI并透过MCP2515去实现CanBus通讯!
先来介绍一下MCP2515模组,他已经将MCP2515与TJA1050整合起来了,可以直接透过SPI去做驱动!
接下来我们来先看一下这块模组的DataSheet看看到底要如何使用它来实现CANBus通讯!
这一段提到在发送之前至少需要将TxBnSIDH、TxBnSIDL、TxBnDLC写入对应位元,假设有资料要发送则需要将TxBnDm填入要发送的资料,同时将TXBnSIDL.EXIDE设为1。
下方的Note则提到发送之前需要将TXBnCTRL.TXREQ设为0(代表目前没有正在等待发送的资料)
接下来看看有关於传送到底有那些暂存器吧~
再MCP2515当中有两个接收Buffer,分别是RXB0跟RXB1会优先使用RXB0来做接收。
上方图片为手册当中说明如何接收,当接收到资料时会将CANINTF.RXnIF位设置为1,代表着接收到讯息并触发中断,这部分必须要由MCU再次将它设置为0才可以接收下一笔讯息。
接着同样来看看与接收相关的暂存器有哪些吧!
前一篇文有提到CANBus在接收讯息时会需要验证ID、Mask与Filter来确定资料是否接收。
在MCP2515当中同样需要去做设定~建议在做测试时将Mask通通设定为0即可!
Mask Bit n | Filter Bit n | Message Identifier Bit | Accept or Reject Bit n |
---|---|---|---|
0 | x (任意值) | x (任意值) | Accept |
1 | 0 | 0 | Accept |
1 | 0 | 1 | Reject |
1 | 1 | 0 | Reject |
1 | 1 | 1 | Accept |
CANBus当中所有节点都必须以相同的Nominal Bit rate进行通讯,但不是所有的节点设备都具有相同的系统时钟频率,所以需要去Prescaler去对单位时间(TQ)做调整已达到相同的Nominal Bit rate。
PropSeg : 补偿节点间的物理传输延迟时间,可设定1-8TQ
PS1与PS2 : 补偿Bus上的边缘相位误差,其中PS1可设定1-8TQ PS2可设置2-8TQ
BRP : Bit rate 预分频器
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
有五种工作模式分别为设置、正常、休眠、监听、环回
当需要对ID Mask Filter做设置时,一定要进入设置模式才可以做修改,修改完毕後需要退出设置模式。手边有两组设备的话可以透过正常模式去做测试与接收,只有一组可以利用环回模式进行测试。
这边介绍几个较常使用的SPI指令,其余可以参考手册当中说明。
这一篇主要介绍MCP2515 如何去做使用以及详细的设置说明,下一篇会介绍如何撰写MCP2515的程序码~
以上参考资料来源 : MCP2515 DataSheet
此篇会着重在 Bootstrap 5 响应式的介绍以及使用方法。 RWD 响应式网页设计 (Res...
还记得第2天在做专案规划时,有提到一个目标「加密敏感资料实现资安管理」吗? 目前我们的密码还是一样...
第十九天 各位点进来的朋友,你们好阿 小的不才只能做这个系列的文章,但还是希望分享给点进来的朋友,知...
今天一样是语法糖的练习,而且我想把日期塞进去 (感谢 sololearn 的 David Carro...
在开始之前 前言 其实本来是没想到要写这篇的,毕竟平常生活跟工作已经够忙碌QQ 由於目前主要研究的是...