为了能够让更多的工程师朋友了解多核异构处置器,飞凌嵌入式特别推出了【玩转多核异构】专题,辅佐大家处置在多核异构处置器的开发过程中遇到的问题。【玩转多核异构】专题持续更新中,欢送您的持续关注。 引言仰仗实时性、抗干扰性战争安性等优点,CAN2.0在工业及汽车行业得到了普遍应用,但其最高速率仅为1Mbit/s,每帧最多只能传输8字节的有效数据,报文中只需约50%的带宽用于有效数据传输。但是随着产业的展开,各种传感器和控制器数量的增加,总线上的数据量也激增,这使得CAN2.0总线在传输速率和带宽方面的缺陷裸露的愈加明显,于是就降生了CAN-FD。 CAN-FD在传输速率和带宽方面有了明显的提升,波特率可高达8Mbit/s,每帧可多达64字节有效数据,传输效率可进步至约80%,能够进一步进步总线的实时性,拓宽总线的数据带宽,提升总线的传输效率。 在飞凌嵌入式OKMX8MP-C开发板上有两路CAN-FD,小编今天就基于这款开发板以处置器的M核与A核各控制一路CAN-FD相互通讯为例,从应用角度讲述M核和A核如何控制CAN-FD高速通讯。 OKMX8MP-C开发板 飞凌嵌入式OKMX8MP-C开发板所搭载的NXP i.MX8M Plus处置用具备强悍的性能,集成4个主频最高可达1.8GHz(工业级主频为1.6GHz) 的Arm Cortex-A53多任务核 和1个Cortex-M7实时核,不论是对数据的高速吞吐、处置,还是复杂的人机交互界面处置,都能冷静应对。 一、M核CAN-FD1. CAN-FD初始化 CAN-FD初始化主要包含总线时钟,管脚和相应寄存器的初始化。细致如下: (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 (2)管脚配置: 选择CAN1的发送管脚为32脚,接纳管脚为34脚。 IOMUXC_SetPinMux(IOMUXC_SAI2_TXC_CAN1_RX, 0U); // CAN1 RX IOMUXC_SetPinMux(IOMUXC_SAI2_RXC_CAN1_TX, 0U); // CAN1 TX (3)CAN波特率: CAN-FD支持可变速率,即控制区和数据区的波特率能够不分歧,控制区最大为1Mbit/s;数据区最大为8Mbit/s。后续程序依据总线时钟和设置的波特率,分配时段设置的seg1,seg2等数值。 pConfig->bitRate = 1000000U; // CAN-FD控制区波特率为1Mbit/s pConfig->bitRateFD = 8000000U; // CAN-FD数据区波特率为8Mbit/s (4)CAN-FD使能: 除了使能CAN-FD,可变波特率也需求使能,否则数据区的最大速率和控制区的速率一样,最大为1Mbit/s。 base->MCR |= CAN_MCR_FDEN_MASK; // CAN-FD使能 fdctrl |= CAN_FDCTRL_FDRATE_MASK; // 可变波特率使能 (5)关闭自回环: 假如开启了自回环,那么CAN1数据会在芯片内回环,不会到外部管脚,在程序调试时能够扫除外部端子的干扰,但真实应用时,需求关闭自回环,从外部管脚收发数据。 pConfig->enableLoopBack = false; // 不回环,运用外部管脚 (6)帧格式: 本次我们运用11位规范数据帧,小同伴也在后续试试扩展帧。需求设置自己的ID,便于总线上其他设备辨认。 mbConfig.format = kFLEXCAN_FrameFormatStandard; // 11位规范帧,非扩展帧 mbConfig.type = kFLEXCAN_FrameTypeData; // 数据帧 非远程帧 mbConfig.id = FLEXCAN_ID_STD(rxIdentifier); // 帧ID 用于区别总线中不同的设备 (7)接纳过滤: 用户可设置接纳过滤规则,这样就能够只接纳特定帧ID的数据,减少应用处置的数据量。 rxIdentifier = 0; FLEXCAN_SetRxMbGlobalMask(EXAMPLE_CAN, FLEXCAN_RX_MB_STD_MASK(rxIdentifier, 0, 0));//接纳一切ID数据 2. CAN-FD收发流程 本次测试M核做主站,CAN1先发送一帧包含64字节数据,A核CAN2收到,将64字节数据再次发送,M核CAN1接纳。对比发送和接纳的64字节数据能否分歧。重复100次。 (1)CAN-FD发送数据: EXAMPLE_CAN表示为CAN1,flexcanHandle为CAN实例,包含了发送接纳回调函数,txXfer为要发送的64字节数据。 FLEXCAN_TransferFDSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer); // CAN-FD发送数据 (2)CAN-FD接纳数据: EXAMPLE_CAN表示为CAN1,flexcanHandle为CAN实例,包含了发送接纳回调函数,rxXfer为接纳的64字节数据。 FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer); // CAN-FD接纳函数 (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); } } 二、A核CAN-FDA核设备树中保存CAN2,内核解析设备树在 /dev下生成can0。设置波特率后使能can0节点,应用程序中open函数翻开接口,write函数发送数据,read函数接纳数据。我们把CAN接口的示例曾经作为一个跨平台的综合演示程序,小同伴们能够直接加参数调用即可。 1. 分配节点 (1)M核独享CAN1,A核独享CAN2,修正设备树,在设备树OK8MP-C.dts中,删除CAN1设备节点,保存CAN2设备节点。编译新的设备树; (2)将生成的OK8MP-C.dtb和Image拷贝至开发板的 /run/media/mmcblk2p1/ 目录下,输入sync命令同步后重启开发板; (3)经过A核串口输入命令uname -r ,显现内核版本,将 /lib/modbule目录下文件夹称号改为内核版本,这样才干自动加载模块生成can0节点,重启开发板。 2. 演示Demo 进程名can_demo 运用措施:./can_demo设备名 [参数选项]… … 本次测试接口为can0(对应开发板CAN2),控制区波特率为1Mbit/s,数据区最大为8Mbit/s,11位规范帧,不外滤帧ID,不主动发数据,不回环。因而命令为: ./can_demo can0-b 1000 -fd 8000。 三、程序考证1. 硬件衔接 运用杜邦线将CAN1和CAN2的can-H短接,同时将can-L短接,留意不要接反。 2. M核程序 修正uboot环境变量设置M核自启动,同时将M核程序forlinx_m7_tcm_firmware.bin; 放到/run/media/mmcblk2p1/目录下。细致操作可看上篇文章《【玩转多核异构】M核程序的启动、编写和仿真》。 3. A核程序 (1)运用串口Xmodem,网络FTP,SCP,U盘,TF卡等多种方式,将can_demo从电脑拷贝至中心板默许目录下,输入以下命令修正权限; chmod 777 can_demo (2)输入以下命令,A核应用程序can_demo将设置波特率后翻开can0节点,等候M核发送的数据,再将接纳的数据经过CAN2发送给M核。 ./can_demo can0 -b 1000 -fd 8000 4. 实践测试 (1)OKMX8MP-C开发板重新上电后,M核程序启动,完成CAN1初始化后,在M核调试串口输出信息,等候按键; (2)在A核调试串口输入以下命令,CAN2将处于接纳的状态: ./can_demo can0 -b 1000 -fd 8000 (3)在M核串口按下键A或a,M核CAN1发送64字节数据,A核CAN2接纳数据,并将接纳的数据再次发送,M核CAN1接纳后和发送数据对比,输出结果。循环100次; (4)经过测试能够看到,依托i.MX8M Plus强大的性能,双核都以8Mbit/s的高速率发送大量数据,均没有呈现异常。 以上就是小编为小同伴带来的基于飞凌嵌入式OKMX8MP-C开发板双核控制CAN-FD的运用措施了,是不是觉得性能很强大呢? |