王超的小站
认证:VIP会员
所在专题目录 查看专题
MCU扩展CAN/CAN FD接口方案-MCP2518FD+ATA6563
MCU扩展CAN/CAN FD接口方案-MCU软件动手实验
作者动态 更多
PIC24 & dsPIC33 MCU Bootloader开发
2021-11-08 15:12
PIC16 & PIC18 MCU Bootloader开发
2021-11-08 15:00
Python开发环境搭建(for Bootloader)
2021-11-08 14:58
Python开发环境搭建 (for Control)
2021-01-27 18:43
MCU扩展CAN/CAN FD接口方案-MCU软件动手实验
2020-11-25 14:11

MCU扩展CAN/CAN FD接口方案-MCP2518FD+ATA6563

“本文介绍MCU通过SPI串口扩展CAN/CAN FD接口扩展方案,该方案基于MCP2518FD+ATA6563,可快速部署应用于实际项目。”

本文连载,欢迎读者关注(所有分享不丢失)、点赞、收藏、转发和评论!  

1. CAN FD和CAN 2.0的区别

      CAN FD解决了CAN总线上日益增长的带宽需求。相比于CAN2.0主要有2点增强:

  • 将数据位段增加到最多64数据字节(CAN 2.0最大为8个数据字节)。
  • 标称位和数据位使用不同的比特率,标称位的比特率和CAN2.0相同,数据位的比特率可达8Mbps。

      下图显示由于较高的数据比特率和每帧增加的数据字节而可能增加的有效比特率,该图使用的CAN FD为11位标识符标准帧,借此大家可直观的体会CAN FD如何增加CAN总线的带宽。

2. CAN FD在电源项目中的可能优势

      这里以CAN FD在三相逆变电源领域可能的应用场景为例,以往在用CAN 2.0做逆变器均流控制方案时,一般传递均流信息为Id、Iq和Iz 6个字节,这样一帧即可完成均流信息传递,不需拆包。但存在个弊端,那就是在不平衡负载时Id、Iq和Iz含有交流成分,并不能精确做不平衡负载的均流控制。那么在应用CAN FD后,可以在一帧中轻松传递每一相的有功和无功电流(IAp、IAq、IBp、IBq、ICp和ICq),这些信息都是直流量,因此方便做不平衡载的均流控制,此时一帧总共的数据字节也仅为12个,离CAN FD最多64个数据字节还有很大裕量,因此还可以继续增加字节传递其它辅助逻辑处理信息。同时因为应用了CAN FD,其有效比特率相比CAN 2.0大幅提高,那么带宽提高的好处便是同样的软件却可以实现更多模块的并机操作。所有这些丁点的优势汇聚到一起可能就是潜在的产品竞争力,况且现在主流MCU已经默认带CAN FD外设,并且您将CAN FD的外设当成CAN 2.0用也不成问题, 所以在当前的电源产品设计中可直接选择带CAN FD外设的MCU,如dsPIC33CK256MP506和dsPIC33CH512MP508等。

3. CAN/CAN FD接口扩展硬件实现

      万一不巧在您的项目中MCU没有CAN FD外设或CAN FD外设数量不够,那么此时用MCP2518FD来实现CAN FD功能是个不错的选择(MCP2518FD也支持CAN 2.0B,所以本文后续内容将CAN或CAN FD均简称为CAN),MCP2518FD是一个低成本小封装的CAN控制器,其通过SPI接口与MCU进行通信。在实际应用中,除了CAN控制器MCP2518FD,额外还需一颗CAN收发器和时钟振荡器。对于CAN收发器的选择可以参见下图,且所有收发器均满足车规标准,大家可以根据需要自由选择。对于时钟振荡器,可选择MEMS振荡器DSC60XXB系列,推荐选择40M振荡器。

      MIKROE公司提供的MCP2518FD CLICK板可用于快速评估该方案,其原理图如下。

      本文的实验验证基于如下开发套件,借助32bit Coretx-M0+ MCU ATSAMD21G17D通过SPI操作MCP2517FD实现MCU的CAN/CAN FD接口扩展。因我这里没有MCP2518FD Click板,只找到MCP2517FD的,但是MCP251xFD可共用驱动API程序,因此对于文章脉络没有影响,所以下文提及时仍说MCP2518FD。请大家参见如下Github链接获得例程源码,上面同时也有基本的软硬件说明及开发环境说明。

      ATSAMD21G17D和MCP2518FD的软硬件接口表如下。

      ATSAMD21G17D和ATA6563的软硬件接口表如下。

