单片机学习小组
直播中

听风说梦

9年用户 893经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注

MCP2515协议控制器与MCU的连接是如何实现的

MCP2515是什么?

MCP2515协议控制器有何功能?
MCP2515协议控制器与MCU的连接是如何实现的?

回帖(1)

张晶

2022-2-11 14:52:06
1  简介
MCP2515 是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。MCP2515 自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCP2515与MCU 的连接是通过业界标准串行外设接口(SearialPeripheral Interface,SPI)来实现的。
2 数据发送:
>>器件有三个引脚----TX0RTS/TX1RTS/TX2RTS用来启动将装载在三个发送缓冲器之一中的报文立即发送出去。是否使用这些引脚由用户决定;若不使用,也可利用控制寄存器(通过SPI接口访问)来启动报文发送---------三个RTS引脚可以不用
>>报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过SPI接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作------常用SPI启动发送
---正常情况下,如果 CAN 报文仲裁失败或被错误帧损坏,报文会尝试次发送
3 数据接收:
>>器件上有一个多用途中断引脚及各接收缓冲器专用中断引脚,用于指示有效报文是否被接收并载入接收缓冲器。可选择使用专用中断引脚。通用中断引脚和状态寄存器(通过SPI接口访问)也可用来确定何时接收了有效报文------为了减少引脚的使用,先使用通用中断引脚检测中断的发生,再通过读状态寄存器判断是何种类型的中断。
>>通过读取相应的寄存器可以检查通讯状态和错误。会对在CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
4  CAN报文帧
(1)标准数据帧
CAN标准数据帧与其他所有帧一样,帧以起始帧 (SOF)位开始,SOF 为显性状态,允许所有节点的硬同步。
SOF之后是仲裁字段, 由12个位组成, 分别为11个标识位和一个远程发送请求(Remote TransmissionRequest, RTR)位。RTR 位用于区分报文是数据帧
(RTR 位为显性状态)还是远程帧 (RTR 位为隐性状态)。
仲裁字段之后是控制字段,由6个位组成。控制字段的第一位为标识扩展(Identifier Extension,IDE)位,该位应是显性状态来指定标准帧。标识扩展位的下一位为零保留位(RB0) ,CAN 协议将其定义为显性位。控制字段的其余 4位为数据长度(Data Length Code,DLC),用来指定报文中包含的数据字节数 (0 到 8 字节) 。
控制字段之后为数据字段,包含要发送的任何数据字节。数据字段长度由上述 DLC 定义 (0到 8 字节)。
数据字段之后为循环冗余校验(CRC)字段,用来检测报文传输错误。CRC字段包含一个15位的CRC序列,之后是隐性的 CRC定界位。
最后一个字段是确认字段(ACK),由2 个位组成。在确认时隙(ACK Slot)位执行期间,发送节点发出一个隐性位。任何收到无错误帧的节点会发回一个显性位(无论该节点是否配置为接受该报文与否)来确认帧收到无误。确认字段以隐性确认定界符结束,该定界符可能不允许被改写为显性位。
最后是帧结尾-------每一个数据帧和远程帧均由一标志序列界定。这个标志序列由 7 个“隐性”位组成。
>>数据帧由 7 个不同的位场组成。
(2)扩展数据帧
在扩展 CAN数据帧中(如图 2-2 所示),紧随SOF位的是 32 位的仲裁字段。仲裁字段的前 11 位为 29 位标识符的最高有效位(Most Significant bit,MSb) (基本lD)。紧随这 11 位的是替代远程请求(SubstituteRemote Request,SRR)位,定义为隐性状态。SRR位之后是 IDE 位,该位为隐性状态时表示这是扩展的CAN帧。
应该注意的是, 如果发送完扩展帧标识符的前11位后,总线仲裁无果,而此时其中一个等待仲裁的节点发出标准CAN数据帧(11 位标识符),那么,由于节点发出了显性 lDE 位而使标准 CAN 帧赢得总线仲裁。另外,扩展 CAN 帧的SRR位应为隐性,以允许正在发送标准CAN 远程帧的节点发出显性 RTR 位。
SRR和lDE位之后是标识符的其余18位(扩展lD) 及一个远程发送请求位。
为使标准帧和扩展帧都能在共享网络上发送,应将29位扩展报文标识符拆成高11 位和低 18 位两部分。拆分后可确保lDE位在标准数据帧和扩展数据帧中的位置保持一致。
仲裁字段之后是6位控制字段。控制字段前两位为保留位,必须定义为显性位---与标准数据帧相同。其余4 位为DLC,用来指定报文中包含的数据字节数。
扩展数据帧的其他部分 (数据字段、CRC 字段、确认字段、帧结尾和间断)与标准数据帧的结构相同
(3)远程帧----请求数据
通常,数据传输是由数据源节点(例如,传感器发出数据帧)自主完成的。但也可能存在目标节点向源节点请求发送数据的情况。要做到这一点,目标节点需发送一个远程帧,其中的标识符应与所需数据帧的标识符相匹配。随后,相应的数据源节点会发送一个数据帧以响应远程帧请求。
远程帧与数据帧存在两点不同
1)远程帧的 RTR 位为隐性状态;
2)远程帧没有数据字段。
当带有相同标识符的数据帧和远程帧同时发出时,数据帧将赢得仲裁,因为其标识符后面的 RTR 位为显性。这样,可使发送远程帧的节点立即收到所需数据。
>>远程帧由6个不同的位场组成---没有数据帧
帧起始、仲裁场、控制场、CRC 场、应答场、帧末尾。
(4)错误帧
>>由两个位场组成。第一个场用作为不同站提供的错误标志(ERROR FLAG)的叠加。第二个场是错误界定符(含 8 个隐性位)
>>有两种形式的错误标志,主动错误标志(Active error flag)和被动错误标志(Passive error flag)。主动错误标志由 6个连续的“显性”位组成。被动错误标志由6个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。
(5)过载帧:
过载帧包括两个位场:过载标志和过载界定符。
有两种过载条件都会导致过载标志的传送:
1.  接收器的内部条件(此接收器对于下一数据帧或远程帧需要有一延时)。
2.  间歇场期间检测到一“显性”位。
由过载条件 1 而引发的过载帧只允许起始于所期望的间歇场的第一个位时间开始。而由过载条件 2 引发的过载帧应起始于所检测到“显性”位之后的位。通常为了延时下一个数据帧或远程帧,两个过载帧都会产生。
>>过载标志由6个显性位组成--------------所有形式和主动错误标志的一样
>>过载界定符包括8个隐性位----过载界定符的形式和错误界定符的形式一样
(6)帧间间隔
帧间间隔将前一条帧(无论何种类型)与其后的数据帧或远程帧间隔开。帧间间隔至少3 个隐性位构成,又称为间断。间断使节点在发送下一条报文之前有时间进行内部处理。在间断之后,CAN 总线将保持隐性状态--总线空闲,直至下一条报文开始发送。
5  位定时与波特率
CAN总线上的所有节点都必须具有相同的标称比特率
CAN协议采用不归零(Non Return to Zero,NRZ)编码方式,在数据流中不对时钟信号进行编码。因此,接收时钟信号必须由接收节点恢复并与发送器的时钟同步
由于不同节点的振荡器频率和传输时间不同,接收器应具有某种能与数据传输边沿同步的锁相环(Phase LockLoop,PLL)来同步时钟并保持这种同步。鉴于数据采用 NRZ 编码,有必要进行位填充以确保至少每 6 位时间发生一次边沿,使数字锁相环(Digital Phase LockLoop,DPLL)同步。
波特率
CAN 总线上的所有器件都必须使用相同的比特率。然而,并非所有器件都要求具有相同的主振荡器时钟频率。对于采用不同时钟频率的器件,应通过适当设置波
特率预分频比以及每一时间段中的时间份额的数量来对比特率进行调整。
求波特率过程:配置CNF1得到TQà配置CNF2/3得到tbità求倒数得到波特率
位时间
CAN位时间由互不重叠的时间段组成。 每个时间段又由时间份额(TQ)组成,在 CAN 规范中,标称比特率 (NominalBit Rate,NBR)定义为在不需要再同步的情况下,理想发送器每秒发送的位数。
标称比特率NBR----
标称位时间NBT----
TQ时间份额:TQ = 2 x (BRP + 1)/FOSC
位时间各段如下:(与NBT四段对应)

