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

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

3天内不再提示

开发者分享:轻松搞起CANFD

331062281 来源:先楫半导体HPMicro 2023-08-01 10:28 次阅读

一、概述

先楫的CANFD外设,有两个CANFD的IP,其中HPM6700系列,HPM6400系列、HPM6300系列使用的是CAN,包括了经典CAN和CANFD。而HPM6200系列则使用的MCAN系列,同样也包括了经典CAN和CANFD。两个CANFD有所差异,hpm_sdk也分为了两个驱动文件,但基本的操作接口保持一致。

本文阐述HPM6700系列,HPM6400系列、HPM6300系列的CAN,这里就统称为CAN。MCAN部分后续文章阐述。

先楫的CAN外设功能比较丰富,比如涉及到各种CAN模式、CAN错误警告提示、时间戳等等。可以看看手册CAN特征描述。

035e4882-3013-11ee-9e74-dac502259ad0.png

本文主要介绍CAN的基础配置(引脚时钟初始化,波特率设置,正常模式下的收发流程),其他的功能可参考hpm_sdk,后续根据需要也会进行文章阐述。

本文以hpm_sdk的操作接口API为例子,进而介绍CAN的相关知识。

关于更多的CAN/CANFD知识可以访问CIA官网,spec文档可以参考ISO11898-1-2015。本文部分阐述都是基于CIA和ISO的描述参考。

二、实现流程

hpm_sdk中,关于can的例子在samples/drivers/can。使用的板子为hpm6750evk2.

(一)引脚初始化和功能时钟初始化

对于CAN的引脚初始化,极其简单,只需要把引脚复用为CAN功能即可。参考hpm6750evk2的board中的CAN初始化。参考board_init_can API

03a598cc-3013-11ee-9e74-dac502259ad0.png

对于CAN功能时钟的开启,在hpm6750手册中,默认时钟由时钟源PLL1_CLK1F五分频得到,PLL1_CLK1为400M,那么CAN的功能时钟就为80M.

03d44f28-3013-11ee-9e74-dac502259ad0.png

同样sdk当中也做了相关时钟初始化,参考board_init_can_clock API

04060806-3013-11ee-9e74-dac502259ad0.png

(二)波特率设置

对于CAN差分信号,这里不做阐述,本文统称的高低电平均为逻辑0和1。

uart一样,都是需要每个位的的时间确定,保持双方采样的准确。在CAN的概念中,有一个比较重要的次,BitTime(CAN位时间),这个决定一个bit传输需要的时间,这也决定了波特率。比如一个位传输200ns,那么1S就可以传输100000000(ns)/200(ns) = 5000000bit,也就是5Mbps波特率。

在先楫官方HPM6700_HPM6400_UM手册当中,对于CAN位时间有这么一段描述。

0416e842-3013-11ee-9e74-dac502259ad0.png

可以看到,一个位时序还包括了Sync_seg、Prop_Seg、Phase_Seg1, Phase_Seg2。Sample point指的是采样点,也就是这段电平保持时间中的采样位置点,比如200ns的位时间,采样点80%,那么就是在160ns中采样决定他是0或者是1。

在ISO11898-1:2015中,文档也说明了这部分参数的定义。

0432c800-3013-11ee-9e74-dac502259ad0.png

04a08890-3013-11ee-9e74-dac502259ad0.png

这里比较重要的是Sync_Seg,这部分的位时间指的是同步段,用来同步CAN总线的节点,若检测到的跳变沿被包含在此段的范围内,那么时序就是同步的,采样点sample_point采样到的电平就是该位的电平。上述可知道,该段的时间固定为1TQ,其他段时间均是相位的缓冲段,补偿边沿阶段的误差,保证位电平的稳定和重新同步。具体可看ISO文档解释。

如果两个节点位时间不同(各个位段时间不同),也就如果波特率不一样或者差别到一定程度(CAN的波特率有一定的范围,只要能保证采样点的位置大致相同),那么采样到的数据也有可能不一样。所以对于位时间的各个段的参数需要保持一致,以便通信同步一致。

04dfdb44-3013-11ee-9e74-dac502259ad0.png

如果两个节点位时间相同,CAN控制器会自身保持同步,同步的方式有两种:硬同步和重新同步。

这两种方式都必须遵守以下规则:

(1)、一位时间内(两个采样点之间)只允许一次同步。检测到边沿后,应禁用同步,直到下一次在采样点检测到的总线状态为隐性。

