0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心
发布

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Tricore的CANFD入门工程

jf_EksNQtU6 来源:开心果 Need Car 2023-07-12 09:46 次阅读

汽车嵌入式开发,很多时候,想学一些东西(eg:CANFD),但又不知道如何下手,这应该是大多数刚入行工程师的苦恼。目前项目上,CANFD的使用已经很普遍,而单纯阅读芯片手册,可能无法透彻的理解CANFD,如果想透彻的理解CANFD,结合目标板去实践是不二选择。

官网的MCMCAN_FD_1_KIT_TC375_LK工程用的回环模式,并不能真实发送/接收报文,本文基于官网工程做了二次开发,希望此Demo可以助力大家高效学习CANFD。

本文环境:TC375开发板+Tasking编译器。

1、TC375 CANFD实现注意事项

本文对实现过程中的几处细节,展开讨论。(一)Transceiver的使能按照手册描述,Transceiver型号为TLE9251V,Transceiver的使能需要拉低P20.6,使其进入Normal工作模式。

d7f8bef4-1fd5-11ee-962d-dac502259ad0.png

对应的代码实现如下:

void GPIO_init(void) { IfxPort_setPinMode(&MODULE_P20, 6, IfxPort_Mode_outputPushPullGeneral); IfxPort_setPinLow(&MODULE_P20, 6); }

(二)CAN_H、CAN_L Pin配置

代码实现如下:

IFX_CONST IfxCan_Can_Pins Can0PortInfo = { .txPin = &IfxCan_TXD00_P20_8_OUT, .txPinMode = IfxPort_OutputMode_pushPull, .rxPin = &IfxCan_RXD00B_P20_7_IN, .rxPinMode = IfxPort_InputMode_pullUp, .padDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1 };

(三)波特率设置

配置代码如下:

.baudRate= { .baudrate = 500000, .samplePoint = 8000, .syncJumpWidth = 2000, .prescaler = 0, .timeSegment1 = 3, .timeSegment2 = 10 }, .fastBaudRate = { .baudrate = 2000000, .samplePoint = 8000, .syncJumpWidth = 2000, .prescaler = 1, .timeSegment1 = 3, .timeSegment2 = 10, .tranceiverDelayOffset = 0 },

如上,设置Normal段速率为500Kbps,Data段速率为2000Kbps,采样点均设置80%。

(四)接收过滤配置

配置代码实现如下所示:

.filterConfig = { .messageIdLength = IfxCan_MessageIdLength_standard, .standardListSize = 0, .extendedListSize = 0, .rejectRemoteFramesWithStandardId = 0, .rejectRemoteFramesWithExtendedId = 0, .standardFilterForNonMatchingFrames = IfxCan_NonMatchingFrame_acceptToRxFifo0, .extendedFilterForNonMatchingFrames = IfxCan_NonMatchingFrame_acceptToRxFifo0 }, g_mcmcan.canFilter.number = 2; g_mcmcan.canFilter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxFifo0; g_mcmcan.canFilter.type = IfxCan_FilterType_range; g_mcmcan.canFilter.id1 = 0x166; g_mcmcan.canFilter.id2 = 0x168; g_mcmcan.canFilter.rxBufferOffset = IfxCan_RxBufferId_0;
(五)接收报文过滤实现本文可以接收报文的范围为:0x166~0x168。 代码实现:
void IfxCan_Can_setStandardFilter(IfxCan_Can_Node *node, IfxCan_Filter *filter) { /* enable configuration change CCCR.CCE = 1, CCCR.INIT = 1 */ IfxCan_Node_enableConfigurationChange(node->node); Ifx_CAN_STDMSG *standardFilterElement = ((uint32*)(node->messageRAM.baseAddress + node->messageRAM.standardFilterListStartAddress)); standardFilterElement->S0.B.SFID2 = filter->id2; /* First ID of standard ID filter element. */ standardFilterElement->S0.B.SFID1 = filter->id1; /* 001B Store in Rx FIFO 0 if filter matches */ standardFilterElement->S0.B.SFEC = 0x01; /* 00B Range filter from SF1ID to SF2ID (SF2ID ≥ SF1ID) */ standardFilterElement->S0.B.SFT = 0x00; /* Defines how received messages with 11-bit IDs that do not match any * element of the filter list are treated. (0x03)11B Reject */ node->node->GFC.B.ANFS = 0x03; /* disable configuration change CCCR.CCE = 0, CCCR.INIT = 0 */ IfxCan_Node_disableConfigurationChange(node->node); }

