找回密码
 注册
关于网站域名变更的通知
查看: 485|回复: 1
打印 上一主题 下一主题

双核高速率CAN-FD评测

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-2-17 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

凭借实时性、抗干扰性和安全性等优点,CAN2.0在工业及汽车行业得到了广泛应用,但其最高速率仅为1Mbit/s,每帧最多只能传输8字节的有效数据,报文中只有约50%的带宽用于有效数据传输。然而随着产业的发展,各种传感器和控制器数量的增多,总线上的数据量也激增,这使得CAN2.0总线在传输速率和带宽方面的缺点暴露的更加明显,于是就诞生了CAN-FD。

0 _' D' U4 @. n  P1 Z- a5 j

CAN-FD在传输速率和带宽方面有了明显的提升,波特率可高达8Mbit/s,每帧可多达64字节有效数据,传输效率可提高至约80%,能够进一步提高总线的实时性,拓宽总线的数据带宽,提升总线的传输效率。


! a$ s4 J- |, X/ Y

在飞凌嵌入式OKMX8MP-C开发板上有两路CAN-FD,小编今天就基于这款开发板以处理器的M核与A核各控制一路CAN-FD互相通信为例,从应用角度讲述M核和A核如何控制CAN-FD高速通信。

4 S8 V4 d. v; A: I- N# q4 f
+ r$ P( W% t5 H" g: \+ I

7 d$ \/ K- o7 |* S* \' k

飞凌嵌入式OKMX8MP-C开发板所搭载的NXP i.MX8M Plus处理器具备强悍的性能,集成4个主频最高可达1.8GHz (工业级主频为1.6GHz)的ARM Cortex-A53多任务核和1个Cortex-M7实时核,不管是对数据的高速吞吐、处理,还是复杂的人机交互界面处理,都能从容应对。


( d% ^/ r: S% w/ K; [& v

01

M核CAN-FD

1. CAN-FD初始化

CAN-FD初始化主要包括总线时钟,管脚和相应寄存器的初始化。具体如下:


& o3 F8 D1 V) F8 G! V0 _

(1)CAN总线时钟:

现将CAN总线倍频到800MHz,再10分频到80MHz。

CLOCK_SetRootMux(kCLOCK_RootFlexCan1, kCLOCK_FlexCanRootmuxSysPll1); // 设置CAN1总线时钟为800MHz  CLOCK_SetRootDivider(kCLOCK_RootFlexCan1, 2U, 5U);   // 分频因子为2*5=10,设置CAN1总线时钟为80MHz
7 r" f6 K) @, _( g1 h' C8 H1 `

(2)管脚配置:

选择CAN1的发送管脚为32脚,接收管脚为34脚。

IOMUXC_SetPinMux(IOMUXC_SAI2_TXC_CAN1_RX, 0U); // CAN1 RX  IOMUXC_SetPinMux(IOMUXC_SAI2_RXC_CAN1_TX, 0U); // CAN1 TX
! }* g+ B6 f0 Z  |

(3)CAN波特率:

CAN-FD支持可变速率,即控制区和数据区的波特率可以不一致,控制区最大为1Mbit/s;数据区最大为8Mbit/s。后续程序根据总线时钟和设置的波特率,分配时段设置的seg1,seg2等数值。

pConfig->bitRate = 1000000U;   // CAN-FD控制区波特率为1Mbit/s  pConfig->bitRateFD = 8000000U;   // CAN-FD数据区波特率为8Mbit/s
( V9 k) Y. b# p- F# z# d

(4)CAN-FD使能:

除了使能CAN-FD,可变波特率也需要使能,否则数据区的最大速率和控制区的速率一样,最大为1Mbit/s。

base->MCR |= CAN_MCR_FDEN_MASK;  // CAN-FD使能  fdctrl |= CAN_FDCTRL_FDRATE_MASK; // 可变波特率使能: g7 F  |  G/ u7 ]3 ?' Z" @3 Y% V

(5)关闭自回环:

如果开启了自回环,那么CAN1数据会在芯片内回环,不会到外部管脚,在程序调试时可以排除外部端子的干扰,但真实应用时,需要关闭自回环,从外部管脚收发数据。

pConfig->enableLoopBack       = false; // 不回环,使用外部管脚
8 p# t" b6 N" Y$ A  o5 I

(6)帧格式:

本次我们使用11位标准数据帧,小伙伴也在后续试试扩展帧。需要设置自己的ID,便于总线上其他设备识别。

mbConfig.format = kFLEXCAN_FrameFormatStandard; // 11位标准帧,非扩展帧  mbConfig.type   = kFLEXCAN_FrameTypeData;       // 数据帧 非远程帧      mbConfig.id     = FLEXCAN_ID_STD(rxIdentifier); // 帧ID 用于区别总线中不同的设备4 L8 Q9 _* r$ W. `$ D4 c* e- v

(7)接收过滤:

用户可设置接收过滤规则,这样就可以只接收特定帧ID的数据,减少应用处理的数据量。

rxIdentifier = 0;FLEXCAN_SetRxMbGlobalMask(EXAMPLE_CAN, FLEXCAN_RX_MB_STD_MASK(rxIdentifier, 0, 0));//接收所有ID数据
& ?* ?' |0 u7 I4 q$ g% ^0 C# Q% ?

2. CAN-FD收发流程

本次测试M核做主站,CAN1先发送一帧包含64字节数据,A核CAN2收到,将64字节数据再次发送,M核CAN1接收。对比发送和接收的64字节数据是否一致。重复100次。

; i) I  y1 y5 X# ^* \! x

(1)CAN-FD发送数据:

EXAMPLE_CAN表示为CAN1,flexcanHandle为CAN实例,包含了发送接收回调函数,txXfer为要发送的64字节数据。

