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 CodeSSC需要你自行从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 StudioCCS这个集成开发环境进行编译。在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从站需要一个ESIEtherCAT 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 起始地址说明Bootloaderbootloader_..._ti.bin0x00000000必须烧在Flash开头板上电后首先运行。PRU0 固件ecat_frame_handler_ti.bin0x00020000Bootloader会将其加载到PRU0的指令RAM。PRU1 固件ecat_host_interface_ti.bin0x00030000Bootloader会将其加载到PRU1的指令RAM。应用程序application_ti.bin0x00040000Bootloader会将其加载到ARM内部RAM的指定地址。EEPROM 镜像tiesc_eeprom_ti.bin0x00060000模拟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也要匹配。