基于STM32F103的J1939多包传输底层软件设计

    王势权 吴长水

    

    

    

    摘 要:针对某车载终端与CAN总线间的长数据传输问题,以STM32F103单片机为主控制器,设计一种符合SAE J1939多包传输协议的底层软件。根据SAE J1939协议中多包数据传输工作原理,基于STM32CubeMX硬件平台对控制器CAN节点端口进行初始化配置,在Keil5开发环境下,实现J1939多包传输底层软件开发,最后开发上位机软件对所设计的底层软件进行验证。实验结果表明,该底层软件能够稳定有效地进行长数据多包传输,符合设计要求。

    关键词:STM32F103;SAE J1939;多包传输;底层软件;汽车电子控制

    DOI:10. 11907/rjdk. 201186????????????????????????????????????????????????????????????????? 开放科学(资源服务)标识码(OSID):

    中图分类号:TP319 ? 文献标识码:A ??????????????? 文章编号:1672-7800(2020)011-0126-05

    Underlying Software Design of J1939 Multi-packet Transmission

    Based on STM32F103

    WANG Shi-quan,WU Chang-shui

    (College of Mechanical and Automotive Engineering, Shanghai University of Engineering Science, Shanghai 201620, China)

    Abstract: Aiming at the problem of long data transmission between a vehicle terminal and the CAN bus, the STM32F103 single-chip microcomputer is used as the main controller, and an underlying software conforming to the SAE J1939 multi-packet transmission protocol is designed. According to the working principle of multi-packet data transmission in the SAE J1939 protocol, this paper initializes the configuration of the CAN node port of the controller based on the STM32CubeMX hardware platform. In the development environment of Keil5, the development of the underlying software for the multi-packet transmission of J1939 is realized. The upper computer software verifies the design of the underlying software. The experimental results show that the underlying software can stably and efficiently perform long data multi-packet transmission, which meets the design requirements.

    Key Words: STM32F103; SAE J1939; multi-packet transmission; underlying software; automotive electronic control

    0 引言

    重型柴油車国六标准首次对车载监控终端提出了要求,即终端能够读取并存储车辆数据流信息和OBD信息[1-2]。SAE J1939作为目前商用车中最广泛的应用层协议,描述了重型车辆现场总线的一种网络应用,其以CAN2.0B作为网络核心协议,包括物理层和数据链路层,数据传输速率可达250kbps[3-5]。

    对于符合SAE J1939的CAN总线各节点间信息交互及诊断报文收发,数据长度小于8个字节时,单帧即可完成数据发送,数据长度大于8个字节时,需要使用SAE J1939多包传输协议[6]。刘明[7]研究J1939在ECU通信中的功能应用、具体通讯流程及应用实例;谢娟娟等[8]分析多包传输协议在商用车整车CAN网络开发过程中的应用;李志涛[9]提出一种基于VSPY3工具的多帧总线数据库设计方法;董建业等[10]在VC6.0环境下设计并实现CAN总线长帧数据拆装与重组。

    上述文献大多只对SAE J1939多包传输在CAN总线中的应用进行分析,没有对底层传输软件作详细设计。本文在分析J1939协议多包传输工作原理基础上,基于STM32平台开发一种多包传输底层软件。该软件主要由多包接收与多包发送两部分组成,并对多包数据收发的各阶段进行详细设计,能够实现基于J1939协议的CAN网络节点间多包数据传输,适用于商用车车载监控终端开发。

    1 SAE J1939多包传输工作原理

    1.1 SAE J1939数据结构

    SAE J1939协议对CAN2.0B协议扩展帧的29位ID进行了重新定义,并与数据域组成了SAE J1939协议数据单元(PDU)[11]。协议数据单元由优先级(P)、保留位(R)、数据页(DP)、PDU格式(PF)、特定PDU(PS)、源地址(SA)和数据段组成[12]。

    1.2 SAE J1939多包传输通讯过程

    SAE J1939在数据链路层对多包数据传输方法进行定义,主要包括数据拆装、重组和连接管理[13]。对于采用多包传输的CAN帧消息,其数据域的第1个字节从1开始作为数据包的序号,后7个字节用于存放数据,按照编号依次发送数据包,最后一个数据包未使用的字节,使用0xFF进行补充。接收节点根据数据域中首字节的大小重新组合出原有数据。如果消息需要发送到多个节点或是全局,无需使用数据流控制管理功能,只需通过广播公告消息完成长数据发送即可。如果多包数据需要发送到指定的目标地址,必须使用连接模式下的点对点会话,这种连接管理可以实现CAN网络节点间虚拟连接的打开、关闭和数据流控制。

    在进行多包数据传输时,若目标地址为全局地址,发送节点首先发送一条TP.CM_BAM,向其它节点声明自己要发送多包消息,之后可直接使用TP.DT进行数据传输,而不必等待接收节点响应,数据传输完成后也没有关闭连接操作。若目标地址为特定地址,发送节点必须先与接收节点建立虚拟连接,发送节点首先要发送一条TP.CM_RTS消息,等待接收节点返回一条TP.CM_CTS后,数据传输才正式开始,数据传输完成后,接收节点返回结束应答TP.CM_EndOfMsgAck并关闭连接,数据传输结束。

    2 CAN端口在STM32CubeMX中的配置

    2.1 底层硬件

    控制器主芯片采用意法半导体集团(ST)所产芯片STM32F103RCT6,CAN收发器芯片为TJA1050。主控芯片STM32F103RCT6采用ARM公司32位Cortex-M3内核,其内部带有支持CAN2.0B协议的CAN控制器,3个发送邮箱,2个3级深度的接收邮箱,3级14个可调节的滤波器,支持11位标准帧或29位扩展帧收发,最高支持通讯速率1Mbps[14]。TJA1050是一种标准的高速CAN收发器,可以与STM32自带的CAN控制器主控芯片相结合,为CAN总线提供差动发送功能,为STM32CAN控制器提供差动接收功能,实现车载终端与CAN总线信号的交互。

    2.2 CAN端口初始化配置

    STM32CubeMX集成了一个全面的图形化软件设置平台,支持STM32全系列芯片,用户可以非常方便地配置MCU的引脚、时钟、外设等,并且支持自动生成工程项目文件[15]。首先对系统时钟进行配置,STM32CubeMX极大地简化了开发人员的工作,使用更形象的图形化界面表示时钟配置关系。参考STM32F103官方数据手册,选取外部8MHz晶振作为系统输入时钟,配置锁相环(PLL)倍頻至72MHz为系统时钟,并配置CAN外设挂载的APB1总线时钟为最大值36MHz。然后初始化CAN端口GPIO引脚模式,配置CAN_RX引脚PA11为输入模式,CAN_TX引脚PA12为复用推挽输出模式。

    最后对CAN工作模式进行配置,配置过程下:①配置CAN总线波特率,根据手册可知CAN总线波特率计算公式为:

    BaudRate=Fpclktsync+tbs1+tbs2×brp (1)

    其中,Fpclk为CAN外设挂载的总线时钟频率,为36MHz,brp为分频系数,设定为8,tsync为STM32中CAN位时序的同步段,固定位1,tbs1和tbs2为CAN位时序的BS1段和BS2段,设定为9和8,由此确定CAN网络波特率为250kbps,满足SAE J1939报文传输速率要求;②禁用时间触发模式,该模式只有在需要生成接收发送时间戳时才启用;③启动自动离线管理,当报文发送错误超过一定次数时,使CAN总线处于离线状态,关闭CAN节点收发;④启用CAN网络自动唤醒,CAN外设可使用软件进入低功耗睡眠模式,当检测到总线活动时自动唤醒;⑤禁用报文自动重传,当报文发送失败时,为了不影响其它报文的正常发送,默认发送失败的报文只重传1次;⑥禁用接收邮箱报文锁定模式,当接收邮箱溢出时,新报文覆盖旧报文;⑦启用报文发送优先级由帧ID标识符决定,当CAN外设的发送邮箱中有多个待发送报文时,根据存进发送邮箱的报文ID优先级顺序发送;⑧将该CAN外设工作设定在正常模式,只有当调试程序时,可选用其它模式进行测试。

    CAN端口及工作模式初始化配置完成后,使用STM32CubeMX平台自带的Generate Code工具可生成初始化MDK工程,将所生成的工程文件导入Keil5中,在此基础上进行J1939多包传输底层软件开发。

    3 J1939多包传输实现

    在STM32CubeMX生成的MDK文件中,包含有一个STM32的抽象层集成软件HAL库[16],在Keil5开发环境下,主要通过HAL库进行编程。本文设计的J1939多包传输底层软件采用轮询方式进行CAN节点数据收发,并设置消息缓存队列,保证接收发送数据不掉帧。首先设置J1939_MASSAGE结构体,实现长数据与HAL库自带的CAN驱动结构体赋值,然后设置接收步骤结构体J1939_TP_Rx_Step和发送步骤结构体J1939_TP_Tx_Step,用于标识多包数据传输的不同阶段,以便对不同连接管理消息进行解析和存储,同时加入超时判断机制,保证长数据传输的完整性,最后设置一个心跳函数J1939_Poll,该函数由接收函数J1939_ReceiveMessages和发送函数J1939_TransmitMessages两部分组成,用于驱动总线数据收发,并将收发数据存入消息缓存队列。

    在进行长数据接收时,首先进入接收等待阶段J1939_TP_RX_WAIT,保存长数据源地址、总字节数、数据包个数、参数组编号,并解析该帧数据域控制字节。若为点对点会话,跳转至接收准备阶段J1939_TP_RX_READY,返回CTS消息,与长数据源地址建立虚拟连接,写入控制字节0x11,向源地址返回可接收的数据包个数,将要接收的下一个数据包编号并确认长数据参数组编号,之后跳转至数据接收阶段J1939_TP_RX_DATA;若为广播公告会话,则直接跳转至数据接收阶段J1939_TP_RX_DATA。在数据接收阶段,根据存储的长数据总数据包个数,可判断是否接收到最后一个数据包,若接收到最后一包数据,则跳转至接收完成阶段J1939_RX_DONE。在接收完成阶段,广播公告会话根据数据包总字节数,完成长数据重组;点对点会话首先返回消息结束应答TP.CM_EndOfMsgAck,确认收到的总数据字节数和数据包个数,中断虚拟连接,然后完成长数据重组。

    在进行长数据发送时,首先进入发送等待阶段J1939_TP_TX_WAIT,对长数据进行 拆分,确定要发送的长数据参数组编号、字节数、包个数,并对最后一包不足7个字节的数据位补充0xFF。若该长数据目标地址为特定地址,跳转至连接请求阶段J1939_TP_TX_CM_START,装载RTS消息,写入数据域控制字节0x10,长数据总字节数,将要发送的数据包个数及长数据参数组编号,跳转至连接等待阶段J1939_TP_TX_CM_WAIT,解析目标地址返回的CTS消息,包括可接收的数据包个数及将要接收的下一个数据包编号,跳转至数据发送阶段J1939_TP_TX_DT;若该长数据目标地址为全局,则跳转至广播公告准备阶段J1939_TP_TX_BAM,写入控制字节0x20,长数据总字节数、数据包个数及参数组编号,跳转至数据发送阶段J1939_TP_TX_DT。在数据发送阶段,广播公告消息按照长数据数据包编号依次发送,点对点会话按照连接管理消息中的流控制完成所有数据包发送。当所有数据包发送完成,进入发送结束阶段J1939_TX_DONE,对J1939发送结构体变量进行清零,以便下一长数据发送。

    4 测试与验证

    在Visual Studio平台上搭建上位机软件,对J1939多包传输底层软件进行验证。上位机软件通过调用CAN驱动动态链接库,实现CAN报文收发功能,在选择测试配置一栏,可选择不同模式下的多包数据传输,包括请求PGN、广播公告消息、点对点会话等。通过USB-CAN连接下位机进行测试,实际测试结果如图7所示。

    图7(a)为点对点会话模式下车辆VIN码的多帧传输测试,下位机首先向上位机请求车辆VIN码的参数组编号0x00FEEC,上位机收到请求后,首先发送一个TP.CM_RTS,其中0x10为控制字节16,表示该帧消息属于指向下位机地址的发送请求(RTS),0x0011表示上位机将要发送的长数据为17个字节,0x03表示该长数据共分为3个数据包发送,0xFF为填充字节,0x00FEEC为将要发送数据所在的参数组编号。当下位机收到RTS消息发送请求后,回复一个TP.CM_CTS,其中0x11为控制字节17,表示该帧消息为指向上位机地址的准备发送(CTS),0x03为下位机可接收的数据包个数,0x01表示下位机请求上位机从第一包数据开始发送,0xFF为填充字节,0x00FEEC为下位机确认接收到的数据为车辆VIN码PGN编号。上位机收到返回的CTS消息后,调用连接管理TP.DT,按下位机最大接收数据包进行发送,当所有数据传输完成后,下位机发送一个TP.CM_EndOfMsgAck,其中0x13为控制字节19,表示该帧消息为结束应答,0x11表示接收到的数据总字节数为17,0x03表示完整接收到了3个数据包,0xFF为填充字节,0x00FEEC表示所接收到的数据为车辆VIN码。

    图7(b)为广播公告模式下车辆故障码测试。以故障2为例,由上位机发出广播公告消息TP.CM_BAM,其中0x20为控制字节32,表示该帧消息属于广播公告消息,0x18表示将要发送的长数据为24個字节,0x04表示该长数据分为4个数据包发送,0xFF为填充字节,0x00FECA表示该广播公告消息为车辆故障码。

    5 结语

    本文分析J1939多包传输工作原理,设计一种基于轮询收发机制的多阶段长数据多包传输底层软件,在STM32CubeMX环境下,通过可视化编程完成初始化工程搭建,节省开发时间,使用HAL库编程,保证了该底层软件的最大可移植性。但文中并未对多包传输过程中的超时判断及错误诊断机制进行详细设计,后续将进一步研究完善。

    参考文献:

    [1] 生态环境部办公厅. 重型柴油车污染物排放限值及测量方法(中国第六阶段). GB 17691-2018[S]. 2018.

    [2] 罗源. 基于国六标准的重型柴油车远程排放监控系统研发[D]. 杭州:浙江大学,2019.

    [3] 骆志宏,许勇,马秋香. 商用车在线故障诊断系统设计与实现[J]. 计算机测量与控制,2015,23(4):1098-1101.

    [4] 梁云龙. 基于AUTOSAR的J1939通讯与诊断模块设计[D]. 长春:吉林大学,2019.

    [5] 付衍法,崔冬梅,马乾. 基于SAE J1939协议的发动机离线诊断软件开发[J]. 建筑机械化,2019,40(4):57-59.

    [6] 汪志斌,吴长水,黄敏涛,等. 基于J1939协议的车辆故障诊断与ECU报文解析[J]. 单片机与嵌入式系统应用,2017,17(12):7-11.

    [7] 刘明. J1939协议在ECU通信中的应用研究[J]. 电子科技,2015,28(5):36-38,42.

    [8] 谢娟娟,李晋,郑创明. SAE J1939多包传输协议及应用分析[J]. 周口师范学院学报,2016,33(2):66-67.

    [9] 李志涛. 基于VSPY3的CAN总线多帧数据库的设计与应用[J]. 汽车电器,2016(6):43-45,48.

    [10] 董建业,刘子龙. 基于J1939标准的长帧数据应用[J]. 电子技术与软件工程,2015(2):18-19.

    [11] 曾海林,李懿,陈平松. 基于J1939的发动机通信控制软件设计[J]. 测控技术,2018,37(5):156-160.

    [12] 周良润. 基于J1939协议的汽车信息采集系统的研究[D]. 武汉:湖北工业大学,2017.

    [13] 蔺春明,王守胜,高美芹,等. 商用车CAN总线多帧数据通讯[J]. 汽车实用技术,2018,44(11):87-91.

    [14] 董小辉,胡锦波,黄浩,等. 基于SAE J1939的商用车智能车载终端系统设计[J]. 计算机测量与控制,2019,27(7):209-213.

    [15] 刘鹏. 基于STM32F407的双CAN总线设计与实现[J]. 科技视界,2016(13):130-132.

    [16] 许鹏程,李小波. MATLAB与STM32CubeMX联合的嵌入式开发方法[J]. 单片机与嵌入式系统应用,2016,16(10):14-16.

    (责任编辑:孙 娟)