4. CAN/CAN FD接口扩展软件实现

      介绍完了硬件平台及软硬件接口情况,我们看下示例工程软件的代码结构示意图。其中“CAN FD Application”层为应用程序,包括MCP2518FD的初始化程序和测试程序,测试程序为自己先发一帧数据后通过外部环回模式接收该帧数据,因为我没有2个节点,所以通过外部环回模式完成测试。“DRV_CANFDSPI”层为MCP2518FD不局限于具体MCU的驱动层,这四个文件保持固定即可。“DRV_SPI”和“I/O PLIB”层为MCU硬件驱动层,直接驱动MCU SPI外设和IO。例程代码除了“CAN FD Application”和“DRV_CANFDSPI”层的共6个.c和.h文件外其他工程代码全部为MAPLAB X IDE的Harmony v3环境配置生成的。

4.1 MCP2518FD SPI通讯

      操作MCP2518FD的基础就是其与MCU要可靠通信,所以首先看下MCP2518FD对SPI的时序要求,SPI仅支持模式0和模式3,同时要求SPI时钟速率FSCK最高20MHz且FSCK 必须小于等于FSYSCLK/2。这里FSYSCLK可以设计为10、20和40MHz,但一般取40MHz。

      为了更好的理解SPI的模式0和模式3,进一步看下ATSAMD21G17D的Datasheet中对于SPI模式的说明,可以看出MCP2518FD选取的2种模式均是在上升沿实现对输入数据的采样,在下降沿实现对输出数据的改变。这2种模式的差别仅在空闲状态时时钟信号的状态,模式0空闲状态时时时钟信号SCK为低电平,而模式3空闲状态时时钟信号SCK为高电平。

      MCU操作MCP2518FD的SPI协议帧格式和相关指令含义如下图所示。

      在“DRV_CANFDSPI”层中的drv_canfdspi_api.c文件即描述了根据上述SPI协议帧格式实现的所有操作MCP2518FD的指令,如复位指令及相应的读写指令。例程中就是借助这些函数实现对SFR和RAM的访问。但需要注意的是SFR访问是面向字节的,可以使用一条指令读取或写入任意数量的数据字节。在每个数据字节后,地址自动递增1,地址从0x3FF计满返回至0x000,从0xFFF计满返回至0xE00。报文存储器(RAM)访问是面向字的(一次4个字节),可以使用一条指令读取或写入大小为4个数据字节任意倍数的数据。在每个数据字节后,地址自动递增1,地址从0xBFF计满返回至0x400。

      而支撑上述指令实现的底层驱动代码为“DRV_SPI”中plib_sercom1_spi_master.c中的如下函数。若您在其他MCU平台应用该方案,那么您需自己实现这个函数,以支撑drv_canfdspi_api.c中相关函数的实现。

4.2 MCP2518FD初始化代码分析

      初始化函数为CANFDSPI_Init(),涉及到的步骤如下:

1. 复位操作:所有SFR和状态机都会像上电复位期间一样复位,器件会立即转换为配置模式。

2. 使能ECC(ECC逻辑支持单个位错误纠正和双位错误检测),并将RAM空间初始化为初值0xFF。

3. 器件配置:使能CAN FD帧中的ISO CRC位,CRC字段中包含填充位计数,使用非零CRC初始化向量(符合ISO11898-1:2015规范);同时不将发送的报文保存到TEF中,也就不在RAM中预留TEF空间;发送队列TXQ不使能,同样也不在RAM中预留TXQ空间。同时需要注意的是TXQ相当于32个FIFO的FIFO0,是一个特殊的发送FIFO,它根据队列中存储的报文的ID发送报文,优先发送ID最小的报文。而其他31个FIFO,才是真正意义的FIFO,当配置为发送FIFO时,基于优先级位域采用先进先出的方式发送报文。

