文章目录

  • 概述
  • FlexCAN模块框图
    • 协议引擎Protocol Engine (PE)
    • 控制器主机接口Controller Host Interface (CHI)
    • 总线接口单元Bus Interface Unit (BIU)
  • 操作模式
  • MBs结构
  • Rx FIFO结构
  • 功能描述
    • 发送过程
    • 仲裁过程
    • 接收过程
    • MB接收
    • RX FIFO接收
    • 匹配过程
    • Pretended Networking 模式下接收过程
    • 搬运处理
      • Move-in
      • Move-out
    • 数据一致性
    • 中断
    • 初始化时序

C++开发MCU 博客专栏

概述

本文总结归纳NXP S32K1系列的FlexCAN模块,概括其特征,讲解其MBs(message buffers)及其他处理、配置过程,以便更高效的开发CAN、CAN FD相关应用。

FlexCAN是NXP实现了ISO 11898-1 standard and CAN 2.0 B 协议的CAN控制器模块IP,不仅存在于S32K1系列MCU上,也存在于S32K3等MCU上,不同型号含有不同数量的FlexCAN实例数,其MailBox数量也不同。S32K1一般含有1-3个FlexCAN,不全支持CAN FD(up to 8 Mb/s),一般含有16,32或54个消息邮箱。

FlexCAN模块框图

协议引擎Protocol Engine (PE)

PE用于管理CAN总线上的串行通讯: 请求RAM访问用于接收、发送消息帧;验证接收的消息; 运行错误处理; 探测CAN FD帧。

控制器主机接口Controller Host Interface (CHI)

CHI用于管理接收、发送的消息缓存( message buffer),负责仲裁和ID匹配。

总线接口单元Bus Interface Unit (BIU)

BIU用于控制访问内部总线,建立与CPU和其他模块的联系。包括时钟、寻址、数据总线、中断、DMA的访问都是通过BIU.

操作模式

  • Normal mode
  • Freeze mode
    配置其他寄存器时常需要进入此模式,此时,没有发送、接收,总线同步丢失。
  • Loop-Back mode
    用于自发自收。RX pin输入被忽略,TX pin隐性。
  • Listen-Only mode
    发送失能,错误计数器冻结,模块处于CAN Error Passive mode。
  • CAN FD Active mode
    FD没有RX FIFO、Rx FIFO DMA和Pretended network support。
  • Stop mode
    模块自生处于 inactive state,时钟可断掉。
  • Pretended Network mode
    CHI 时钟断掉,PE时钟保持,Rx接收处理依旧可以过滤将到来的消息。

MBs结构

寄存器占128Bytes, 地址偏移从0x80 to 0x27F 分配给32个128位(4字)的MBs消息邮箱。

上图是含有64个载荷数据时的MS结构。头部固定8Bytes,根据CAN消息的载荷 8, 16, 32, or 64,每个消息邮箱被分配组织为 16, 24, 40, or 72 bytes。

地址偏移从0x80 to 0x27F 分配给32个128位(4字)的MBs消息邮箱–>对于8bytes载荷的CAN帧,正好有32个MBs,载荷增多,MBs个数也就减少了。

载荷 MBs个数
8 32
16 21
32 12
64 7

Rx FIFO结构

当FIFO使能时,从0x80 to 0xDC (MBs 0–5)区域被RX FIFO占用。
0x80-0x8C区块(MB0)区域是需要被CPU读取的FIFO输出,该输出是较老尚未读取的消息, 0x90-0xDC被硬件FIFO内部管理。

额外的从0xE0 and may extend up to 0x2DC (MBs 6–37) 根据CTRL2[RFFN]设定含有过滤表,用于FIFO RX过滤。

出于兼容考量,复位后,默认RFFN = 0,滤波表占用0xE0到0xFC(MBs 6 to 7)。


每个滤波表占用整个32bit字,而这个字可被分成1,2,4块,形成三种滤波格式。

Format A可以过滤完整ID的报文;
Format B可以过滤完整标准帧,对于扩展帧,只能匹配MSB 14bit;
Format C可以只能匹配MSB 8bit;

功能描述

对于Classical CAN,可同时使用MB、RX FIFO接收;
对于CAN FD,只能使用MB接收。

发送过程

CPU做一些准备,选择一个合适的MB:

  1. Write the ID register
  2. Write payload data bytes
  3. Set MB_CS[IDE],MB_CS[RTR], MB_CS[EDL] and MB_CS[BRS] MB_CS[ESI],MB_CS[DLC];
  4. MB_CS[CODE] to 0xC,Activate the message buffer to transmit the CAN frame.
    上述最后一步激活MB发送CAN帧。
    当MB激活后,将参与仲裁过程,最终根据优先级发送出去。
    在发送成功后,相关的状态被更新,中断产生,在其中要清楚其中断标志。