其中同步段固定为1TQ,其他三段为可编程的。
------------------------
6  电气特性
显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN 总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

CAN技术标准
CAN协议经过ISO标准化后有两个标准: ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
7  工作模式
>>利用CANCTRL. REQOP位可进行工作模式的选择
>>改变工作模式时,新的工作模式须等到所有当前报文发送完毕之后才生效
>>必须通过读取CANSTAT.OPMODE位来验证新的工作模式。
(1)配置模式:
MCP2515 在正常运行之前必须进行初始化。只有在配置模式下,才能对器件进行初始化。在上电或复位时,器件会自动进入配置模式, CANTRL.REQOP<2:0>位设置成“100”也可使器件从任何模式进入配置模式。
(2)休眠模式:
MCP2515 具有内部休眠模式,使器件功耗最少。即使MCP2515处于休眠模式,SPI接口仍然保持正常的读操作,以允许访问器件内的所有寄存器。
(3)仅监听模式:
仅监听模式使MCP2515 可以接收包括错误报文在内的所有报文。这种模式可用于总线监视应用或热插拔状况下的波特率检测。
(4)环回模式:
环回模式允许器件内部的发送缓冲器和接收缓冲器之间进行报文的自发自收,而无需通过 CAN 总线。此模式可用于系统开发和测试。
(5)正常模式:
该模式为 MCP2515 的标准工作模式。器件处于此模式下,会主动监视总线上的所有报文,并产生确认位和错误帧等。只有在正常模式下,MCP2515才能在 CAN总线上进行报文的传输。
8  SPI指令集
---------通过SPI接口直接写指令即可,比如通过指令复位