CAN报文的接收过滤主要设置两部分:

1、Global Filter Configuration

主要配置GFC寄存器,本文对Standard帧进行过滤处理,如果与设置的接收范围不匹配,则Rejet,设置GFC寄存器的ANFS位域,如下所示:

d81b9294-1fd5-11ee-962d-dac502259ad0.png

2、Standard Message ID Filter处理标准CAN报文的ID过滤处理,即:设置每个邮箱过滤报文的范围或者指定一帧或者两帧CANID,如下所示:

d839b9cc-1fd5-11ee-962d-dac502259ad0.png

注意:Standard Message 0并不是一个具体的寄存器,而是CAN模块专用的RAM区,由实现者根据需要配置所使用的SRAM大小和起始地址。

而CAN模块SRAM区的切割要按照手册要求划分,如下所示:

d858c9de-1fd5-11ee-962d-dac502259ad0.png

如上的过滤设置好以后,CAN Controller即按如下流程进行标准CAN FD报文的接收。

d87ba7e2-1fd5-11ee-962d-dac502259ad0.png

如上图,当接收设置了过滤以后,会对接收到的报文进行匹配,如果匹配则接收。当然,也可以不配置接收过滤,任意一帧报文均接收,但是,这样会增加CPU的开销。

2、CANFD对应的CAN_H、CAN_L波形

在500Kbps/2000Kbps通信速率下,一帧64Byte数据长度的CANFD报文(CANID 0x55),数据内容0x55或者0xAA,大概需要320us,如下所示:

d89beea8-1fd5-11ee-962d-dac502259ad0.png

利用示波器的Decode功能,对CAN报文进行解码,示例如下:

d8c1f5da-1fd5-11ee-962d-dac502259ad0.png

对应发送的报文如下所示,CAN ID = 0x55,可以对应如上的解析。

d8e3b558-1fd5-11ee-962d-dac502259ad0.png

提示:本文使用的示波器不能解析CANFD,只能解析CAN,如上图,仅仅对Normal段的解析有效。(一)一帧CAN报文的传输用时

如下图,一帧报文传输用时是一个范围,统计如下所示:

d90cd488-1fd5-11ee-962d-dac502259ad0.png

注释:上图来源群内小伙伴的分享,具体出处不详,此处分享做学习使用。 解释:为了确保数据传输的可靠,CAN在传输数据时,每5个相同位会插入一个反向位,也就是位填充(bit stuffing),eg:000001B,这里的1就是因为传输的0超过5个时,插入的反向位。所以,由于一帧CAN报文传输数据的变化,所以,一帧CAN报文传输用时会在一个范围内动态变化,如果CAN ID是0x555(10101010101B)或者0xAA(00010101010B),同时,数据段数据都是0x55或者0xAA,则这帧报文几乎不用额外插入反向位,因此用时更短。如果传输的数据是0x00(00000000B)或者0xFF(11111111B),则需要插入大量的反向位,因此,传输用时更长。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5031

    文章

    18673

    浏览量

    296143
  • CAN
    CAN
    +关注

    关注

    57

    文章

    2621

    浏览量

    461918
  • 编译器
    +关注

    关注

    1

    文章

    1593

    浏览量

    48852
  • TriCore
    +关注

    关注

    0

    文章

    13

    浏览量

    11704
  • CANFD
    +关注

    关注

    0

    文章

    50

    浏览量

    4846

原文标题:基于Tricore的CANFD入门工程

