中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

搜索附件  
汽车工程师之家 附件中心 结构原理专业知识特区 『汽车控制器VCU/BMS/MCU/域控』 S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w12.jpg
左侧广告
附件中心&附件聚合2.0
For Discuz! X2.5 © hgcad.com

S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w12.jpg

 

S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等):
内容提要
引言1. S32K1xx SDK的flexcan组件Processor Expert配置详解1.1 flexcan组件的全局配置(all)1.2 flexcan组件的功能配置(Configurations)1.3 flexcan组件依赖的其他SDK组件(Shared components)2. S32K1xx SDK的can_pal组件Processor Expert配置详解2.1 can_pal组件的全局配置(all)2.2 can_pal组件的功能配置(Configurations)2.3 can_pal组件依赖的其他SDK组件(Shared componts)3. S32K1xx SDK的flexcan组件API函数功能详解和使用Tips3.1 flexcan组件的初始化(Init)和反初始化(Deinit)API函数3.2 flexcan组件的波特率设置和获取API函数3.3 flexcan组件的CAN接收报文ID滤波器掩码(Mask)和类型(MaskType)设置API函数3.4 flexcan组件的发送MB(ConfigTxMb)和接收MB(ConfigRxMb)配置API函数3.5 flexcan组件的MB CAN报文发送(Send/SendBlocking)和接收(Receive/ReceiveBlocking)以及RxFIFO CAN报文接收(RxFifo/RxFifoBlocking)API函数3.6 flexcan组件的MB CAN报文传输完成状态(GetTransferStatus)以及模块错误信息(GetErrorStatus)获取API函数3.7 flexcan组件的事件和错误中断ISR回调函数(InstallEvent/ErrorCallback)安装API函数3.8 flexcan组件的CAN-FD收发器延时补偿功能(TDC)API函数3.9 flexcan组件的MB CAN报文传输终止(AbortTransfer)和其他API函数4 S32K1xx SDK的can_pal组件API函数功能详解和使用Tips4.1 can_pal组件的初始化(Init)和反初始化(Deinit)API函数4.2 can_pal组件的波特率设置和获取API函数4.3 can_pal组件的发送MB(ConfigTxBuff)和接收MB(ConfigRxBuff)以及远程帧响应(RemoteResponseBuff)配置API函数4.4 can_pal组件的MB CAN报文发送(Send/SendBlocking)和接收(Receive/ReceiveBlocking)以及RxFIFO CAN报文接收(RxFifo/RxFifoBlocking)API函数4.5 can_pal组件的MB CAN报文传输完成状态(GetTransferStatus)和终止传输(AbortTransfer)获取API函数
4.6 can_pal组件的MB接收ID滤波器设置(CAN_SetRxFilter)和中断ISR回调函数安装(InstallEventCallback)以及默认配置获取(GetDefaultConfig)API函数