FLEXCAN_TransfeRFDSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer);   // CAN-FD发送数据  $ e: P: E+ R5 |+ o9 E2 ~

(2)CAN-FD接收数据:

EXAMPLE_CAN表示为CAN1,flexcanHandle为CAN实例,包含了发送接收回调函数,rxXfer为接收的64字节数据。

FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer); // CAN-FD接收函数
( Q/ d3 s4 e4 n- T" o8 y) l, I- M6 h

(3)接收和发送数据对比:

for (j = 0U; j <= DLC; j++) // 对比收发数据,不一致打印  {    if(txXfer.framefd->dataWord[j] != rxXfer.framefd->dataWord[j])      {          LOG_INFO("Data mismatch !!! j=%d \r\n",j);      }  }! F# U- i) `& I7 N  |( ^. ^* L, p% L

02

A核CAN-FD

A核设备树中保留CAN2,内核解析设备树在 /dev下生成can0。设置波特率后使能can0节点,应用程序中open函数打开接口,write函数发送数据,read函数接收数据。我们把CAN接口的示例已经作为一个跨平台的综合演示程序,小伙伴们可以直接加参数调用即可。

/ U4 p* s6 a& }# O4 [7 ?6 p

1. 分配节点

(1)M核独享CAN1,A核独享CAN2,修改设备树,在设备树OK8MP-C.dts中,删除CAN1设备节点,保留CAN2设备节点。编译新的设备树;

& [9 s) E0 n+ W5 k- F- x+ N

(2)将生成的OK8MP-C.dtb和Image拷贝至开发板的

/run/media/mmcblk2p1/ 目录下,输入sync命令同步后重启开发板;

5 X4 n6 g6 I) B: p" }/ o

(3)通过A核串口输入命令uname -r ,显示内核版本,将 /lib/modbule目录下文件夹名称改为内核版本,这样才能自动加载模块生成can0节点,重启开发板。

/ m5 Q" R5 F  ?# s* x* r

; C, n6 k- F% y3 k$ P) d

1 s1 J. w. H' y" V# o7 Q2 m; W- D7 v' d# w

% ~$ h, e# {1 b3 P0 q6 o+ j

& D1 S' X. s) o7 C

2. 演示Demo

进程名:can_demo8 f4 l* U5 g$ Y% ~6 O
使用方法:./can_demo设备名 [参数选项]… …

9 y  R% G. c. n9 K
! H, f1 ~4 U+ j2 E
: ], Z9 R6 W' g* W* x

本次测试接口为can0(对应开发板CAN2),控制区波特率为1Mbit/s,数据区最大为8Mbit/s,11位标准帧,不过滤帧ID,不主动发数据,不回环。因此命令为:


  • ! m% H% E- @! N( }. u; ~* O$ s- S1 [  h) j) d1 `% B  Q
./can_demo can0-b 1000 -fd 8000。
/ N( d& j& Q8 q3 {/ M" G

03

程序验证

1. 硬件连接

使用杜邦线将CAN1和CAN2的can-H短接,同时将can-L短接,注意不要接反。

. k9 s2 ~: I7 J# b$ I# S
/ c: u0 B0 A$ N: I+ G* c& Z) H
) G( B) W5 }; a& ?. U, k7 m

2. M核程序

修改uboot环境变量设置M核自启动,同时将M核程序forlinx_m7_tcm_firmware.bin;

放到/run/media/mmcblk2p1/目录下。详细操作可看上篇文章《【玩转多核异构】M核程序的启动、编写和仿真》


+ |* Z5 B- ^3 {; q; a2 {

3. A核程序

(1)使用串口Xmodem,网络FTP,SCP,U盘,TF卡等多种方式,将can_demo从电脑拷贝至核心板默认目录下,输入以下命令修改权限;

  • ; G8 N8 b/ d! T# C( C& C
    5 ^0 ]% f( d4 m9 {7 I. K+ K
chmod 777 can_demo
) _* s, J! r' B- g+ \* C: q

(2)输入以下命令,A核应用程序can_demo将设置波特率后打开can0节点,等待M核发送的数据,再将接收的数据通过CAN2发送给M核。

  • $ _6 o3 S" Q; n1 y5 e8 D& }8 _: O
    $ i$ t% c7 O! V' c! E
./can_demo can0 -b 1000 -fd 8000
; i1 Y! ^$ }9 P  B3 i

4. 实际测试

(1)OKMX8MP-C开发板重新上电后,M核程序启动,完成CAN1初始化后,在M核调试串口输出信息,等待按键;


2 L- f" H* i) ?

(2)在A核调试串口输入以下命令,CAN2将处于接收的状态:


  • 0 c- `/ |% h5 k0 h0 G5 N
    ( M1 l4 Y! {; l- p4 J0 t' b# I
./can_demo can0 -b 1000 -fd 8000
4 O' Y6 y/ j' ~( [( Z  P

(3)在M核串口按下键A或a,M核CAN1发送64字节数据,A核CAN2接收数据,并将接收的数据再次发送,M核CAN1接收后和发送数据对比,输出结果。循环100次;


5 L. m; Q$ O* M$ I- I  X$ Z

(4)通过测试可以看到,依托i.MX8M Plus强大的性能,双核都以8Mbit/s的高速率发送大量数据,均没有出现异常。

  D) m# l, i5 I; e

; Q% f( q) ~$ W2 s5 s
; S, _+ M1 P( U% M$ _& w
' k' \  `) P& U! [6 b+ @: D

该用户从未签到

2#
发表于 2023-2-17 16:50 | 只看该作者
高速通讯最大能达到20Gbp的传输速度。也就是目前LTE的1000倍大容量传送能力。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 13:50 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表