文章出处:【微信号:谈思实验室,微信公众号:谈思实验室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    开发者分享:轻松搞起CANFD

    先楫的 CANFD外设,有两个 CANFD的IP,其中HPM6700系列,HPM6400系列、HPM6300系列使用的是CAN,包括了经典CAN和 CANFD
    的头像 发表于08-01 10:28 1978次阅读
    开发者分享:轻松搞起<b class='flag-5'>CANFD</b>

    玩转先楫CANFD外设系列之一:轻松搞起CANFD

    一、概述先楫的 CANFD外设,有两个 CANFD的IP,其中HPM6700系列,HPM6400系列、HPM6300系列使用的是CAN,包括了经典CAN和 CANFD。而HPM6200系列则使用的MCAN
    的头像 发表于08-02 08:20 2021次阅读
    玩转先楫<b class='flag-5'>CANFD</b>外设系列之一:轻松搞起<b class='flag-5'>CANFD</b>

    求助,关于M467系列CANFD的BSP例程疑问

    CANFD_SetSIDFltr(g_pCanfd, 0, CANFD_RX_BUFFER_STD(0x111, 0)); CANFD_SetSIDFltr(g_pCanfd, 0
    发表于01-16 08:19

    CANFDSDL无法被接收到的原因?

    任何 CANFD消息,如果把 cy_stc_ canfd_config_t 的 .canFDMode 改为 false 就可以收到,是因为 BAUDRATE 与 DATARATE 的关系吗 ?,我应该要填多少 ?,该怎么从代码推算呢 ?
    发表于02-01 07:27

    TC275D系列的芯片支持标准CANFD能配置成非标准CANFD的吗?

    TC275D系列的芯片支持标准 CANFD,是否也能配置成非标准 CANFD的呢,有那位技术人员配置过吗?
    发表于02-06 08:31

    hightec新建工程的向导页面没有TriCore板可选,是否安装失败了?

    hightec新建 工程的向导页面没有 TriCore板可选,是否安装失败了(已添加license)
    发表于02-06 07:05

    请问TASKING VX-toolset forTriCore6.1要多少钱?

    买一套 Tricore开发IDE “TASKING VX-toolset for TriCore6.1 ”要多少银子啊?
    发表于12-17 11:14

    Tricore的flash驱动源码

    一直很忙,很早就想发一个flash驱动上来,一直没机会。 Tricore的FLASH挺大的,不用确实可惜,可以用来存一些掉电不丢失的数据。InfineonFlashSamples_v2:官方
    发表于12-19 10:37

    CANFD节点如何与经典CAN总线正常通信呢?

    CANFD的来源是什么? CANFD有哪几个显著特点? CANFD节点如何与经典CAN总线正常通信呢?
    发表于06-16 09:31

    哪些STM32有CANFD

    目录哪些STM32有 CANFD外设参考文档CAN-FD特性CAN-FD格式CAN 2.0 VS CAN-FDSTM32 FDCAN 外设特性位时间和采样点Message RAM滤波器设置Rx
    发表于08-12 07:21

    配置CANFD模块的注意事项有哪些

    1、配置 CANFD模块的时候,需要使能 CANFD收发器,否则进入 config 后,无法切换为 Normal 模式。2、dsPIC33CK 系列单片机的指令周期与时钟周期的关系是1:2
    发表于11-25 06:10

    硬件工程入门教程

    硬件 工程入门教程硬件 工程入门教程硬件 工程入门教程硬件
    发表于01-05 15:53 256次下载

    Lin收发器原理图 Lin总线学习笔记

    ,已经分享了《基于 TricoreCANFD 入门 工程》、《基于 Tricore的UDP/TCP 入门
    的头像 发表于08-30 16:17 4103次阅读
    Lin收发器原理图 Lin总线学习笔记

    CAN与CANFD的区别 CAN与CANFD如何转换

    CAN与 CANFD的区别 CAN与 CANFD如何转换 CAN(Controller Area Network)是一种广泛应用于汽车和工业控制系统等领域的串行通信协议,用于在不同的设备间传输数据。而
    的头像 发表于11-22 16:37 4736次阅读

    CAN和CANFD协议简介(下)

    CAN和 CANFD协议简介(下)
    的头像 发表于02-19 12:08 199次阅读
    CAN和<b class='flag-5'>CANFD</b>协议简介(下)