5. S32K1xx SDK的flexcan和can_pal组件驱动API函数使用样例代码介绍
5.1 测试硬件平台-S32K144EVB-Q100介绍5.2 样例工程1--基于CAN_PAL层驱动的RxFIFO中断接收(RxFIFO ID滤波表配置--接收指定ID的CAN 2.0标准报文帧)和独立的MB ID滤波器接收特定ID范围的CAN 2.0标准报文帧,并将RxFIFO和独立MB接收到的CAN报文经指定独立MB发送回CAN总线5.3 样例工程2--基于flexcan PD层驱动的RxFIFO DMA接收(RxFIFO ID滤波表配置--接收指定ID的CAN 2.0标准报文帧)和独立的MB ID滤波器接收特定ID范围的CAN 2.0标准报文帧,并将RxFIFO和独立MB接收到的CAN报文经指定独立MB发送回CAN总线5.4 样例工程3--基于CAN_PAL层驱动的独立的MB ID滤波器配置接收特定ID范围的CAN 2.0/CAN-FD标准帧和扩展帧报文,并将独立MB接收到的CAN报文经指定独立MB发送回CAN总线,演示如何同时发送和接收CAN 2.0和CAN-FD报文数据以及低功耗(VLPS)模式下通过CAN报文唤醒的具体配置和实现6 can_pal组件和flexcan组件使用FAQ总结6.1 如何触发FlexCAN的bus off以及恢复测试?6.2 使用FlexCAN驱动推荐的 S32K1xx SDK版本(含bug修复历史介绍)6.3 FlexCAN模块的PD层和PAL层驱动(flexcan组件 .vs can_pal组件)使用Tips6.4 FlexCAN模块调试Tips
6.5 如何获取接收CAN报文的CAN-FD使能、数据域波特率切换(BRS)、ID类型和data/remote帧等配置信息,并使用相同的配置将接收到的CAN报文发送回CAN总线?
总结(样例工程下载和后续疑难解答)参考文档
引言
在上一篇原创技术分享文章《S32K1xx系列MCU应用指南之FlexCAN模块功能与应用详解》(点击文章标题即可直接跳转阅读)中,已经对S32K1xx系列MCU的CAN控制器外设模块--FlexCAN的功能和应用进行了详细介绍,为了帮助大家更好地使用这个外设模块,在S32K1xx SDK中提供了can_pal和flexcan两个组件,用于配置S32K1xx系列MCU的FlexCAN模块,并提供相应的驱动API函数:


本文旨在介绍S32K1xx SDK提供的这两个FlexCAN驱动组件的Processor Expert配置和API函数的调用方法,并提供FlexCAN功能配置和使用参考代码以及S32DS for ARM v2.2 IDE的样例工程,为大家提供一个学习参考,从而更快更好地掌握和使用S32K1xx系列MCU的FlexCAN模块功能。
1. S32K1xx SDK的flexcan组件Processor Expert配置详解
flexcan组件是S32K1xx SDK提供的FlexCAN模块的外设驱动层(PD)配置组件,从组件库(Components Library)中将其添加到S32K1xx系列MCU应用工程后,在组件浏览器(Component )中双击该组件,即可在组件查看器(Component Inspector)中打开其配置界面如下:


1.1 flexcan组件的全局配置(all)
在组件查看器(Component Inspector)中 flexcan组件的属性(Properties)中选择All,即可查看其全局配置,其提供了整个组件配置的全局查看和配置功能,包括:


Component name: 组件名,默认为canComX,X会随着flexcan组件添加自动增加,用户也可以输入自定义的名字;该配置不影响flexcan组件的具体使用,通常无需关心,保持其默认配置即可;
Device:选择当前组件要配置的FlexCAN模块设备,具体可配置的FlexCAN模块由当前应用工程的目标MCU part number和是否已经被其他flexcan组件或者can_pal组件配置有关:

Device

对应的FlexCAN模块

CAN0

FlexCAN0

CAN1

FlexCAN1

CAN2

FlexCAN2
Tips:Device的必须与用户硬件设计一致;
Tips:S32k1xx系列MCU不同part的FlexCAN模块数量和支持的具体功能特性如下表:


Component version: 组件版本信息,不可配置;
1.2 flexcan组件的功能配置(Configurations)
在组件查看器(Component Inspector)中 flexcan组件的属性(Properties)中选择Configurations,即可查看其功能配置,包括:
Configurations list: 配置列表,其中提供了FlexCAN模块功能的详细配置:


Tips:虽然在Configurations list中可以添加多个用户配置,但是通过拖拽方式添加flexcan组件初始化API时,其只会自动调用canCom1_InitConfig0配置,而且每一个FlexCAN模块(通过全局配置的Device配置)只能调用一个配置,因此,为了方便管理,推荐为每个FlexCAN模块添加一个flexcan组件来完成其配置,而不是在一个flexcan组件中添加多个Configuration list来配置多个FlexCAN模块。
Pretended Networking: 虚拟网络功能,仅FlexCAN0模块支持该功能,其余模块该选项为不可配置状态。 其中提供FlexCAN 模块的虚拟网络功能相关的唤醒事件(Wake up events)、多组匹配使能(Enable multiple matches)以及ID滤波(ID filtering)和报文内容滤波(Payload filtering)等配置。