--------只有一种模式(即相当于STM32中的屏蔽位模式)。
--------过滤器与屏蔽器是配合使用的,不是单独使用的。
--------缓冲器+过滤器+屏蔽器à报文ID必须至少与一个过滤器匹配,即与过滤器中一些位(对应屏蔽器中为1的位)完全相同。
--------两个组合:
组合一:缓冲器1+屏蔽器1+过滤器1/2。
组合二:缓冲器2+屏蔽器2+过滤器3/4/5/6。
--------过滤器与缓冲器都是4Bytes,分别是SIDH/SIDL/EID8/EID0
10  中断
MCP2515有八个中断源CANINTE寄存器包含了使能各中断源的中断使能位。 CANINTF 寄存器包含了各中断源的中断标志位。当发生中断时, INT 引脚将被
MCP2515拉为低电平, 并保持低电平状态直至MCU清除中断。中断只有在引起相应中断的条件消失后,才会被清除。
建议在对 CANINTF 寄存器中的标志位进行复位操作时,采用位修改命令而不要使用一般的写操作。这是为了避免在写命令执行过程中无意间修改了标志位,进而导致中断丢失。应该注意的是,CANINTF中的中断标志位是可读写位,因此在相关 CANINTE 中断使能位置 1 的前提下,对上述任一位置 1均可使 MCU产生中断请求。
----CANINTE使能CANINTF标志都是8位,并且各位是一一对应的。
11  寄存器简介




  • BFPCTRL---RXnBF引脚控制寄存器和状态寄存器---对应接收中断引脚;
TXRTSCTRL---TXnRTS引脚控制状态寄存器---对应发送请求引脚。
(2)CANSTAT/CTRL----CAN状态和控制寄存器。
(3)CANINTF/INTE----CAN中断标志和使能寄存器。
(4)REC---接收错误计数器;TEC---发送错误计数器;EFLG---错误标志寄存器。
REC---receive error counter;EFLG---error flag。
(5)CNF1/2/3----配置寄存器----用于位定时/波特率配置。
(6)TXBnCTRL----发送缓冲器n控制寄存器。
(7)RXBnCTRL----接收缓冲器n控制寄存器。
12  MCP2515的SPI详解

  • 模式:MCP2515 设计可与许多单片机的串行外设接口(SPI)直接相连,支持 0,0 和 1,1 运行模式。外部数据和命令通过 SI引脚传送到器件中,且数据在 SCK时钟信号的上升沿传送进去。MCP2515 在SCK的下降沿通过 SO引脚传送出去。在进行任何操作时, CS 引脚都必须保持为低电平。
  • CS:CS 引脚被设置为低电平后,MCP2515希望收到的第一个字节是指令/命令字节。这意味着CS引脚必须先拉升为高电平然后再降为低电平以调用另外一个命令----有待验证(时序图与此不一致)。
注意:此处经过验证发现时序图是正确的文字描述不正确(可能是翻译的缘故),
结论
  一、看中文翻译的datasheet,以时序图为准,因为时序图是复制而来的。
二、查看P65的时序图可知---各个指令大多包含多个指令数据的读写,在整个读写过程中CS一直保持为低,直到完成整个指令CS才能变为1。

  • 指令详解