(2)、仅当在前一个采样点检测到的总线状态(前一个读总线状态)为隐性时,边沿才应引起同步

(3)、当节点处于总线集成状态时,在帧间间隔期间(除了间歇的第一位),以及在 CANFD 帧内,应在边缘上执行硬同步。也就是在SOF上开始硬同步,其他bit都在重新同步。

(4)、满足规则 1 和 2 的所有其他隐性到显性边缘均应用于重新同步,但有一个例外:传输 CANFD 帧的节点在传输该帧的数据阶段时不应同步,而采取重新同步。

这里截取了ISO文档说明:

052841fe-3013-11ee-9e74-dac502259ad0.png

1、硬件同步

在以上规则中,我们可以通过检测SOF帧起始,SOF帧的开始就是在CAN总线空闲下(连续11个位的隐形电平,也就是逻辑1),一旦有显性电平出现,那就是有SOF帧开始,根据上述规则1和2,可以直接使用的是硬同步。硬同步会强制把位时间拉至边沿,保持同步。这个阶段不受同步跳转宽度SJW限制。

ISO文档同样也有说明:

06119b88-3013-11ee-9e74-dac502259ad0.png

比如:以下波形,当检测到SOF时候,CAN控制器需要满足ISO标准,执行硬同步。

0636b5bc-3013-11ee-9e74-dac502259ad0.png

2、重新同步

如果在仲裁段相当比较长的时间内,比如ID段,连续的传输会带来相位的左右偏移,这时候就需要重新同步了。这时候就需要SJW,对seg1和seg2适当进行延长或缩短一定的TQ。

066449fa-3013-11ee-9e74-dac502259ad0.png

0699bdd8-3013-11ee-9e74-dac502259ad0.png

06c9b07e-3013-11ee-9e74-dac502259ad0.png

这看起来有点难理解,那么还是以时序图来说明,以相位超前超后例子。

相位超前,CAN控制器会根据sjw同步跳转宽度进行加入对应的TQ,使之sync_seg段能同步到下一个边沿。

0732f6ce-3013-11ee-9e74-dac502259ad0.png

相位超后,CAN控制器会根据sjw同步跳转宽度进行减少对应的TQ,使之sync_seg段能同步到下一个边沿。

073f9fc8-3013-11ee-9e74-dac502259ad0.png

在上面的阐述中,采样点的取值范围尤为重要,对于同步上也是比较关键的参数,在ISO中并无此建议值,但是在hpm_sdk中有提及,建议是75%到87.5%。

078dadbc-3013-11ee-9e74-dac502259ad0.png

从上面讲了一大堆,其实上面所阐述的一些同步均由CAN控制器实现,但是为了方便理解软件开发,是有必要了解。

CAN的位时序涉及到CAN时基、sync_seq、sjw、seg1和seg2。在先楫当中也有涉及到这些寄存器,分为仲裁段(标称位)和数据段位。需要注意的是:

先楫的CAN的seq1包括了位时序的sync_seg+prog_seg+phase_seq1。

先楫的CAN的seq2是位时序的phase_seq2。

根据ISO规定,sjw不计入到位时序中。

079de4ac-3013-11ee-9e74-dac502259ad0.png

3、hpm_sdk的波特率设置API

sdk的CAN驱动的波特率设置,写的比较贴心,提供了两种方式来设置。一种是直接代入实际的波特率,第二种是自己写入位时序参数。根据use_lowlevel_timing_setting这个变量来决定哪种方式。

如果需要使能CANFD,则需要开启enable_canfd,超过1M的数据段波特率,建议开启enable_tdc。

这些参数的成员说明可以查看SDK的can_config_t结构体,这里不做阐述。

07f353d8-3013-11ee-9e74-dac502259ad0.png

对于直接代入实际的波特率的方式,sdk使用ISO文档建议的位时序参数,适合通用的场合。

08417dba-3013-11ee-9e74-dac502259ad0.png

0867f40e-3013-11ee-9e74-dac502259ad0.png

SDK中,根据波特率转换成对应的位时序参数。API接口是can_set_bit_timing。里面调用了can_calculate_bit_timing这个API得出位时序参数带入到CAN的对应寄存器中,完成波特率的设置。

08b09c40-3013-11ee-9e74-dac502259ad0.png