仲裁过程

仲裁过程扫描MBs,从低编号到高编号,选择一个arbitration winner用于在下次发送。
CTRL1[LBUF] =1,Lowest-number mailbox first
CTRL1[LBUF] =0,Highest-priority mailbox first

MCR[LPRIOEN] =1,Local priority enabled, low PRIO values have higher priority ,PRIO只是内部仲裁的一个值,并不会出现在总线上。

当找到arbitration winner,其被拷贝到一个隐藏的辅助性的Tx Serial Message Buffer (Tx SMB),【move-out】。在第一个CAN BUS机会窗口,Tx SMB中内容根据CAN协议规范发送出去。

接收过程

MB接收

为了将CAN帧接收到MB。CPU需要做一些准备:

  1. inactivate the mailbox
  2. Write the ID word
  3. Write the EMPTY code (0b0100) to the CODE field to activate the mailbox.

在MB激活后,它能够根据滤波设计接收帧,在接收成功后,MB被【move-in】过程更新。
CPU应查询 IFLAG registers 而不是消息邮箱的CODE域。

RX FIFO接收

一旦Rx FIFO 中断接收到帧,CPU需要做:

  1. Read the Control and Status word (optional).
  2. Read the ID field (optional).
  3. Read the data field.
  4. Read the RXFIR register (optional).
  5. Clear the Frames Available in Rx FIFO interrupt by writing one to IFLAG1[BUF5I]。

当 MCR[DMA]使能,一旦有帧进入FIFO,IFLAG1[BUF5I]产生DMA请求而不是CPU中断。

匹配过程

省略

Pretended Networking 模式下接收过程

在PN Mode下,在低功耗(stop mode)增加了特定的唤醒功能。在PN模式下,CAN FD报文被忽略,在stop mode下FLEXCAN的接收继续处理,可通过特定的报文唤醒。

搬运处理

在S32K1中,有两种搬运过程:move-in and move-out。

Move-in

复制Rx SMB接收到的消息到Rx mailbox或者匹配的FIFO,若到Rx FIFO,消息的属性也复制到 CAN_RXFIR FIFO。每个Rx SMB有各自的move-in处理,但同一时刻只有一个是运行着的。

Move-out

当有消息可供传输时,复制Tx mailbox的内容到Tx SMB。

数据一致性

省。

中断

模块有许多的中断源:

  • message buffers 导致的中断
  • ORed导致的中断,从MBs, Bus Off, Bus Off Done, Error, Error Fast, Wake Up,Match, Wake Up Timeout, Tx Warning, and Rx Warning.而来的。

每个message buffers能成为一个中断源,若IMASK中对应位置位,没有区分是TX还是RX中断。若中断产生, IFLAG 中对应位置位,W1C。

若Rx FIFO使能,中断接收(DMA关闭),IFLAG中0到7bit有不同含义:

  • Bit 7:FIFO Overflow
  • Bit 6:FIFO Warning
  • Bit 5:Frames Available
  • Bits 4-0 are unused

若Rx FIFO使能,DMA接收:
不产生任何FIFO中断,Bit5依旧指示Frames Available in FIFO并产生DMA request,其他位未使用。

当多个MB中断源是OR’d时产生联合中断,当任何一个MB产生中断时,ORD联合中断产生,在这种情况下,CPU需要读取IFLAG去判断时哪个MB或者FIFO导致中断。

以下中断能从ESR1中读取:

  • Bus Off
  • Bus Off Done
  • Error
  • Error Fast
  • Tx Warning
  • Rx Warning
    Bus Off, Error, Tx Warning, and Rx Warning interrup使能在CTRL1中。
    PN相关的在WU_MTC和CTRL1_PN中。
/* Implementation of CAN0 IRQ handler for OR'ed interrupts (Bus Off,
Transmit Warning, Receive Warning). */
void CAN0_ORed_IRQHandler(void)
{FLEXCAN_BusOff_IRQHandler(0U);
}/* Implementation of CAN0 IRQ handler for interrupts indicating that errors were
detected on the CAN bus. */
void CAN0_Error_IRQHandler(void)
{FLEXCAN_Error_IRQHandler(0U);
}#if FEATURE_CAN_HAS_WAKE_UP_IRQ/* Implementation of CAN0 IRQ handler for interrupts indicating a wake up
event. */
void CAN0_Wake_Up_IRQHandler(void)
{FLEXCAN_WakeUpHandler(0U);
}#endif /* FEATURE_CAN_HAS_WAKE_UP_IRQ *//* Implementation of CAN0 IRQ handler for interrupts indicating a successful
transmission or reception for Message Buffers 0-15. */
void CAN0_ORed_0_15_MB_IRQHandler(void)
{FLEXCAN_IRQHandler(0U);
}/* Implementation of CAN0 IRQ handler for interrupts indicating a successful
transmission or reception for Message Buffers 16-31. */
void CAN0_ORed_16_31_MB_IRQHandler(void)
{FLEXCAN_IRQHandler(0U);
}

