【使用C++开发MCU】05-CAN实例之NXP S32K1 FlexCAN模块
文章目录
- 概述
- 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:
- Write the ID register
- Write payload data bytes
- Set MB_CS[IDE],MB_CS[RTR], MB_CS[EDL] and MB_CS[BRS] MB_CS[ESI],MB_CS[DLC];
- 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需要做一些准备:
- inactivate the mailbox
- Write the ID word
- 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需要做:
- Read the Control and Status word (optional).
- Read the ID field (optional).
- Read the data field.
- Read the RXFIR register (optional).
- 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模式。
- 初始化MCR
- 初始化CTRL1,可选CBT,FDCBT
- 初始化MB
- 初始化独立的接收屏蔽RXIMRn
- 设置中断
- PN设置可选
- Negate MCR[HALT]
经过上述步骤,FlexCAN尝试与CAN bus同步。
【使用C++开发MCU】05-CAN实例之NXP S32K1 FlexCAN模块相关推荐
- 【使用C++开发MCU】02-IIC实例之读取温度
为什么使用C++进行MCU开发 我从18年开始在STM32等上使用C++编程,在医疗器械行业进行IVD仪器开发,在此之前的项目开发中我是使用C语言.初次在MCU上使用C++,我有很多疑惑:C语言不挺好 ...
- 【使用C++开发MCU】04-CAN实例之CAN FD协议快速入门
概述 随着现代技术的进步,自90年代开始使用的CAN协议[Classical CAN protocol (ISO 11898-1:2015) ]在各个邻域具有广泛应用但也面临巨大的压力. 因此,本专栏 ...
- python零基础实例-零基础学习Python开发练习100题实例(1)
零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2864浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...
- python基础代码事例-零基础学习Python开发练习100题实例(2)
零基础学习Python开发练习100题实例(2) 2018-02-26 13:11:39 1934浏览 11.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个 ...
- python入门经典100题-零基础学习Python开发练习100题实例(1)
零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2854浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...
- Android开发中StackOverflowError错误实例分析
http://blog.csdn.net/mozhizun/article/details/7051300 http://blog.csdn.net/gaomatrix/article/details ...
- Android开发实战一之搭建开发环境-附测试实例(已亲测)
使用JDK.Android SDK.Eclipse + ADT搭建开发环境 附测试实例 (已亲测) ----------------------------------------- ...
- 用Java 开发 WebService Axis简单实例
用 Java 开发 WebService Axis 简单实例 在开发之前, 先了解一下AXIS,axis目前出现的2版本以其灵活性,快速开发工具的集成高于xfire而使用者居其上.用Eclipse开发 ...
- UG/NX二次开发Siemens官方NXOPEN实例解析—1.6 BlockStyler/SelectionExample
列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析-1.1 BlockStyler/ColoredBlock UG/NX二次开发Siemens官方NXOPEN实例解析-1.2 Blo ...
最新文章
- 玩Android微信小程序版
- js实现横向跑马灯效果
- 4.11 一维到三维推广-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 3.5 mysql备份与恢复
- python函数加括号于不加括号的区别
- 洛谷 P3378 【模板】堆
- cocos2d-x初探学习笔记(1)--HelloWorld
- Android开发之显示截图动画效果直到消失
- 记一次sql优化之索引的引用
- 安卓 spinner下拉框 做模糊查询_用图表控件做一个简单的员工信息查询系统
- 用python写helloworld_Python基于Tkinter的HelloWorld入门实例
- 2021级C语言大作业 - 霓虹深渊
- python中pd.read_Windows下Python的pd.read_excel()报错
- 一元流量参数为null_精益SQL —— “NULL”真烦人
- linux完全卸载mysql_mysql完全卸载教程(图文详细)
- SSH框架调用scrapy爬虫
- 手把手带你搭建Linux环境(保姆级,包含vivado与petalinux)
- 向量积的二维物理意义,二维向量叉乘几何意义
- 题解 洛谷P2142 高精度减法
- 工欲善其事,必先利其器!idea最详细的Debug技巧及方法,让你定位bug如探囊取物!