CAN-FD总线协议具有较高的有效数据速率,并被广泛用于汽车内部总线。 本文介绍了基于Cortex-M0处理器的CAN-FD协议控制器驱动程序的设计,详细分析了CAN-FD驱动程序的开发过程,通过与其他CAN-FD节点通信实现多节点通信,并利用CAN-FD分析仪和逻辑分析仪在物理总线上对CAN-FD帧进行抓取。通过实际的CAN-FD通信项目,本文完成了被驱动的设计过程,并为其他CAN-FD设备的被驱动设计提供了参考价值。
与传统CAN协议相比,CAN- FD具有更快的数据传输速率和更灵活有效的数据传输。与CAN协议每帧8字节的传输效率不同,CAN- FD可以将传输数据提高到最高64字节。 同时,传输效率也得到了提高。CAN-FD可以安装在低功耗芯片Cortex-M0上,这样可以有效地降低功耗。
本文设计的架构以Cortex-M0为核心处理器,Cortex-M0处理器采用的片上互连总线是AMBA总线,包括高速总线AHB和低速总线APB。 CAN-FD协议控制器IP是APB总线的外设之一,其余包括TIMER、串口、看门狗和CAN-FD协议控制器专用的消息RAM,如图1所示。在这个系统结构中,Cortex-M0是AHB总线的主要模块,它负责启动读写操作。AHB-APB桥是AHB总线的从属模块,APB总线的主模块,其他外围接口和模块是从属模块[4]-[5]。
核心的CAN-FD协议控制器包括以下模块:CAN-FD位定时模块,位数据流处理器模块,寄存器管理模块。作为APB的外围设备之一,CAN-FD的消息RAM也控制着CAN帧的信息,包括ID、ID类型、数据和其他消息的存储,如图2所示。
CAN-FD控制器通过信号'CAN_FD_TX'向外部发送数据,通过CAN-FD收发器接收数据,并通过模拟模块产生'CAN_H'和'CAN_L'作为物理总线的信号,与总线上的其他节点进行通信。 同时,CAN-FD收发器也接收总线数据并将数据传输给CAN-FD控制器。CAN-FD控制器通过 "CAN_FD_RX "将收到的信号作为输入。
图1. 基于Cortex-M0处理器的SOC架构。
图2. CAN-FD协议控制器结构。
III.执行情况
CAN-FD驱动的设计包括两个方面:函数库的设计和调用以及主函数的设计。函数库设计就是编写各种接口的函数,方便在嵌入式设计中直接调用。 本文的功能库设计包括设备的初始化和信息RAM地址的计算; 主要功能部分包括CAN-FD帧数据的发送和接收、串口的信息打印、数据存储和系统中断。驱动设计思路如图3所示。
图3. CAN-FD设备驱动程序的设计思路。
通过用一个结构来封装其他结构指针,可以更容易地管理资源。本文的主要结构如下:
上述结构由寄存器表、初始化结构、消息内存管理结构、CAN-FD通信状态结构、CAN-FD设备锁结构和CAN-FD错误代码组成。结构的设计提高了驱动程序代码的可移植性,函数调用结构成员时更加方便,提高了代码的可读性。同时,其他结构指针也被封装在该结构中,如结构中的'FDCAN_GlobalTypeDef'结构,其组成如下:
当驱动程序要配置CAN-FD设备的一个寄存器时,可以直接通过该结构进行配置。
B.驱动设计
本文中CAN-FD驱动的设计和编译是在Linux系统环境下完成的,编译软件是ARMCC编译器。
图4. 初始化过程
·初始化
Void FDCAN_init (int * btl)'(CAN-FD设备的初始化函数)用于配置CAN-FD初始化相关的寄存器,
包括初始化帧格式、节点的CAN-FD模式、额定比特和数据比特率、接收发送FIFO、接收滤波器等,初始化过程见图4。
·发送和接收
CAN-FD驱动程序可以通过调用'fdcan_tx (* databuf, len, ID, idtype, brs, fdform)'和'fdcan_rx (* data)'来发送和接收CAN-FD帧。
图5. CAN-FD帧的发送过程。
传输功能首先配置与传输有关的结构'FDCAN_TxHeaderTypeDef',它包含传输帧的ID、ID类型、传输帧类型、数据长度、错误状态、速度变化、传输帧格式等。结构配置完成后,通过'AddMessageToTxFIFO'函数将要发送的CAN-FD帧和数据添加到发送FIFO中,同时添加到发送FIFO的发送指令,等待数据的发送。AddMessageToTxFIFO "函数首先确定FIFO的大小和地址,然后通过判断FIFO是否满,将CAN-FD帧添加到CAN-FD的消息RAM地址,最后等待发送请求,实现CAN-FD帧的发送。发送过程如图5所示。本文设计的传输功能可以通过参数直接配置CAN-FD帧的格式,更方便地设置CAN-FD帧的发送。
图6. CAN-FD帧的接收过程。
接收函数通过调用'GetRxMessage'函数将接收FIFO地址上的数据转移到8位数组数据中,然后将数组的值返回给主函数。
同时,通过串口将数据打印到PC上位机,实现数据接收和可视化。数据的接收过程如图6所示。
C.汇编
本文的驱动编译是由Makefile完成的,它与整个项目的编译规则有关。因为本文设计的驱动程序的源文件按类型、功能和模块分别放在几个目录中,并由Makefile定义一系列的规则来指定编译过程。Makefile自动编译的特点是,只需通过make命令就可以自动编译整个项目,大大提高了驱动开发的效率。本文的编译流程如图7所示[6]。
图7. Makefile的编译过程。
个CAN-FD驱动设计的源文件包括主函数(main.c)、驱动函数库(bsp_fdcan. c/uart.c)、CAN-FD结构和相关宏定义(fdcan_base.h)以及Cortex-M0头文件(CMSDK_CM0.h)。用于编译的文件包括makefile和链接脚本fdcan_16k.ld。
IV.通信测试
CAN-FD总线通信仿真测试的环境如图8所示,包括用于燃烧驱动器的j-link、用于抓取物理总线上CAN-FD帧波形的逻辑分析仪、CAN-FD分析仪、UART串行端口和基于Cortex-M0内核的CAN-FD总线控制器SOC芯片。
图8. CAN-FD通信测试环境。
图9. ZCANPRO的收发测试。
图10. UART信息。
打开上位机软件ZCANPRO查看CAN-FD分析仪接收的物理总线的帧,用串口调试工具sscom42查看UART的打印信息,如图9和图10所示。
V.总结
本文介绍了基于Cortex-M0处理器的CAN-FD协议控制器的设计和实现。
针对CAN-FD设备的驱动,设计了安装在APB总线上的CAN-FD设备结构,编制了初始化设备功能和数据收发功能,完成了CAN-FD协议控制器的驱动设计,实现了基于CAN-FD协议的数据传输,并完成了设备的板级调试。由于嵌入式系统的广泛应用和高性能的CAN-FD总线,我们相信CAN-FD设备的嵌入式系统将得到越来越广泛的应用。
参考文献:
[1]Robert I. Davis,Alan Burns,Reinder J.Controller Area Network (CAN) schedulability analysis: Refuted, revisited and revised[J] . Real-Time Systems. 2007 (3).
[2]Xie Yong, Huang Pengcheng, Comparison between CAN and CAN FD: A quantified approach[J].International Conference on Ubiquitous Computing and Communications, 2017, p 1399-1403.
[3]Agrawal Megha, Huang Tianxiang. CAN-FD-Sec: Improving Security of CAN-FD Protocol[J].Lecture Notes in Computer Science.v 11552 LNCS, p 77-93, 2019.
[4]PraKash Rashinkar,Peter paterson, Leena Singh.System-On-a-chip verification methodology.
[5]Bricaud P J. IP Reuse Creation for System-on-a-chip Design[J]. Proceeding of the IEEE Custom Integrated Circuits, 1999, 27(5): 390-405.
[6]Simões Alberto, Fonseca, R ú ben. Makefile: Parallel dependency specification language[J]. Lecture Notes in Computer Science.v 4641 LNCS, p 33-41, 2007.
分享不易,恳请点个【👍】和【在看】