can_calculate_bit_timing根据波特率和CAN时钟先算出TQ和分频系数相乘值num_tq_mul_prescaler,然后依次代入分频系数直到算出tq和分频系数等于num_tq_mul_prescaler,得出一个位时序的TQ数量,再根据采样点范围算出SEQ1和SEQ2,但会再匹配ISO建议的位时序参数的对应最小和最大值,保证在此范围内。否则返回错误。

需要注意的是:

先楫的这个CAN外设的CANFD支持非ISO标准和ISO标准,也就是enable_can_fd_iso_mode,sdk默认是使用ISO标准,需要使用can_get_default_config这个API初始化参数。否则可能就是非ISO标准。

非ISO标准和ISO标准,对于经典CAN不受影响,但是CANFD会报CRC错误。

(三)收发数据流程

对于CAN帧结构,这里不做阐述。调用ISO文档的截图理解:

08e40760-3013-11ee-9e74-dac502259ad0.png

090ff5f0-3013-11ee-9e74-dac502259ad0.png

上述提到,对于接收来说,有16个FIFO;对于发送来说,有8个副发送缓冲器。这样对于收发来说是相当足够的。

在sdk当中,收发都提供了非阻塞和阻塞接口,分别对应的后缀是_noblocking或者blocking。

接收阻塞API:can_receive_message_blocking

接收非阻塞API:can_read_received_message

建议使用非阻塞API,开启接收中断以及满FIFO中断。在中断读取FIFO数量,最大性能提取数据,然后依次调用can_read_received_message。比如:

09382f34-3013-11ee-9e74-dac502259ad0.png

对于发送:

阻塞接口:can_send_message_blocking

非阻塞接口:can_send_message_nonblocking

建议使用非阻塞接口,每次调用前判断发送缓冲器是否满,然后依次调用can_send_message_nonblocking塞入数据。比如:

0950df52-3013-11ee-9e74-dac502259ad0.png

(四)实现效果

HPM6750的四路CANFD,在500K仲裁段5M数据段的波特率下,可以几乎跑满载。

097132c0-3013-11ee-9e74-dac502259ad0.png

实验平台:hpm6750evkmini+stephen大佬开发的CANFD适配扩展板。

三、总结

对于CAN的,本文主要阐述波特率设置、数据收发流程。其他的比如过滤器组设置、总线错误等后续再阐述。

先楫HPM_SDK对于CAN驱动,相关API接口以及结构体定义比较清晰,容易入手使用。

先楫的CANFD的收发自带FIFO缓存器,开发者可以根据需求使用,可以提高收发性能,达到满载测试性能。





审核编辑:刘清

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

    关注

    145

    文章

    1946

    浏览量

    130726
  • CAN控制器
    +关注

    关注

    3

    文章

    74

    浏览量

    15031
  • PLL电路
    +关注

    关注

    0

    文章

    92

    浏览量

    6403
  • CANFD
    +关注

    关注

    0

    文章

    57

    浏览量

    4938
  • HPM6750
    +关注

    关注

    0

    文章

    2

    浏览量

    90

原文标题:开发者分享:[玩转先楫CANFD外设系列之一]轻松搞起CANFD

