了解SPI总线CAN控制器 MCP2515配置 一文即可

 1.引言

最近工作中遇到需要6路CAN通信的情况,单片机自带的4路已不满足实际需求,故采用了SPI总线的CAN控制器芯片MCP2515,通过SPI通信的CAN扩展芯片最高可实现1Mbps的遵循CAN 2.0B的协议通信,配置起来也比较繁琐,故写诞生了这篇文章。本篇中仅对基础功能进行测试,如有疑问可留言交流或自行查看芯片手册。

   2.硬件连接

由于该芯片主要起到SPI转CAN控制器的效果,还需搭配CAN收发器才能进行正常的CAN通信,这里采用的是一款国产芯片,川土微电子公司的IF1042VS,也可选用其他收发器,保证畅通即可。

 3.芯片详情

3.1 SPI接口

MCP2515支持最高10MHz的SPI通信,可直接与微控制器上的SPI外设连接,并支持模式0模式3,遵从SPI协议,可通过CS引脚片选的下拉开启通信;同时应注意,在传输另一个指令前应将片选置高后再拉低。

3.2 工作模式

MCP2515有5种工作模式,可通过CANCTRL寄存器的REQOP设置所需模式,要注意直到所有挂起的消息传输完成后,模式才会实际更改。通过CANSTAT寄存器的OPMODE可读取当前模式,建议在模式更改后再读取一下CANSTAT寄存器,以保证写入成功并进入预定模式。

1)配置模式:芯片在激活前必须首先进行初始化。上电、使用RESET引脚,或更改CANCTRL寄存器的REQOP<2.0>等均可进入配置模式,以下寄存器只有在配置模式下才能被更改。

标号 名称 功能
1 CNF1, CNF2, CNF3 波特率配置
2 TXRTSCTRL 发送引脚配置
3 Filter registers 过滤器配置
4 Mask registers 掩码配置

2)睡眠模式:MCP2515具有内部睡眠模式,用于最大限度地减少设备的当前消耗。即使MCP2515处于睡眠模式,SPI接口也会保持活动状态以便读取。更改CANCTRL寄存器可进入睡眠模式,在写入寄存器后应进行读取,以确保芯片进入睡眠模式。

>>睡眠唤醒:睡眠模式下,可通过CAN总线唤醒或通过SPI切换模式。通常情况下,CAN总线唤醒为常见用法,需要配置CANINTE寄存器开启唤醒中断,当接收到RXCAN引脚上的电平变化,导致从睡眠模式唤醒的报文及在唤醒中接收到的报文将被忽略,同时芯片被唤醒,INT引脚能捕捉到下降沿跳变,MCP2515会自动进入仅监听模式,此时应手动设置芯片为正常模式。

3)仅监听模式:仅监听模式使MCP2515 可以接收包括错误报文在内的所有报文。这种模式可用于总线监视应用或热插拔状况下的波特率检测。

4)环回模式:环回模式允许器件内部的发送缓冲器和接收缓冲器之间进行报文的自发自收,而无需通过 CAN 总线。此模式可用于系统开发和测试。

5)正常模式:该模式为 MCP2515 的标准工作模式。器件处于此模式下,会主动监视总线上的所有报文,并产生确认位和错误帧等。只有在正常模式下,MCP2515才能在 CAN总线上进行报文的传输。

3.3 操作指令

在MCP2515中,SPI发送的首个字节即为操作指令,下图为操作指令集。

1)复位指令:重置寄存器初始化,使得芯片进入配置模式;建议在初始化的第一步执行本指令

2)读指令:将CS引脚拉低后,向MCP2515依次发送读指令和 8 位地址码, MCP2515 会将指定地址寄存器中的数据通过 SO引脚移出。每一数据字节移出后,器件内部的地址指针将自动加一以指向下一个地址。因此,通过持续提供时钟脉冲,可以对下一个连续地址寄存器进行读操作。通过该方法可以顺序读取任意个连续地址寄存器中的数据。通过拉高CS引脚电平可以结束读操作。

 3)读接收缓冲区指令:读取接收信息的常用指令,与读指令相比,省略了一个字节的地址位,同时会在CS引脚拉高后自动清零接收标志位(CANINTF.RXnIF),不用手动执行清零指令,强烈建议在读取接收缓冲区数据时使用本指令

 4)写指令:将CS引脚拉低后,向MCP2515依次发送写指令、地址码和至少一个字节的数据(如果是多个数据,其地址是连续的)。

 5)装载发送缓冲区指令:和读取接收缓冲区类似,该指令也省略了一个字节的地址位,可以更快速的写入发送帧的标志ID、拓展ID、DLC和数据帧,同样强烈建议使用该指令装载发送帧

 6)请求发送指令:使用RTS命令可以启动一个或多个发送缓冲器的报文发送,该命令的bit3-bit0显示了哪些发送缓冲器被使能发送,该命令会将缓冲器对应的TxBnCTRL.TXREQ 位置1;如果发送的RTS命令中nnn =000,将忽略该命令。