>>复位指令:复位指令为单字节指令。应先将CS引脚0选中器件,随后发送命令字节,发送完毕之后再将CS引脚置1。强烈建议将发送复位指令(或将RESET 引脚置为低电平)作为器件上电初始化过程中的一部分。
>>读指令
CS引脚置为低电平来启动读指令。随后向MCP2515依次发送读指令和 8 位地址码 (A7 至 A0)。在接收到读指令和地址码之后, MCP2515 会将指定地址寄存器中的数据通过 SO引脚移出。
每一数据字节移出后,器件内部的地址指针将自动加一以指向下一个地址。因此,通过持续提供时钟脉冲,可以对下一个连续地址寄存器进行读操作。通过该方法可以顺序读取任意个连续地址寄存器中的数据。通过拉高CS引脚电平可以结束读操作。
>> RX 缓冲器指令
相比于读指令----读 RX缓冲器指令可以快速寻址要读取的接收缓冲器。该指令使 SPI开销减少了一个字节(地址字节)。
---指令码为10010nm0ànm对应两个接收缓冲器---每个缓冲器对应一帧数据----一帧数据包含标准ID/扩展ID/DLC/数据(1-8Bytes)
>>写指令
将CS引脚置为低电平来启动写操作。随后向MCP2515依次发送写指令、地址码和至少一个字节的数据(如果是多个数据,其地址是连续的)。
>>装载TX缓冲器指令
该指令取消了一般写命令所需要的8 位地址。该8位指令将地址指针设置为6个地址之一,以便快速地将数据写入发送缓冲器,该地址指向3个发送缓冲器之一的“ID”或 “数据”地址---每个缓冲器对应一帧数据----一帧数据包含标准ID/扩展ID/DLC/数据(1-8Bytes)。。
>>请求发送RTS)指令:
使用RTS命令可以启动一个或多个发送缓冲器的报文发送。将CS引脚置为低电平来选中MCP2515。 之后向其发送RTS命令字节。该命令的后3位显示了哪些发送缓冲器被使能发送。该命令将缓冲器对应的TxBnCTRL.TXREQ 位置1。用一条RTS命令即可对这三位中的一位或全部三位置1。如果发送的RTS命令中nnn =000,将忽略该命令----三个n对应三个发送发送缓冲器
>>读状态指令
读状态指令允许单条指令访问常用的报文接收和发送状态位
>>RX状态指令
RX 状态指令用于快速确定与报文和报文类型(标准帧、扩展帧或远程帧)相匹配的滤波器。命令字节发送后,控制器会返回包含状态信息的 8 位数据。
>>位修改指令
位修改指令可对特定状态和控制寄存器中单独的位进行置1或清零。该命令并非所有寄存器有效。向 MCP2515发送位修改命令字节。命令字节发送后,依次发送寄存器地址、屏蔽字节以及数据字节。屏蔽字节确定允许修改寄存器中的哪一位。屏蔽字节中的1”表示允许对寄存器中的相应位进行修改;而0”禁止修改。
13  初始化详解

  • 复位:
MCP2515 有两种复位方式
1)硬件复位——RESET引脚为低电平。
2)SPI复位——通过 SPI命令复位---毕业设计采用指令复位

  • 进入配置模式---初始化配置
1)在上电或复位时,器件会自动进入配置模式, 或通过CANTRL.REQOP
设置成“100”也可使器件从任何模式进入配置模式。
2) 改变工作模式时,新的工作模式须等到所有当前报文发送完毕之后才生效。 必须通过读取CANSTAT.OPMODE位来验证新的工作模式。
3) 进入配置模式时,所有错误计数器都被清零只有在配置模式下,才能对以下寄存器进行修改:
• CNF1、 CNF2 和CNF3
• TXRTSCTRL
• 验收过滤寄存器
• 验收屏蔽寄存器

  • 配置波特率
---具体看位定时和波特率的详解。

  • 配置发送


  • TXnRTS引脚配置----配置用来禁用三个发送请求引脚。
其余的配置不需要在初始化时配置---发送时再配置也行
2) TXBnCTRL---配置报文发送请求优先级
3)标准ID和扩展ID配置---4个寄存器。
4)TXBnDLC----报文类型(数据帧或请求帧)和数据长度(DLC)配置。
5)发送缓冲器数据字节----(08个字节)。

  • 配置接收
---配置RXB0CTRL——接收缓冲器 0/1控制寄存器;
---配置BFPCTRL——RXnBF引脚控制寄存器和状态寄存器;
---配置报文验收滤波器(RXFn)及屏蔽寄存器(RXMn)---见上面详解。

  • 配置中断
---CANINTF---中断标志位初始化时清零
---CANINTE---使能位(最常用的为使能接收中断)。

  • 配置模式
---正常模式-------收发用;
---回环模式-------测试用;
14  MCP2515发送函数详解
---至少须将 TXBnSIDH、TXBnSIDL和 TXBnDLC 寄存器装载数据---包含ID、数据长度(字节数)和帧类型
---如果报文包含数据字节,还需要对 TXBnDm寄存器进行装载。
---若报文采用扩展标识符,对TXB-nEIDm寄存器进行装载,并将TXBnSIDL.EXIDE 位置1。
---在报文发送之前,MCU应对 CANINTE.TXInE位进行初始化,以便在报文发送时使能或禁止中断的产生。
15  MCP2515接收函数详解
---RXBnDLC---判断接收到的数据的字节数帧类型
---接收信息包含ID/扩展ID、帧类型、长度DLC和数据。
---RXB0CTRL---在初始化时进行配置即可。
16  MCP2515中断函数详解
---使能外中断
---使能CAN中断(MCP2515有八个中断源)。
---初始化时对中断标志位清零
---ISR中读中断标志判断中断源,然后进行相应的操作。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分