文章出处:【微信号:HPMicro,微信公众号:先楫半导体HPMicro】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

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

    OpenHarmony开发者文档

    此工程存放OpenHarmony提供的快速入门、开发指南、API参考等开发者文档,欢迎参与OpenHarmony开发者文档开源项目,与我们一起完善开发者文档。View English文
    发表于 04-23 18:08

    喜报|HarmonyOS开发者社区连获业内奖项,持续深耕开发者生态

    临近年末,各大平台陆续揭晓年度榜单,表彰了具备强大影响力与做出突出贡献的优秀项目与团队,而HarmonyOS开发者社区作为技术分享,学习和展示的平台,输出高质量技术文章百余篇,连续获得业内各大
    发表于 01-19 14:32

    华为开发者大会2021:鸿蒙轻松实现操作系统灵活组装

    华为开发者大会2021正在进行中,重磅亮相的鸿蒙系统可以轻松实现操作系统灵活组装,全新harmony OS助力智能车舱实现全新生态。
    的头像 发表于 10-22 15:05 1257次阅读
    华为<b class='flag-5'>开发者</b>大会2021:鸿蒙<b class='flag-5'>轻松</b>实现操作系统灵活组装

    华为2021开发者大会最新消息

    华为开发者大会2021在中国松山湖举行,会上,华为公司基于OpenHarmony提供了HarmonyOS和鸿蒙智联,备开发者可以根据不同硬件灵活选择组件,轻松完成操作系统组装。
    的头像 发表于 10-26 14:20 2210次阅读

    OPPO开发者大会:开发者需要以用户为中心进行开发

    OPPO开发者大会:开发者需要以用户为中心进行开发 OPPO开发者大会刘畅表示,万物互融时代泛在开发者需要以用户为中心进行
    的头像 发表于 10-27 10:44 1650次阅读
    OPPO<b class='flag-5'>开发者</b>大会:<b class='flag-5'>开发者</b>需要以用户为中心进行<b class='flag-5'>开发</b>

    OPPO开发者大会:OPPO将持续为开发者提供帮助

    2021 OPPO开发者大会刘畅表示;OPPO将为开发者提供技术来保障开发者,提供全链路的运营发展。
    的头像 发表于 10-27 10:45 1474次阅读
    OPPO<b class='flag-5'>开发者</b>大会:OPPO将持续为<b class='flag-5'>开发者</b>提供帮助

    2021 OPPO开发者大会主会场:ColorOS与开发者携手共行

    2021 OPPO开发者大会主会场:ColorOS与开发者携手共行
    的头像 发表于 10-27 10:51 1667次阅读
    2021 OPPO<b class='flag-5'>开发者</b>大会主会场:ColorOS与<b class='flag-5'>开发者</b>携手共行

    2021 OPPO开发者大会:异构计算开发者价值

    2021 OPPO开发者大会:异构计算开发者价值 2021 OPPO开发者大会上介绍了异构计算开发者价值。 责任编辑:haq
    的头像 发表于 10-27 11:10 1817次阅读
    2021 OPPO<b class='flag-5'>开发者</b>大会:异构计算<b class='flag-5'>开发者</b>价值

    2021 OPPO开发者大会主会场:邀请开发者共建小布生态

    2021 OPPO开发者大会主会场:邀请开发者共建小布生态
    的头像 发表于 10-27 11:24 1732次阅读
    2021 OPPO<b class='flag-5'>开发者</b>大会主会场:邀请<b class='flag-5'>开发者</b>共建小布生态

    OPPO开发者大会2021:OPPO与开发者携手,推进生态变革

     2021 OPPO开发者大会主会场:OPPO与开发者携手,推进生态变革。
    的头像 发表于 10-27 11:31 2413次阅读
    OPPO<b class='flag-5'>开发者</b>大会2021:OPPO与<b class='flag-5'>开发者</b>携手,推进生态变革

    2021年OPPO开发者大会:赋能开发者

    小布开放平台将为软硬件开发者提供AI基础能力支撑,全面降低开发者运用AI核心能力进行开发的门槛,赋能开发者
    的头像 发表于 10-27 14:17 1398次阅读
    2021年OPPO<b class='flag-5'>开发者</b>大会:赋能<b class='flag-5'>开发者</b>

    2021 OPPO开发者大会:小布开发者平台生态

    2021 OPPO开发者大会:小布开发者平台生态 2021 OPPO开发者大会上介绍了小布开发者平台生态。 责任编辑:haq
    的头像 发表于 10-27 14:33 2357次阅读
    2021 OPPO<b class='flag-5'>开发者</b>大会:小布<b class='flag-5'>开发者</b>平台生态

    2021 OPPO开发者大会:OPPO满足开发者需求

    2021 OPPO开发者大会:OPPO满足开发者需求 2021 OPPO开发者大会上介绍了开发者需求以及OPPO可提供的资源。 责任编辑:haq
    的头像 发表于 10-27 14:40 3315次阅读
    2021 OPPO<b class='flag-5'>开发者</b>大会:OPPO满足<b class='flag-5'>开发者</b>需求

    涂鸦开发者大会即将开幕,赋能开发者打造IoT发展新引擎

    6月29日,首场TUYA开发者大会将在深圳拉开序幕!‍‍‍‍‍TUYA开发者大会是涂鸦继全球智能化商业峰会、全球硬科技开发者大会后,面向全球开发者举办的又一场备受瞩目的IoT领域顶级盛
    的头像 发表于 06-12 10:15 698次阅读
    涂鸦<b class='flag-5'>开发者</b>大会即将开幕,赋能<b class='flag-5'>开发者</b>打造IoT发展新引擎