初始化时序

对于大多数配置变更初始化,需要模块处于Freeze模式。

  1. 初始化MCR
  2. 初始化CTRL1,可选CBT,FDCBT
  3. 初始化MB
  4. 初始化独立的接收屏蔽RXIMRn
  5. 设置中断
  6. PN设置可选
  7. Negate MCR[HALT]
    经过上述步骤,FlexCAN尝试与CAN bus同步。

【使用C++开发MCU】05-CAN实例之NXP S32K1 FlexCAN模块相关推荐

  1. 【使用C++开发MCU】02-IIC实例之读取温度

    为什么使用C++进行MCU开发 我从18年开始在STM32等上使用C++编程,在医疗器械行业进行IVD仪器开发,在此之前的项目开发中我是使用C语言.初次在MCU上使用C++,我有很多疑惑:C语言不挺好 ...

  2. 【使用C++开发MCU】04-CAN实例之CAN FD协议快速入门

    概述 随着现代技术的进步,自90年代开始使用的CAN协议[Classical CAN protocol (ISO 11898-1:2015) ]在各个邻域具有广泛应用但也面临巨大的压力. 因此,本专栏 ...

  3. python零基础实例-零基础学习Python开发练习100题实例(1)

    零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2864浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...

  4. python基础代码事例-零基础学习Python开发练习100题实例(2)

    零基础学习Python开发练习100题实例(2) 2018-02-26 13:11:39 1934浏览 11.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个 ...

  5. python入门经典100题-零基础学习Python开发练习100题实例(1)

    零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2854浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...

  6. Android开发中StackOverflowError错误实例分析

    http://blog.csdn.net/mozhizun/article/details/7051300 http://blog.csdn.net/gaomatrix/article/details ...

  7. Android开发实战一之搭建开发环境-附测试实例(已亲测)

    使用JDK.Android SDK.Eclipse + ADT搭建开发环境      附测试实例     (已亲测) ----------------------------------------- ...

  8. 用Java 开发 WebService Axis简单实例

    用 Java 开发 WebService Axis 简单实例 在开发之前, 先了解一下AXIS,axis目前出现的2版本以其灵活性,快速开发工具的集成高于xfire而使用者居其上.用Eclipse开发 ...

  9. UG/NX二次开发Siemens官方NXOPEN实例解析—1.6 BlockStyler/SelectionExample

    列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析-1.1 BlockStyler/ColoredBlock UG/NX二次开发Siemens官方NXOPEN实例解析-1.2 Blo ...

最新文章

  1. 玩Android微信小程序版
  2. js实现横向跑马灯效果
  3. 4.11 一维到三维推广-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 3.5 mysql备份与恢复
  5. python函数加括号于不加括号的区别
  6. 洛谷 P3378 【模板】堆
  7. cocos2d-x初探学习笔记(1)--HelloWorld
  8. Android开发之显示截图动画效果直到消失
  9. 记一次sql优化之索引的引用
  10. 安卓 spinner下拉框 做模糊查询_用图表控件做一个简单的员工信息查询系统
  11. 用python写helloworld_Python基于Tkinter的HelloWorld入门实例
  12. 2021级C语言大作业 - 霓虹深渊
  13. python中pd.read_Windows下Python的pd.read_excel()报错
  14. 一元流量参数为null_精益SQL —— “NULL”真烦人
  15. linux完全卸载mysql_mysql完全卸载教程(图文详细)
  16. SSH框架调用scrapy爬虫
  17. 手把手带你搭建Linux环境(保姆级,包含vivado与petalinux)
  18. 向量积的二维物理意义,二维向量叉乘几何意义
  19. 题解 洛谷P2142 高精度减法
  20. 工欲善其事,必先利其器!idea最详细的Debug技巧及方法,让你定位bug如探囊取物!

热门文章

  1. 晚明最后的辉煌-朝鲜之役
  2. OpenCV:vector subscript out of range
  3. spring boot入门 -- 介绍和第一个例子
  4. Motor Back-drive电机反驱
  5. 动态调试之——x64dbg的使用
  6. PADS9.5如何导出的光绘文件(Gerber),应该检查什么?
  7. 数据挖掘与数据化运营实战. 3.5 交叉销售模型
  8. VirtualLab基础实验教程-7.偏振(2)
  9. 用ESXi-Customizer 为ESXI镜像加入硬件驱动
  10. Android-蓝牙sco通话