Tips:由于S32K1xx系列MCU FlexCAN模块的虚拟网络功能仅支持STOP1/2两种低功耗模式(功耗在5~10mA),在VLPS最低功耗模式(功耗为几十uA)下无法工作,所以并不实用,因此本文也不做介绍。
Tips:若要使用CAN网络的虚拟网络唤醒功能,请选择使用带有该功能的CAN收发器或者SBC芯片(比如UJA1169x)。
下面,我们一起来看看Configurations list中提供的配置选项:


Name:配置名称,默认为canCom1_InitConfig0,用户可以修改,以增加其可读性,比如将配置feature加到命名中,canCom1_InitConfig_CANFD_8MB_2Mbitps。通常使用默认配置即可;
Read only: 勾选该选项后,生成的初始化配置结构体将被const修饰,编译后链接时将被保存到常数段(.const)而非数据段(.data),从而节省SRAM空间,当然,此时也不允许用户在程序运行时对其进行修改了。
默认为勾选“Read only”选项,生成的配置结构体如下:constflexcan_user_config_t canCom1_InitConfig0 = {    .fd_enable = false,    .pe_clock = FLEXCAN_CLK_SOURCE_OSC,    .max_num_mb = 16,    .num_id_filters = FLEXCAN_RX_FIFO_ID_FILTERS_8,    .is_rx_fifo_needed = false,    .flexcanMode = FLEXCAN_NORMAL_MODE,    .payload = FLEXCAN_PAYLOAD_SIZE_8,    .bitrate = {        .propSeg = 7,        .phaseSeg1 = 4,        .phaseSeg2 = 1,        .preDivider = 0,        .rJumpwidth = 1    },    .bitrate_cbt = {        .propSeg = 7,        .phaseSeg1 = 4,        .phaseSeg2 = 1,        .preDivider = 0,        .rJumpwidth = 1    },    .transfer_type = FLEXCAN_RXFIFO_USING_INTERRUPTS,    .rxFifoDMAChannel = 0U};编译链接结果如下:.rodata.canCom1_InitConfig00x000000000x38 ./Generated_Code/canCom1.o不勾选“Read only”选项,生成的配置结构体如下:flexcan_user_config_t canCom1_InitConfig0 = {    .fd_enable = false,    .pe_clock = FLEXCAN_CLK_SOURCE_OSC,    .max_num_mb = 16,    .num_id_filters = FLEXCAN_RX_FIFO_ID_FILTERS_8,    .is_rx_fifo_needed = false,    .flexcanMode = FLEXCAN_NORMAL_MODE,    .payload = FLEXCAN_PAYLOAD_SIZE_8,    .bitrate = {        .propSeg = 7,        .phaseSeg1 = 4,        .phaseSeg2 = 1,        .preDivider = 0,        .rJumpwidth = 1    },    .bitrate_cbt = {        .propSeg = 7,        .phaseSeg1 = 4,        .phaseSeg2 = 1,        .preDivider = 0,        .rJumpwidth = 1    },    .transfer_type = FLEXCAN_RXFIFO_USING_INTERRUPTS,    .rxFifoDMAChannel = 0U};编译链接结果如下:.data.canCom1_InitConfig00x000000000x38 ./Generated_Code/canCom1.oTips:通常这个初始化结构体仅在flexcan组件初始化时调用,工作时无需修改,因此将其储存在const段也是OK的。通过这个配置可以节省0x38 = 56字节的SRAM。
Enable FD: CAN-FD使能配置,该选项是否可配置取决于Device配置选择FlexCAN模块和MCU part number,具体请参考附录参考文档1。不够选时,FlexCAN仅支持CAN 2.0 A/B报文的收发,勾选后,还可以支持CAN-FD报文的收发。
PE clock source:FlexCAN模块的外设功能时钟源配置,可以通过下拉菜单选择使用以下时钟作为其工作时的波特率参考时钟:
Oscillator clock:外部晶振时钟;Periperial clock: 外设时钟;


