汽车嵌入式开发,很多时候,想学一些东西(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工作模式。
对应的代码实现如下:
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位域,如下所示:
2、standard message id filter处理 标准can报文的id过滤处理,即:设置每个邮箱过滤报文的范围或者指定一帧或者两帧canid,如下所示:
注意:standard message 0并不是一个具体的寄存器,而是can模块专用的ram区,由实现者根据需要配置所使用的sram大小和起始地址。
而can模块sram区的切割要按照手册要求划分,如下所示:
如上的过滤设置好以后,can controller即按如下流程进行标准can fd报文的接收。
如上图,当接收设置了过滤以后,会对接收到的报文进行匹配,如果匹配则接收。当然,也可以不配置接收过滤,任意一帧报文均接收,但是,这样会增加cpu的开销。
2、canfd对应的can_h、can_l波形
在500kbps/2000kbps通信速率下,一帧64byte数据长度的canfd报文(canid 0x55),数据内容0x55或者0xaa,大概需要320us,如下所示:
利用示波器的decode功能,对can报文进行解码,示例如下:
对应发送的报文如下所示,can id = 0x55,可以对应如上的解析。
提示:本文使用的示波器不能解析canfd,只能解析can,如上图,仅仅对normal段的解析有效。 (一)一帧can报文的传输用时
如下图,一帧报文传输用时是一个范围,统计如下所示:
注释:上图来源群内小伙伴的分享,具体出处不详,此处分享做学习使用。 解释:为了确保数据传输的可靠,can在传输数据时,每5个相同位会插入一个反向位,也就是位填充(bit stuffing),eg:000001b,这里的1就是因为传输的0超过5个时,插入的反向位。所以,由于一帧can报文传输数据的变化,所以,一帧can报文传输用时会在一个范围内动态变化,如果can id是0x555(10101010101b)或者0xaa(00010101010b),同时,数据段数据都是0x55或者0xaa,则这帧报文几乎不用额外插入反向位,因此用时更短。如果传输的数据是0x00(00000000b)或者0xff(11111111b),则需要插入大量的反向位,因此,传输用时更长。
自制土壤湿度计电路图
Feelreal登陆Kickstarter进行众筹 为VR体验者提供更真实的味道反馈
荣耀X30 Max究竟有多大?官方预热海报为你揭晓
坚持经典的黑莓手机,真的不适应这个时代了吗
NVIDIA为HPC和AI加强超级芯片工程
基于Tricore的CANFD入门工程
LCD显示模式与偏光片介绍
中国“龙芯”在航天、车载、3D打印机上的应用
ldd命令:用于打印程序或者共享库文件所依赖的共享库列表
MWC大会上最受关注的四家企业:微软、HTC上榜
区块链产品需要使用后量子密码算法来提高安全性
开源创新 协同融合|2023开放原子全球开源峰会开源协作平台分论坛即将启幕
国产芯片有望实现弯道超车
中国力量正以史无前例的参与度推动这场大变革的发展
实施APS排产系统的步骤有哪些?
智能穿戴设备无线充电接收解决方法图解
睿熙科技:全系列VCSEL芯片量产就绪
智能电表盗窃电能风波频起 双向互动成第三只眼
普源示波器测量中的相位校正
高速图像传感器(ARX3A0)实现用于视觉和人工智能的智能视觉系统