TI AMIC110 EtherCAT从站裸机开发:从源码编译到TwinCAT测试全流程
1. 项目概述与核心价值
最近在调试一个基于TI AMIC110的工业从站设备,核心需求是实现一个轻量级、低成本的EtherCAT从站节点。AMIC110这颗芯片挺有意思,它内置了PRU-ICSS(可编程实时单元和工业通信子系统),能原生支持EtherCAT、PROFINET等多种工业协议,特别适合对实时性和成本都有要求的边缘IO设备或者小型驱动器。官方提供了一个名为“ETHERCAT Slave demo”的参考软件,这个demo最大的亮点在于它完全不需要外接DDR内存,所有代码都在芯片内部的RAM里跑,而且连实时操作系统(RTOS)都不用,就是一个纯粹的裸机(Baremetal)程序。这对于想快速验证协议功能、或者开发极致精简的从站设备的工程师来说,是个非常理想的起点。今天我就结合自己用AMIC110 ICE开发板实测的过程,把这个demo从源码编译、固件烧录,到最终用Twincat3测试、甚至联合C2000 LaunchPad做SPI扩展的完整流程拆解一遍,过程中遇到的坑和注意事项也会详细说明,希望能给正在评估或上手AMIC110做EtherCAT开发的同行一些参考。
2. 环境准备与源码编译全解析
拿到一个官方Demo,第一步永远是把代码在本地环境成功编译出来。这个过程看似按部就班,但其中几个关键步骤如果理解不透,很容易卡住。
2.1 软件包获取与关键组件说明
首先,你需要从TI官网获取完整的Industrial SDK(工业软件开发套件),这个SDK里包含了协议栈、驱动和这个EtherCAT从站Demo。但这里有一个非常关键且容易遗漏的点:EtherCAT协议栈的核心——Slave Stack Code(SSC),需要你自行从EtherCAT技术协会(ETG)的官网下载。这是因为SSC是ETG的知识产权,TI不能直接打包分发。
注意:ETG官网(ethercat.org)的下载通常需要注册账号,并且需要同意其许可协议。请务必使用官方渠道下载,确保代码的合法性和完整性。我们这里使用的是SSC 5.12版本。
下载到SSC源码包(通常是一个.zip文件)后,你需要将其解压,并将里面的所有源代码文件,完整复制到你的Industrial SDK工程路径下,具体位置是:[你的SDK路径]/protocols/ethercat_slave/EcatStack/目录中。这一步的目的是用官方的、经过认证的协议栈代码,替换掉SDK中可能存在的占位符或基础框架,这是整个协议能正确运行的基础。
2.2 CCS工程导入与编译细节
接下来,我们使用TI的Code Composer Studio(CCS)这个集成开发环境进行编译。在SDK的protocols/ethercat_slave/目录下,你可以找到名为ethercat_slave_full_baremetal_AMIC11x_arm_localsrc的CCS工程。直接将它导入到你的CCS工作空间中。
导入后先别急着编译,有几个地方需要检查:
- 编译目标:确认工程配置(Build Configuration)是否选择为“Release”。Debug配置可能会包含更多调试信息,但Release配置生成的二进制文件更小,更适合烧录。
- 包含路径:确保SSC的源代码路径已经被正确添加到工程的包含文件目录(Include Paths)中。通常SDK的工程文件已经配置好了相对路径,但如果你移动过文件位置,可能需要手动检查一下。
- 预定义宏:查看工程预处理器选项中的预定义宏(Predefined Symbols)。对于AMIC110的裸机Demo,通常会定义诸如
SOC_AMIC110、BUILD_ETHERNET等芯片和功能相关的宏。
点击编译,如果一切顺利,你会在工程下的Release/文件夹里找到编译输出的app文件(可能以.out或.bin为扩展名)。这个文件就是我们最终要运行在AMIC110 ARM Cortex-A8核心上的主应用程序。
实操心得:第一次编译很大概率会报错,常见问题集中在头文件找不到或者SSC的某些源文件缺失。请严格按照上述步骤,确保SSC源码被复制到了精确的
EcatStack目录下,并且目录结构没有错乱。另一个坑点是CCS的版本,尽量使用TI推荐或SDK说明文档中指定的CCS版本,避免因编译器版本差异导致的语法兼容性问题。
2.3 生成可烧录的镜像文件
编译出.out文件只是第一步,要把它烧写到板子的SPI Flash中,还需要生成特定格式的二进制镜像。这里会用到几个关键的.bin文件和一个转换工具。
首先,我们需要处理两个固件文件,它们负责PRU(可编程实时单元)的运行。PRU是AMIC110实现EtherCAT实时数据处理的“硬件加速器”。这两个文件位于SDK的firmware/v1.0/目录下:
ecat_frame_handler.bin: PRU0的固件,主要负责EtherCAT帧的实时处理和邮箱通信。ecat_host_interface.bin: PRU1的固件,负责ARM主机与PRU之间的接口通信。
ARM核心不能直接执行这些PRU二进制文件,需要用一个叫tiimage.exe的工具(在SDK的tools/目录下可以找到)为它们添加一个TI专用的头部信息,并指定加载地址。命令如下:
tiimage.exe 0x4a334000 NONE ecat_frame_handler.bin ecat_frame_handler_ti.bin tiimage.exe 0x4a338000 NONE ecat_host_interface.bin ecat_host_interface_ti.bin这里的0x4a334000和0x4a338000是这两个PRU固件在AMIC110内存映射中的固定加载地址,必须严格对应,否则PRU无法正确启动。NONE参数表示不需要加密。
其次,需要准备EEPROM模拟文件。EtherCAT从站需要一个ESI(EtherCAT Slave Information)文件来描述设备信息,在硬件上通常由EEPROM存储。我们这个Demo使用一个二进制镜像文件来模拟这片EEPROM。从ecat_appl/iceAM335x/目录下找到tiesc_eeprom_ti.bin文件并复制出来。这个文件已经包含了基本的从站配置信息。
最后,需要Bootloader。由于我们的应用是裸机程序,且无DDR,需要一个特殊的Bootloader来初始化最基础的硬件(如时钟、SPI控制器),然后从SPI Flash中加载上述应用程序和PRU固件到内部RAM中执行。这个Bootloader文件通常位于starterware/binary/bootloader/bin/amic110-ddrless/gcc/路径下,名为bootloader_boot_mcspi_noDDR_a8host_release_ti.bin。注意文件名中的noDDR和mcspi关键字,这正对应了我们无外部DDR内存、并从SPI Flash启动的场景。
至此,我们备齐了四个关键文件:
app(重命名为application_ti.bin或类似,需用tiimage工具同样处理,加载地址一般为0x402f0400)ecat_frame_handler_ti.binecat_host_interface_ti.bintiesc_eeprom_ti.binbootloader_boot_mcspi_noDDR_a8host_release_ti.bin
注意事项:
tiimage工具处理应用程序.bin时,加载地址需要参考工程链接脚本(.cmd文件)中指定的运行地址。务必确认一致,否则程序跑飞。一个简单的验证方法是,查看CCS编译生成的map文件,找到.text段等的加载地址。
3. 固件烧录与硬件启动验证
有了镜像文件,下一步就是将它们写入AMIC110 ICE板的SPI Flash存储器。这个过程需要通过JTAG调试器来完成。
3.1 JTAG连接与CCS配置
使用XDS系列仿真器(如XDS110,它通常集成在AMIC110 ICE板上)连接电脑和板子的JTAG口。在CCS中新建一个Target Configuration,选择正确的仿真器型号和芯片型号(AMIC110或AM335x系列)。连接成功后,CCS会识别到ARM Cortex-A8核心。
这里有个关键步骤:由于我们要烧写的是SPI Flash,而不是直接运行在RAM中的调试程序,我们需要借助一个“Flash烧写工具”程序。这个程序本身是一个.out文件,位于tools/flash_writer/目录下,名为spi_flash_writer_AM335X.out。它的作用是被CCS下载到板子的内部RAM中并运行,然后接收来自CCS的命令,将我们准备好的那些.bin文件数据通过SPI接口写入外部的Flash芯片。
3.2 分区烧写与地址映射
运行spi_flash_writer_AM335X.out后,CCS的Console会变成一个简单的命令行界面。你需要按照提示,依次将各个二进制文件烧写到SPI Flash的指定扇区(Sector)或偏移地址。地址绝对不能错,因为Bootloader在启动时会按照预设的地址去寻找这些组件。
一个典型的烧写顺序和地址映射如下(具体地址请以你使用的SDK版本和Demo文档为准):
| 组件 | 镜像文件 | SPI Flash 起始地址 | 说明 |
|---|---|---|---|
| Bootloader | bootloader_..._ti.bin | 0x00000000 | 必须烧在Flash开头,板上电后首先运行。 |
| PRU0 固件 | ecat_frame_handler_ti.bin | 0x00020000 | Bootloader会将其加载到PRU0的指令RAM。 |
| PRU1 固件 | ecat_host_interface_ti.bin | 0x00030000 | Bootloader会将其加载到PRU1的指令RAM。 |
| 应用程序 | application_ti.bin | 0x00040000 | Bootloader会将其加载到ARM内部RAM的指定地址。 |
| EEPROM 镜像 | tiesc_eeprom_ti.bin | 0x00060000 | 模拟EEPROM数据,EtherCAT主站会读取。 |
在烧写工具中输入命令格式通常类似:<地址> <文件名>。烧写每个文件后,工具会进行校验。全部烧写完成后,给板子完全断电再上电(或者硬件复位),让芯片从SPI Flash的0地址开始执行Bootloader。
3.3 启动状态诊断
如何判断程序是否成功启动?AMIC110 ICE板上有几个用户LED。在这个Demo中,成功启动后,特定的LED(例如原理图中标注为D17和D6的灯)会被点亮。这是一个非常重要的硬件信号,表明:
- Bootloader已成功运行。
- Bootloader正确加载了应用程序和PRU固件。
- ARM核心和PRU核心已开始执行代码。
- 至少底层的硬件初始化和通信是正常的。
如果LED没有按预期点亮,就需要进入排查流程:首先确认JTAG能否连接、芯片供电是否正常;然后回退到用CCS单步调试Bootloader,看它是否能在读取Flash时通过;最后检查编译和烧写的地址是否正确。
4. 使用TwinCAT进行EtherCAT主站测试
板子跑起来后,我们需要一个EtherCAT主站来验证其从站功能。德国倍福(Beckhoff)的TwinCAT软件是业界最常用的开发和测试工具之一。
4.1 TwinCAT环境搭建与驱动安装
首先,从倍福官网下载TwinCAT 3的测试版并安装。安装完成后,至关重要的一步是安装TwinCAT的实时网卡驱动。在TwinCAT的“Show Real Time Ethernet Compatible Devices”界面中,它会列出你的物理网卡。选择你用来连接AMIC110 ICE板的那块网卡,然后点击“Install TwinCAT RT Ethernet intermediate driver”。这个操作会给你的标准Windows网卡套上一层实时扩展驱动,使其能够进行精确的实时以太网通信,这是EtherCAT工作的基础。
接下来,需要让TwinCAT认识我们的AMIC110从站设备。这通过ESI文件实现。将SDK中提供的TI_ESC.xml文件(路径通常在ecat_appl/esi/)复制到TwinCAT的ESI存储目录,通常是TwinCAT\3.1\Config\Io\EtherCAT。这样,在扫描网络时,TwinCAT就能识别出这个设备并加载其描述信息。
4.2 网络扫描与设备配置
用一根标准的网线,连接电脑(安装了TwinCAT实时驱动的网卡)和AMIC110 ICE板的EtherCAT端口(J6)。
- 在TwinCAT开发环境中新建一个“TwinCAT Project”。
- 在“Device”视图下,右键选择“Scan”。如果一切正常,TwinCAT会自动扫描网络,并发现一个名为“TI ESC”或类似名称的设备。
- 将其添加到工程中。展开设备树,你会看到标准的EtherCAT从站对象字典(Object Dictionary)、过程数据映像(PDO)等结构。
这个Demo默认映射了一些简单的输入输出过程数据。例如,你可能会在“TI BOX1”设备的“DO Outputs”下找到LED[0]到LED[n]这样的变量,它们对应着板载LED的控制。同样,在“DI Inputs”下可能有Switch[0]等变量,可以映射到板上的物理拨码开关(如果板子有的话)。
4.3 在线测试与过程数据交互
将TwinCAT工程置于“配置模式”(Config Mode),然后切换到“运行模式”(Run Mode)。此时,EtherCAT网络开始进行初始化状态机切换(Init -> Pre-Operational -> Safe-Operational -> Operational)。如果所有状态都能顺利进入,并在“Online”标签页看到从站显示为“OP”状态,恭喜你,EtherCAT通信链路已经成功建立!
现在,你可以尝试在线修改LED[x]变量的值(比如从FALSE改为TRUE),如果对应的板载LED灯亮灭发生变化,那就证明了从站能够正确接收主站下发的输出数据(Outputs)。同样,如果你有拨码开关,拨动开关,在TwinCAT中观察Switch[x]变量的值是否随之变化,这验证了从站能够将输入数据(Inputs)上传给主站。
排查技巧:如果扫描不到设备,首先检查网线、网卡驱动、防火墙设置。如果设备能扫描到但无法进入“OP”状态,查看TwinCAT的“Adapters”和“Online”标签页下的错误信息。常见的错误码如“0x1A”可能表示EEPROM校验错误,需要检查
tiesc_eeprom_ti.bin文件是否正确烧录。另外,确保TwinCAT工程中的从站站址(Station Address)与网络拓扑没有冲突。
5. 扩展测试:与C2000 LaunchPad的SPI通信集成
AMIC110的PRU-ICSS不仅处理EtherCAT,其PRU核心还可以被编程实现其他工业接口。在这个Demo中,它默认配置为SPI Master模式,这为我们连接其他微控制器(如TI的C2000系列DSP)提供了一个绝佳的扩展通道,可以模拟分布式IO或驱动器的场景。
5.1 硬件连接与角色定义
准备一块C2000 LaunchPad(例如TMS320F28379D),我们将把它配置为SPI Slave设备。连接方式如下:
- AMIC110 ICE (Master)<-->C2000 LaunchPad (Slave)
- AMIC110的 SPI 接口引脚(位于J4和J5接头)需要与C2000 LaunchPad的SPI引脚相连。具体是:
- SPI CLK (时钟)
- SPI MOSI (主出从入)
- SPI MISO (主入从出)
- SPI CS (片选,可选,Demo可能使用GPIO模拟)
你需要查阅AMIC110 ICE和C2000 LaunchPad的原理图,准确找到这些引脚并进行连接。同时,确保两者的GND共地。
5.2 C2000 Slave程序准备
在C2000端,你需要一个运行在Slave模式下的SPI接收/发送程序。这个程序可以很简单:循环等待来自SPI Master(即AMIC110)的数据,收到特定数据后,回复一个预设的数据。你可以使用TI的C2000 SDK中的SPI示例工程进行修改,或者自己编写一个简单的裸机程序。关键点是配置C2000的SPI外设为Slave模式,并设置与AMIC110端匹配的时钟极性(CPOL)、相位(CPHA)和位宽(通常为8位或16位)。
将这个程序通过CCS和JTAG调试器烧录到C2000 LaunchPad中,并让其运行起来。
5.3 联合功能验证
给AMIC110 ICE和C2000 LaunchPad上电。回到TwinCAT工程中,之前看到的DI Inputs -> Switch[x]这些变量,其数据源实际上就是AMIC110通过SPI从C2000读取上来的。在Demo的默认逻辑里,ARM核心会周期性地通过SPI向C2000发送请求,并读取C2000的回复数据,然后将这些数据映射到EtherCAT的输入过程数据区。
因此,如果你在C2000的程序中,让回复的数据按一定规律变化(例如,用一个计数器递增后发送),那么在TwinCAT中在线监视Switch[x]这些变量时,就应该能看到它们在不规律地变化。这就构成了一个完整的链路验证:
- TwinCAT (EtherCAT Master)周期性地向AMIC110 (EtherCAT Slave & SPI Master)发送输出数据并读取输入数据。
- AMIC110将来自TwinCAT的部分数据(如果需要)通过SPI发送给C2000 (SPI Slave)。
- C2000处理SPI数据,并返回响应数据给AMIC110。
- AMIC110将C2000返回的数据打包进EtherCAT输入过程数据,上传给TwinCAT。
这个测试成功,不仅验证了EtherCAT基本功能,更证明了AMIC110作为工业通信网关的潜力——它一边处理高实时性的EtherCAT协议,另一边还能通过PRU或ARM核心与下级设备进行高速数据交换。
实操心得:SPI通信调试的常见问题集中在电气和配置层面。首先用示波器或逻辑分析仪抓取SPI的CLK、MOSI、CS信号,确保物理层有数据在传输。如果没信号,检查软件初始化代码里SPI外设和GPIO的配置是否正确,时钟是否使能。如果有信号但数据不对,重点检查CPOL和CPHA的配置,主从双方必须严格一致。此外,注意SPI的位序(MSB/LSB first)也要匹配。