4. 发送FIFO配置:采用FIFO2作为发送FIFO,FIFO深度8个报文(最多32个报文),有效负载大小位64个数据字节,重发尝试次数不受限制,报文优先级配置为较低优先级1(0最低优先级,31最高优先级)。

5. 接收FIFO配置:采用FIFO1作为接收FIFO,FIFO深度16个报文(最多32个报文),有效负载大小位64个数据字节,不捕捉时间戳。

6. 接收滤波器设置:采用FILTER0作为接收滤波器(共32个接收滤波器可用),仅匹配带有标准标识符的报文,报文ID 0x300。

7. 接收屏蔽器设置:采用MASK0作为接收屏蔽器(共32个接收屏蔽器可用),仅匹配与过滤器中EXIDE位对应的报文类型,这里便是匹配标准标识符报文,且11位标识符的低3位被屏蔽,所以可以接收ID为0x300~0x307的报文。

8. 将接收滤波器与接收屏蔽器与接收FIFO绑定,则满足接收滤波器和接收屏蔽器规则的报文会在相应的FIFO接收。

9. 设置位时间,标称位比特率500Kbps,数据位比特率2Mbps。在数据阶段的传播延迟可能长于比特时间,此时将产生位错误,所以对于数据位采样不是在DTSEG1后采样,而是要加上延迟TDCV和TDCO在二次采样点采集。这里采用自动测量发送器延时的方式实现二次采样点采集数据位。对于不同比特率下如何合理设置波特率预分频比位BRP、时间段1 TSEG1、时间段2 TSEG2和同步跳转宽度SJW的值,在drv_canfdspi_api.c均已经实现了,大家可以直接参考。

10. 设置发送和接收中断:GPIO0配置为发送中断输出(低电平有效),当发送FIFO未满时GPIO0为低电平,可以往发送FIFO继续写入报文;GPIO1配置为接收中断输出(低电平有效),当接收FIFO非空时GPIO1为低电平,说明FIFO有接收到报文可以读取。

11. 将工作模式从配置模式切换到正常模式,若前期调试阶段只有一个CAN节点,则可以配置为外部环回模式先调试软件。

4.3 MCP2518FD发送和接收CAN报文代码分析

      报文发送和接收代码体现在CANFDSPI_Test()函数中。报文发送环节首先是操作txObj对象对发送报文进行配置,如标准帧还是扩展帧IDE、标识符ID、比特率切换BRS、CAN和CAN FD格式的FDF位和数据长度码DLC。在发送或接收期间,若DLC大于FIFO元素的PLSIZE会置位CiBDIAG1寄存器中的DLC不匹配位。接着对发送的数据txd进行赋值。最后若GPIO0的中断输出电平(低电平)或者读取FIFO状态寄存器判断出发送FIFO未满,则将报文加载到FIFO,并且将UINC置1 FIFO头部递增一个报文,同时将TXREQ置1请求发送报文实现报文最终发送。

      报文接收环节首先是判断GPIO0的中断输出电平(低电平),或者读取FIFO状态寄存器判断出接收FIFO非空,则从FIFO读取报文,前面发送报文的txObj信息存储在RxObj中(注意接收报文可能会根据时间戳使能位RXTSEN的值在RxObj中多一个时间戳),发送数据txd存储在rxd中。报文读取之后要将UINC置1 FIFO尾部递增一个报文。

4.4 MCP2518FD发送和接收CAN报文验证

      最终实验结果体现如下,标识符ID为0x300~0x307的CAN FD报文可以接收,而标识符ID为0x308~0x30F的CAN FD报文被滤波器和屏蔽器拦截无法存储到接收FIFO中。


      最后若您真的不需要CAN FD,仅需扩展CAN接口,并且坚持不用MCP2518FD来实现CAN 2.0B(MCP2518FD可能更便宜),那么您可以使用MCP2515或MCP25625,相关例程可参见如下Github链接

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 5
收藏 4
关注 39
成为作者 赚取收益
全部留言
0/200
  • Westbrook 2020-11-22 12:00
    跟着大佬学习!
    回复
  • 星球居民-RsPeIyMH 2020-11-22 09:59
    跟着大佬学习
    回复