7)位操作指令:该指令允许对寄存器的指定位进行置“1”或清零操作,在片选拉低后,以此发送位操作指令、寄存器地址、掩码和数据码,其中掩码位为“1”的允许进行更改,“0”则不允许更改;对于允许更改的位,数据码即为寄存器将被修改的目标码。举例如下:

 >>注意:并非所有寄存器均支持位操作指令,只有标灰色的寄存器可进行位操作。

 8)读状态指令:读状态指令允许单条指令访问常用的报文接收和发送状态位

9)RX状态指令:RX 状态指令用于快速确定与报文和报文类型(标准帧、扩展帧或远程帧)相匹配的过滤器。命令字节发送后,控制器会返回包含状态信息的 8 位数据。

3.4 错误检测

 MCP2515遵循了了CAN协议的错误检测机制,以下将分别展开:

1)CRC校验错误:使用循环冗余校验(CRC),发送器为从帧开始到数据字段结束的位序列计算特殊校验位。这个CRC序列在CRC字段中传输,接收节点也使用相同的公式计算CRC序列,并与接收到的序列进行比较。如果检测到不匹配,则发生CRC错误并生成错误帧,并重复发送。

2)ACK应答错误:在消息的ACK字段中,发送器检查其中是否包含显性位。如果没有,则认为没有其他节点正确接收到该帧。已发生确认错误,将生成错误帧,并重复发送。

3)格式错误:如果节点在四个段,包括帧结束、帧间空间、确认分隔符或CRC分隔符中的一个段检测到主导位,则发生格式错误并生成错误帧,并重复发送。

4)位错误:如果发送器检测到与其发送的相反的位电平(即,发送显性并检测到隐性,或发送隐性并检测到显性),则发生位错误。

>>例外情况:在仲裁字段和确认槽中,如果发送方发送隐性位,检测到显性位,则不会产生误码,因为正在进行正常仲裁。

5)填充错误:如果在帧开始和CRC分隔符之间检测到6个具有相同极性的连续位,则违反了位填充规则。发生一个填充错误并生成一个错误帧,并重复发送。

3.4.1 错误状态:

检测到的错误通过错误帧通知给所有其他节点,错误消息的传输被终止,报文帧被尽快重复。根据内部错误计数器的值,MCP2515包含两个错误计数器:接收错误计数器(REC)和发送错误计数器(TEC),这些计数器根据CAN总线规范递增/递减。每个CAN节点处于三种错误状态中的一种:

1. Error-active:节点可以不受任何限制地传输消息和活动错误帧(由主导位组成)的通常状态

    如果两个错误计数器都低于128,则MCP2515为Error-active

2. Error-passive:可以传输消息和被动错误帧(由隐性位组成)

    如果至少有一个错误计数器等于或超过128,则为Error-passive

3. Bus-off(发送方):消息既不能接收也不能发送

    如果TEC超过255的总线关闭限制,它将进入总线关闭。设备保持这种状态,直到接收到        总线断开恢复序列。总线断开恢复序列由128个连续的11位隐性位组成

MCP2515的当前错误模式可以由MCU通过EFLG寄存器读取,此外,如果至少有一个错误计数器等于或超过错误警告限制96,则设置错误状态警告标志位(EFLG:EWARN)。如果两个错误计数器都小于错误警告限制,则复位EWARN。

4.初始化配置

4.1 复位

MCP2515上电时自动复位,但手册中建议在初始化之前进行复位操作,可通过两种方法进行复位:1)硬件复位拉低RESET引脚;2)软件复位:执行SPI复位指令

博主这里复位后分别读取了CANCTRL和 CANSTAT寄存器,在复位并进入配置模式时,CANCTRL为0x87,CANSTAT为0x80。两个寄存器的位定义如下:

 4.2 波特率设置

 CAN在通信时,总线上的波特率必须保持一致,MCP2515使用数字锁相环DPLL,将每个位时间分解成由最小时间周期组成的多个段,这个最小时间周期称为时间量(TQ),改变CNF1、CNF2、CNF3寄存器,可以达到设定波特率的目的,其中Normal Bit Rate为通用比特率,以下简称NBR。

NBR = f_{bit} = \frac{1\frac{}{}}{t_{bit}}

t_{bit} = t_{SyncSeg} + t_{PropSeg} + t_{PS1} + t_{PS2}

t_{SyncSeg} = 1T_{Q}t_{PropSeg} =1-8T_{Q}t_{PS1}=1-8T_{Q}t_{PS2}=2-8T_{Q}

T_{Q}=\frac{2(BPR+1)}{F_{OSC}}

且需要满足以下条件:

PropSeg + PS1 \geqslant PS2, PropSeg + PS1 \geqslant T_{DELAY}\left ( 1-2T_{Q} \right )

PS2>SJW

通过以上参数可知,结合电路中的晶振频率为8MHz,且位时间大于等于5个TQ,因此这里给出在500kbps下的波特率配置参数:SyncSeg = 1TQ,PropSeg = 2TQ,PS1 = 3TQ,PS2 = 2TQ,BPR = 0,SJW = 0。相关配置寄存器如下:

4.3 发送配置

 在MCP2515中,共有3个可配置优先级的发送缓冲区(注意次优先级是芯片内部发送的优先顺序,与CAN总线仲裁优先级应进行区分),在初始化时应至少配置所需缓冲区的发送优先级、CAN-ID和数据帧长度DLC,这里给出一种配置方式。

>>TXRTSCTRL :使能/失能TXnRTS引脚的下降沿发送请求

>>TXBnCTRL :配置发送缓冲区发送优先级

>>TXBnDLC:配置远程帧或数据帧及帧长度

>>使用装载缓冲区指令或通过TXBnSIDH、TXBnSIDL、TXBnEID8、TXBnEID0、                    TXBnDm寄存器写入写入CAN-ID、数据帧

>>翻转TXnRTS引脚或使用RTS请求发送指令

其中,n为0-2分别对应3个发送缓冲区,m为0-7分别对应8个字节的数据帧

 4.4 接收配置

在MCP2515中,有两个完整的接收缓冲区RXB0和RXB1,和一个独立的消息装载缓冲区MAB,在收到报文后首先会进入MAB,在满足过滤器条件后才允许进入RXB0或RXB1。

1)优先级及过滤器

RXB0是拥有更高优先级的接收缓冲区,具有一个掩码和两个过滤器;RXB1为较低优先级接收,具有一个掩码和四个过滤器。要启用RXB0的滤波器必须将RXB0CTRL.BUKT位置“1”,此时滤波器0-1对于RXB0是可用的;在RXB0CTRL.BUKT位置“1”的状态下,滤波器0-5对于RXB1是可用的,在RXB0CTRL.BUKT位置“0”的状态下,滤波器2-5对于RXB1是可用的,而RXB0无对应滤波器可供使用。

对于RXBnCTRL寄存器,还可设置RXM <1:0>位选择缓冲区接收的CAN-ID是否允许标准id和扩展id的通过,配合掩码和过滤器可进行更加详细的筛选。掩码和过滤器的真值表如下:

掩码位 过滤器位 报文ID位 接收或拒绝该位
0 X X 接收
1 0 0 接收
1 0 1 拒绝
1 1 0 拒绝
1 1 1 接收

2 )接收标志

当消息被移动到任何一个接收缓冲区时,相应的CANINTF.RXnIF位被置“1”。为了允许新的消息被接收到缓冲区,这个位必须被程序手动清除。这个位提供了一个正向的锁定,以确保在MCP2515尝试将一个新消息加载到接收缓冲区之前,咱们的微控制器已经完成了消息处理。

如果CANINTE.RXnIE位置“1”后,将在INT引脚上产生一个中断,以指示已接收到有效消息。此外,如果配置为接收缓冲区满引脚,相关的RXnBF引脚产生低电平,可以在单片机把连接RXnBF引脚的GPIO设置为下降沿触发的外部中断,在收到报文后,将数据帧转移到fifo中,再将标志位CANINTF.RXnIF位清零。

3)配置样例

综上所述,在实际工程中,接收缓冲区RXB0应具有过滤器功能,这里给出配置方式:

>>BFPCTRL:RXBn接收信息可通过 RXnBF 引脚的下降沿获取

>>RXBnCTRL:可接受满足过滤器的标准id和拓展id,BUKT置“1”允许RXB0使用过滤器0-1

>>配置掩码相关寄存器RXMnSIDH、RXMnSIDL、RXMnEID8、RXMnEID0

其中,n为0-1分别对应2个接收缓冲区的掩码,一一对应

>>配置过滤器相关寄存器RXFnSIDH、RXFnSIDL、RXFnEID8、RXFnEID0

其中,n为0-5分别对应6个过滤器

 4.5 中断配置

MCP2515有八个中断源,八个中断源分别为3个发送中断,2个接收中断,1个消息错误中断,1个总线活动中断,一个错误中断。CANINTE寄存器包含了使能各中断源的中断使能位。CANINTF寄存器包含了各中断源的中断标志位。当发生中断时, INT 引脚将被MCP2515拉为低电平, 并保持低电平状态直至MCU清除中断。注意:中断只有在引起相应中断的条件消失后,才会被清除。

在3.2工作模式内提到过睡眠模式和总线唤醒,需要将CANINTE.WAKIE初始化为1;接收中断开启后,可以代替RX0BF和RX1BF引脚,节省两个I/O资源;同时,为实时反馈CAN总线上的错误情况,需要将错误中断使能;实际使用中,可以配置INT引脚为外部中断,在触发后读取CANINTF寄存器查询当前中断源,再进行进一步处理。配置如下:

>>CANINTE:使能中断

>>CANINTF:清零中断标志

物联沃分享整理
物联沃-IOTWORD物联网 » 了解SPI总线CAN控制器 MCP2515配置 一文即可

发表评论