Tips:该选项的配置决定了当前配置下FlexCAN模块能够支持的最大波特率,具体请参考附录参考文档1。
MBs number:可用最大消息缓存数量配置,该选项输入决定了在调用Tx和Rx MB配置(FLEXCAN_DRV_ConfigTxMb()和FLEXCAN_DRV_ConfigRxMb())和send及receive API函数(FLEXCAN_DRV_Send/Blocking()和FLEXCAN_DRV_Receive/Blocking())时可以传入的最大MB索引(mb_idx)。
当此处配置为N个MB,则可用的MB索引为0~(N-1), 其中N的值由FlexCAN模块和CAN-FD所要支持的最大数据域长度(DLC)决定,具体请参考附录参考文档1的4. S32K1xx系列MCU的FlexCAN模块的接收ID滤波器工作原理及配置详解章节。
RxFIFO ID filter number: FlexCAN 模块的接收FIFO CAN报文ID滤波器数量配置,此选项仅在勾选“Use RxFIFO”使能RxFIFO后起作用,最大可以支持128个Rx FIFO滤波器,占用剩余的MB储存空间,配置的Rx FIFO filter数量越多,剩余可用的MB就越少:
每个Rx FIFI filter占用32-bit,当配置为8 Rx FIFO Filter(最小)时,其占用MB6~MB7(剩余的MB8~MB15/31可以独立配置使用);当配置为128 Rx FIFO Filter(最大)时,其占用MB6~MB31(整个FlexCAN模块只有一个MB(0));


Tips:关于FlexCAN模块的RxFIFO ID滤波器设置,具体请参考附录参考文档1的4.2 使能FlexCAN的Rx FIFO后的接收ID滤波器章节内容。
RxFIFO transfer type:RxFIFO接收方式选择,此选项仅在勾选“Use RxFIFO”使能RxFIFO后可配置,可通过下拉菜单选择使用DMA(using DMA)或者中断(using interrupts)方式接收:


RxFIFO transfer DMA channel numer: 当配置使用DMA接收RxFIFO时,需要通过此选项配置所使用的DMA通道。可以通过下拉菜单选择可以的EDMA channel 0~ channel 3(S32K11xx系列MCU)/channel15(S32K14x系列MCU):


Tips:此时,用户需要手动在edma组件中添加并正确配置相应EDMA通道--所用EDMA通道的Request源必须与当前flexcan组件配置的Device相同:


且在配置FlexCAN模块之前调用edma组件的初始化函数,完成其初始化工作:/* initialize eDMA for CAN RxFIFO transfer */EDMA_DRV_Init(&dmaController1_State, &dmaController1_InitConfig0, edmaChnStateArray, edmaChnConfigArray, EDMA_CONFIGURED_CHANNELS_COUNT);
/*initialize the CAN module*/CAN_Init(&can_pal1_instance, &can_pal1_Config0);Operation Mode: FlexCAN模块工作模式配置。可以通过下拉菜单选择一些模式:
Normal:正常模式,FlexCAN模块正常工作,可以对外收发CAN报文;Listin-only:侦听模式,FlexCAN模块能够接收CAN总线报文,但是不能向CAN总线发送任何CAN报文;Loop back:回环模式,FlexCAN模块的TXD内部连接到RXD,RXD引脚用于外部信号连接断开,所有发送的CAN报文将被自己接收,此模式通常用作测试;Freeze:冻结模式,FlexCAN模块停止所有发送和接收操作,此模式主要用于FlexCAN模块初始化配置;Disable:关闭模式,FlexCAN模块关闭。


