基于EtherCAT的DSP应用软件在线更新方法研究*
编者按:主要研究使用EtherCAT总线在线更新TI C2000系列DSP应用软件的方法。移植EtherCAT总线从站到C2000系列DSP上,针对C2000系列DSP设计编写了相应的BootLoader程序,开发了简单的应用程序。试验研究表明:使用此方法可以在线快速通过EtherCAT总线更新C2000系列DSP的应用程序,此方法有效。
*基金项目:国家重点研发计划“智能机器人重点专项”(2019YFB1310200)
作者简介:梁学修(1987—),男,博士,研究方向智能检测与控制。
通讯作者:刘涛(1971—),男,高级工程师,研究方向仪器仪表、自动化等领域。
0 引言
EtherCAT(以太网控制自动化技术)是一个开放架构,以以太网为基础的现场总线系统,是由德国的Beckhoff公司研发,由于有通讯周期短、通讯抖动小的特点,在工业自动化设备中被广泛应用[1]。TI的C2000系列DSP是一种支持单周期乘法和浮点运算的数字信号处理器,由于它的稳定性,在工业场合中多用于开发工控产品[2]。一方面为了应对工业应用环境中仅通过更新应用软件即可实现的新需求;另一方面由于工业现场中复杂的接线和恶劣的运行环境,也导致人们不愿意直接拆卸设备,因而需要一种能在线更新设备应用程序的方法。
本文给出了一种可以使用EtherCAT总线技术在线更新C2000系列工控产品应用程序的方法。本文以TI公司C2000系列中常用的DSP28335基础的某款工控产品对该研究方法进行阐述。
1 EtherCAT从站移植
物理层EtherCAT总线需要专门的EtherCAT从站控制器ESC(EtherCAT Slave Controller),软件层Beckhoff公司提供了相应的协议栈[3]。移植EtherCAT到DSP28335上需要从硬件层和软件层着手。
硬件的ESC芯片可选择Beckhoff公司的ET1100。在硬件层除了需要ESC芯片外还需要1个PHY芯片,PHY芯片选择KSZ8081MNX。硬件架构如图1所示。
ET1100的硬件接线图中需要关注的是ET1100的B12引脚应当接到DSP28335的外部中断信号上面,在EtherCAT通信过程中,ET1100收到1帧数据后会在B12引脚上面产生1个上升沿信号[4-5],本文设计以中断的方式通知DSP28335接收到了1帧数据。在本文设计中将DSP28335和ESC芯片之间通过DSP28335的外部总线进行通讯,将ET1100挂载在DSP28335的Zone7上面。
软件层,根据硬件配置更改从站代码中ecat_def.h相应的宏即可,配置这些宏需参考设计的硬件和软件。根据本文的设计,配置了以下这些宏。
#define MAKE_PTR_TO_ESC
#define ESC_16BIT_ACCESS
#define MAILBOX_SUPPORTED
#define COE_SUPPORTED
((MEM_ADDR ESCMEM *)0x00200000)
1
1
1
本研究中将ET1100挂载在了DSP28335的Zone7上面,因此配置MAKE_PTR_TO_ESC这个宏地址为DSP28335的Zone7的起始地址0x200000;DSP28335是1个16位的DSP,因此配置ESC_16BIT_ACCESS为1;在更新工控产品的程序时需要传输多帧数据,因此配置支持邮箱操作,即配置MAILBOX_SUPPORTED为1;传输数据帧时需要用到COE的OBJ因此配置COE_SUPPORTED为1。
从站的正常运行还需要ET1100的配置文件,主要描述ET1100的配置信息,在本文设计中不会用到POD(过程数据)传输数据,因此使用Beckhoff公司提供的默认配置文件即可。
移植完从站后,编译程序,下载到DSP里面,连接网线使用主站扫描软件扫描从站,控制从站的状态切换到PreOP即可。由于在PreOP状态的时候就可以进行邮箱SDO的通讯了,在线更新应用程序只用到了SDO邮箱数据,因此只切换到PreOP即可。
2 BootLoader软件设计
DSP28335烧写程序可以通过TI的仿真器完成,也可将编译生成的hex文件根据DSP28335的启动方式使用串口更新程序。在工业现场中,更新程序一般由技术支持人员完成,显然使用开发人员用的工具仿真器来更新程序是不合理的,这里既涉及分工问题,又涉及公司程序安全问题。根据DSP28335的启动方式使用串口自动更新程序,需要硬件中添加额外的电路,显然这是不经济的。编写BootLoader程序下载到DSP28335里面,运行此程序使用和工业现场使用的一样的通讯技术来更新程序,既不会涉及公司代码安全,也不用额外添加硬件,因此此种方法比较经济。
2.1 BootLoader软件的技术要点
BootLoader主要功能包括:①建立与上位机的通讯;②擦写DSP28335芯片内部flash;③建立应用程序执行的工作环境,包括堆栈以及中断向量的设计。这些功能也就是BootLoader程序的技术要点。
EtherCAT在运行到PreOP状态后,主站将数据发送给从站,需要设计一个读写的OBJ,因此在从站代码中需添加1个与BootLoader通讯专用的OBJ,在移植成功的从站代码中的cia402appl.h文件的DefCiA402AxisObjDic数组中添加一行代码:
{NULL,NULL, 0x2000, {DEFTYPE_UNICODE_STRING, 0 | (OBJCODE_VAR << 8)}, sEntryDesc0x4000, aName0x4000, &CiA_Axis.Objects.HexDowload,NULL, SDOWriteHexData, 0x0000 }
其中,0x2000是一个可以由制造商自定义的OBJ,SDOWriteHexData是主站在向从站发送数据时从站自动调用的函数,在此函数中,本文要实现程序的下载功能。涉及程序代码安全,BootLoader不提供读DSP内部数据的方法。
BootLoader与主站建立通讯后,需要将主站下载的程序数据写入到flash固定的位置,因此BootLoader需要具备擦写DSP内部flash的功能。擦写DSP内部flash的方法可参考DSP的相应库文件和函数说明。在使用DSP28335的库函数时,库函数需要运行在RAM中,而且在进行flash的擦写操作时不能被中断打断[6-7]。将DSP28335的flash操作函数运行在RAM中需要将这些库文件链接到RAM中,并且在BootLoader程序初始化时将flash操作的函数拷贝到RAM中,具体操作如下:
Flash28_API:
{ - l F l a sh28335_AP I _V210. l i b ( . e c o n s t ) -
lFlash28335_API_V210.lib(.text)}
LOAD = FLASHA,
RUN = RAML0,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),PAGE = 0
其中,LOAD=FLASHA,描述的是Flash28335_A P I _ V 2 1 0 . l i b 库文件加载区是FLASHA中,RUN=RAML0,描述的是Flash28335_API_V210.lib库运行的地方是RAML0中。在BootLoader程序初始化时需执行的代码是:
memcopy(&Flash28_API_LoadStart, &Flash28_API_LoadEnd, &Flash28_API_RunStart);
执行这段代码将Flash28335_API_V210.lib的代码从加载区拷贝到运行区。另外在调用库中的flash擦写函数之前使用DINT关掉中断,调用结束使用EINT打开中断。
在BootLoader程序执行结束运行应用程序之前准备好应用程序运行的环境,通常包括清bss段,拷贝全局数据,中断向量表迁移。在DSP28335这个平台上,bss段的清理和全局数据的拷贝可由_c_int00函数实现,因此在BootLoader跳到应用程序中执行时第1次调用_c_int00即可,调用它既完成了应用程序的准备工作,又完成了从BootLoader到应用程序的跳转。
DSP28335的中断向量表固定存放在起始地址是0x000D00、长度为0x100的空间中,因此修改此地址空间的内容就是修改中断向量表,将1个中断向量表PieVectTableInit的数据拷贝到此空间,完成中断向量的配置。因此在BootLoader跳到应用程序执行之前修改向量空间的内容,或在应用程序中修改向量空间的内容,即可完成中断向量的重新配置,通过在应用程序中修改中断向量空间内容,完成中断向量表的重新配置。
2.2 BootLoader软件架构
在解决了BootLoader软件设计的技术要点后,设计BootLoader程序架构。设计BootLoader程序执行流程图如图2所示。
BootLoader程序执行时首先进行程序初始化,包括EtherCAT从站的初始化,flash的初始化。初始化结束后检查是否已经下载了应用程序,如果没有应用程序,则执行EtherCAT的从站程序,在死循环中调用从站的main函数;如果有应用程序则校验应用程序的CRC值,校验通过则执行应用程序,校验失败则执行EtherCAT的从站程序,在死循环中调用从站的mian函数。
在BootLoader执行EtherCAT从站的main函数时涉及了更新应用程序逻辑,在EtherCAT主站给从站发送命令时,从站调用SDOWriteHexData,在SDOWriteHexData中执行更新应用程序的逻辑,在这个函数中处理了主站发送的数据包,设计相应的数据包格式为:帧数据长度|| CMD || 数据长度 || addr || 数据 || CRC,从站处理数据包的流程如图3所示。
在更新应用程序时从站分别检查OBJ的可访问性,数据帧长度,CRC校验,以及相应的命令,找到相应命令后,执行具体的操作。在本设计中,设计了擦flash的命令和写flash的命令。主站在更新从站的应用程序时,首先发送擦flash的命令,擦除flash之后,再发命令写flash。
主站发送的更新应用程序的命令中包含了程序的数据,这些数据从编译的hex文件中提取,hex文件参照Intel Hex文件格式进行提取。提取完hex文件中的数据后将其打包成从站可以识别的数据包,此数据包可由主站发送给从站用于更新程序。
3 结论
通过本文设计的方法,将提取后的hex文件数据进行打包加密后,然后使用相应的程序更新工具,将更新文件的数据下载给相应的设备,实现了程序的更新。证明了此方法可以在线快速通过EtherCAT总线更新C2000系列DSP的应用程序,此方法有效。
参考文献:
[1] 郇极,刘艳强.工业以太网现场总线EtherCAT驱动程序设计及应用[M].北京:北京航空航天大学出版社, 2010.
[2] 于广,孙汉青,王志平,等. C2000系列DSP在线程序更新研究[J].单片机与嵌入式系统应用,2013,13(3):78-79.
[3] CHUN-RONG S , YAN-QIANG L , JI H . EtherCATIndustrial Ethernet Fieldbus and Its Driver Design[J]. Manufacturing Automation, 2007.
[4] 马军贤, 周侗, 杨志家,等. EtherCAT从站的设计与实现[J].自动化与仪表, 2011(08):37-40.
[5] 孙士超,王伟东,杜志江.实时以太网EtherCAT从站的硬件系统设计[J].单片机与嵌入式系统应用,2014(08):52-55.
[6] 姚胜东.工业以太网现场总线EtherCAT的应用[J].仪表技术,2014(8):4-6.
[7] 高鹏.基于DSP的EtherCAT工业以太网从站驱动设计[D].北京:北京交通大学.
(本文来源于必威娱乐平台 杂志2020年9月期)
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码