一、概述
先楫的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特征描述。
本文主要介绍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
对于can功能时钟的开启,在hpm6750手册中,默认时钟由时钟源pll1_clk1f五分频得到,pll1_clk1为400m,那么can的功能时钟就为80m.
同样sdk当中也做了相关时钟初始化,参考board_init_can_clock api
(二)波特率设置
对于can差分信号,这里不做阐述,本文统称的高低电平均为逻辑0和1。
跟uart一样,都是需要每个位的的时间确定,保持双方采样的准确。在can的概念中,有一个比较重要的次,bittime(can位时间),这个决定一个bit传输需要的时间,这也决定了波特率。比如一个位传输200ns,那么1s就可以传输100000000(ns)/200(ns) = 5000000bit,也就是5mbps波特率。
在先楫官方hpm6700_hpm6400_um手册当中,对于can位时间有这么一段描述。
可以看到,一个位时序还包括了sync_seg、prop_seg、phase_seg1, phase_seg2。sample point指的是采样点,也就是这段电平保持时间中的采样位置点,比如200ns的位时间,采样点80%,那么就是在160ns中采样决定他是0或者是1。
在iso11898-1:2015中,文档也说明了这部分参数的定义。
这里比较重要的是sync_seg,这部分的位时间指的是同步段,用来同步can总线的节点,若检测到的跳变沿被包含在此段的范围内,那么时序就是同步的,采样点sample_point采样到的电平就是该位的电平。上述可知道,该段的时间固定为1tq,其他段时间均是相位的缓冲段,补偿边沿阶段的误差,保证位电平的稳定和重新同步。具体可看iso文档解释。
如果两个节点位时间不同(各个位段时间不同),也就如果波特率不一样或者差别到一定程度(can的波特率有一定的范围,只要能保证采样点的位置大致相同),那么采样到的数据也有可能不一样。所以对于位时间的各个段的参数需要保持一致,以便通信同步一致。
如果两个节点位时间相同,can控制器会自身保持同步,同步的方式有两种:硬同步和重新同步。
这两种方式都必须遵守以下规则:
(1)、一位时间内(两个采样点之间)只允许一次同步。检测到边沿后,应禁用同步,直到下一次在采样点检测到的总线状态为隐性。
(2)、仅当在前一个采样点检测到的总线状态(前一个读总线状态)为隐性时,边沿才应引起同步
(3)、当节点处于总线集成状态时,在帧间间隔期间(除了间歇的第一位),以及在 canfd 帧内,应在边缘上执行硬同步。也就是在sof上开始硬同步,其他bit都在重新同步。
(4)、满足规则 1 和 2 的所有其他隐性到显性边缘均应用于重新同步,但有一个例外:传输 canfd 帧的节点在传输该帧的数据阶段时不应同步,而采取重新同步。
这里截取了iso文档说明:
1、硬件同步
在以上规则中,我们可以通过检测sof帧起始,sof帧的开始就是在can总线空闲下(连续11个位的隐形电平,也就是逻辑1),一旦有显性电平出现,那就是有sof帧开始,根据上述规则1和2,可以直接使用的是硬同步。硬同步会强制把位时间拉至边沿,保持同步。这个阶段不受同步跳转宽度sjw限制。
iso文档同样也有说明:
比如:以下波形,当检测到sof时候,can控制器需要满足iso标准,执行硬同步。
2、重新同步
如果在仲裁段相当比较长的时间内,比如id段,连续的传输会带来相位的左右偏移,这时候就需要重新同步了。这时候就需要sjw,对seg1和seg2适当进行延长或缩短一定的tq。
这看起来有点难理解,那么还是以时序图来说明,以相位超前超后例子。
相位超前,can控制器会根据sjw同步跳转宽度进行加入对应的tq,使之sync_seg段能同步到下一个边沿。
相位超后,can控制器会根据sjw同步跳转宽度进行减少对应的tq,使之sync_seg段能同步到下一个边沿。
在上面的阐述中,采样点的取值范围尤为重要,对于同步上也是比较关键的参数,在iso中并无此建议值,但是在hpm_sdk中有提及,建议是75%到87.5%。
从上面讲了一大堆,其实上面所阐述的一些同步均由can控制器实现,但是为了方便理解软件开发,是有必要了解。
can的位时序涉及到can时基、sync_seq、sjw、seg1和seg2。在先楫当中也有涉及到这些寄存器,分为仲裁段(标称位)和数据段位。需要注意的是:
先楫的can的seq1包括了位时序的sync_seg+prog_seg+phase_seq1。
先楫的can的seq2是位时序的phase_seq2。
根据iso规定,sjw不计入到位时序中。
3、hpm_sdk的波特率设置api
sdk的can驱动的波特率设置,写的比较贴心,提供了两种方式来设置。一种是直接代入实际的波特率,第二种是自己写入位时序参数。根据use_lowlevel_timing_setting这个变量来决定哪种方式。
如果需要使能canfd,则需要开启enable_canfd,超过1m的数据段波特率,建议开启enable_tdc。
这些参数的成员说明可以查看sdk的can_config_t结构体,这里不做阐述。
对于直接代入实际的波特率的方式,sdk使用iso文档建议的位时序参数,适合通用的场合。
sdk中,根据波特率转换成对应的位时序参数。api接口是can_set_bit_timing。里面调用了can_calculate_bit_timing这个api得出位时序参数带入到can的对应寄存器中,完成波特率的设置。
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文档的截图理解:
上述提到,对于接收来说,有16个fifo;对于发送来说,有8个副发送缓冲器。这样对于收发来说是相当足够的。
在sdk当中,收发都提供了非阻塞和阻塞接口,分别对应的后缀是_noblocking或者blocking。
接收阻塞api:can_receive_message_blocking
接收非阻塞api:can_read_received_message
建议使用非阻塞api,开启接收中断以及满fifo中断。在中断读取fifo数量,最大性能提取数据,然后依次调用can_read_received_message。比如:
对于发送:
阻塞接口:can_send_message_blocking
非阻塞接口:can_send_message_nonblocking
建议使用非阻塞接口,每次调用前判断发送缓冲器是否满,然后依次调用can_send_message_nonblocking塞入数据。比如:
(四)实现效果
hpm6750的四路canfd,在500k仲裁段5m数据段的波特率下,可以几乎跑满载。
实验平台:hpm6750evkmini+stephen大佬开发的canfd适配扩展板。
三、总结
对于can的,本文主要阐述波特率设置、数据收发流程。其他的比如过滤器组设置、总线错误等后续再阐述。
先楫hpm_sdk对于can驱动,相关api接口以及结构体定义比较清晰,容易入手使用。
先楫的canfd的收发自带fifo缓存器,开发者可以根据需求使用,可以提高收发性能,达到满载测试性能。
汽车芯片的卡脖子问题要比手机更加严峻、更加重大
鸿利智汇与九洲光电签订战略合作协议
微信小程序真的是微信开创吗?还记得支付宝服务窗吗
税率降了3个点,机器人价格也要降3个点吗?
MEMS加速度计一般用在哪里?
玩转先楫CANFD外设系列之一:轻松搞起CANFD
全国区块链服务怎样来部署
变色龙家居是怎么一回事
苹果8上市最新消息:iPhone8中国版价格是多少?
亚马逊云科技Chad Woolf:如何在云中实现安全与合规的规模化?
变压器:空载试验和负载试验
太龙照明拟募资4.2亿收购博思达
电工是如何把线整理整齐的
2018上半年大运营商新获得9082万个4G用户,正式进入大流量、低资费竞争
Type-C分线器只为与你初次相遇
GCD-050位移传感器有哪几种?
氮化镓和碳化硅谁将赢得宽带隙之战?
能量收集功率转换的进展
浅析编码器在风电行业中的应用原理
逆变电源是什么意思?作用是什么?