Tips:正常工作时,FlexCAN模块必须处于Normal模式。关于这些模式的具体定义,请参考附录参考文档1的1.5 FlexCAN模块的运行(Operation)模式章节内容。
Payload Size: 支持的最大数据域长度(DLC)配置,可以通过下拉菜单选择8字节(CAN_PAYLOAD_SIZE_8)、16字节(CAN_PAYLOAD_SIZE_16)、32字节(CAN_PAYLOAD_SIZE_32)和64字节(CAN_PAYLOAD_SIZE_64):


Tips:不勾选“Enable FD”选项时,此选项只能配置为8字节(CAN_PAYLOAD_SIZE_8),因为CAN 2.0 A/B报文的数据域长度(DLC)最大为8字节。
Module clock:模块时钟,即FlexCAN模块寄存器访问时的总线接口(BIU)时钟,由clock_manager组件配置的系统总线时钟(SYS_CLK)频率决定。


PE clock:FlexCAN 模块的波特率参考时钟,其频率由上面的PE clock source选项配置决定。
Bitrate to time segment:勾选此选项后(推荐使用方法),在下面的“Bitrate configuration”窗口中,输入想要使用的波特率(Bitrate[kbit/s])和采样点(Sampling Point[%]),Processor Expert将自动计算相应的bit时隙配置(传输段(propagation segment)、相位段1(Phase segement 1)、相位段2(Phase segement 2)和同步跳变宽度(Sync jump width)等配置域为灰色,不可输入);若不勾选此选项,则用户需要自己输入bit时隙配置,然后Processor Expert帮用户计算出波特率和采样点(此时波特率(Bitrate[kbit/s])和采样点(Sampling Point[%])配置域为灰色,不可输入):
在“Bitrate configuration”窗口中“Arbitration Phase”和“Data Phase”分别用于配置CAN报文帧中仲裁域和数据域的波特率,后者仅在勾选“Enable FD”选项时可配置,用于配置CAN-FD报文的数据域波特率(最高可以支持到8Mbit/s);对于CAN 2.0 A/B报文帧,数据域与仲裁域使用相同的波特率,由“Arbitration Phase”设置。
Tips:若要设置波特率大于1MHz(比如设置使能CAN-FD后, 数据域的波特率为2MHz/5MHz/8MHz),“PE clock source”选择的时钟源频率必须是目标波特率的8倍以上。关于FlexCAN模块的波特率计算细节,请参考附录参考文档1的1.4 FlexCAN模块的通信波特率计算和bit位采样点配置章节。
1.3 flexcan组件依赖的其他SDK组件(Shared components)
在组件查看器(Component Inspector)中 flexcan组件的属性(Properties)中选择Shared components,即可查看其依赖的其他SDK组件,包括:
interrupt_manager:中断控制管理器,提供flexcan组件驱动API函数中调用的FlexCAN模块中断使能和优先级配置API函数;
clock_manager: 时钟配置管理器,提供FlexCAN模块的总线接口(BIU)时钟和波特率参考时钟(PE)以及门控时钟配置等;
edma: eDMA,提供FlexCAN模块RxFIFO的DMA接收功能配置API函数;
osif: 提供flexcan组件驱动API函数中调用的延迟和信号量同步操作等的操作系统接口API函数;


Tips:其中interrupt_manager组件和clock_manager组件是新建S32K1xx SDK应用工程时,默认添加的。edma组件和osif组件是在添加flexcan组件时Processor Expert根据依赖关系自动添加的(若已经存在,则不会重复添加)。
S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w12.jpg
         同一主题附件:
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w1.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w2.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w3.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w4.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w5.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w6.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w7.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w8.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w9.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w10.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w11.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w12.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w13.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w14.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w15.jpg
    S32K SDK使用详解之can_pal组件和flexcan组件使用详解(含RxFIFO DMA和ID滤波器以及总线关闭恢复等)w16.jpg

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 20-5-2024 09:40 , Processed in 0.256933 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.