当前位置: 首页 > news >正文

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工作空间中。

导入后先别急着编译,有几个地方需要检查:

  1. 编译目标:确认工程配置(Build Configuration)是否选择为“Release”。Debug配置可能会包含更多调试信息,但Release配置生成的二进制文件更小,更适合烧录。
  2. 包含路径:确保SSC的源代码路径已经被正确添加到工程的包含文件目录(Include Paths)中。通常SDK的工程文件已经配置好了相对路径,但如果你移动过文件位置,可能需要手动检查一下。
  3. 预定义宏:查看工程预处理器选项中的预定义宏(Predefined Symbols)。对于AMIC110的裸机Demo,通常会定义诸如SOC_AMIC110BUILD_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

这里的0x4a3340000x4a338000是这两个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。注意文件名中的noDDRmcspi关键字,这正对应了我们无外部DDR内存、并从SPI Flash启动的场景。

至此,我们备齐了四个关键文件:

  1. app(重命名为application_ti.bin或类似,需用tiimage工具同样处理,加载地址一般为0x402f0400)
  2. ecat_frame_handler_ti.bin
  3. ecat_host_interface_ti.bin
  4. tiesc_eeprom_ti.bin
  5. bootloader_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的灯)会被点亮。这是一个非常重要的硬件信号,表明:

  1. Bootloader已成功运行。
  2. Bootloader正确加载了应用程序和PRU固件。
  3. ARM核心和PRU核心已开始执行代码。
  4. 至少底层的硬件初始化和通信是正常的。

如果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)。

  1. 在TwinCAT开发环境中新建一个“TwinCAT Project”。
  2. 在“Device”视图下,右键选择“Scan”。如果一切正常,TwinCAT会自动扫描网络,并发现一个名为“TI ESC”或类似名称的设备。
  3. 将其添加到工程中。展开设备树,你会看到标准的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]这些变量时,就应该能看到它们在不规律地变化。这就构成了一个完整的链路验证:

  1. TwinCAT (EtherCAT Master)周期性地向AMIC110 (EtherCAT Slave & SPI Master)发送输出数据并读取输入数据。
  2. AMIC110将来自TwinCAT的部分数据(如果需要)通过SPI发送给C2000 (SPI Slave)
  3. C2000处理SPI数据,并返回响应数据给AMIC110。
  4. AMIC110将C2000返回的数据打包进EtherCAT输入过程数据,上传给TwinCAT

这个测试成功,不仅验证了EtherCAT基本功能,更证明了AMIC110作为工业通信网关的潜力——它一边处理高实时性的EtherCAT协议,另一边还能通过PRU或ARM核心与下级设备进行高速数据交换。

实操心得:SPI通信调试的常见问题集中在电气和配置层面。首先用示波器或逻辑分析仪抓取SPI的CLK、MOSI、CS信号,确保物理层有数据在传输。如果没信号,检查软件初始化代码里SPI外设和GPIO的配置是否正确,时钟是否使能。如果有信号但数据不对,重点检查CPOL和CPHA的配置,主从双方必须严格一致。此外,注意SPI的位序(MSB/LSB first)也要匹配。

http://www.jsqmd.com/news/872443/

相关文章:

  • 别再手动复制粘贴了!用Matlab的writecell函数,5分钟搞定数据导出到Excel/TXT
  • Claude ROI计算模型(附可落地的Excel动态计算器):从0到1构建可审计、可复用、可汇报的量化评估体系
  • 如何快速上手PoeCharm:流放之路角色构建终极中文指南
  • ComfyUI-Impact-Pack:让AI图像精细化处理变得简单高效
  • 收藏!2026 版程序员转型 AI 大模型全攻略:从迷茫到高薪,我的 3 年血泪经验
  • 【餐饮AI Agent生死线】:实时库存联动+动态定价+客诉自闭环——3大不可妥协能力深度拆解
  • LPC1850 SPIFI Flash配置与MCB1800开发板应用
  • 军事动态目标重构:UWB定点局限,无感定位全域空间实时建模
  • Navicat密码解密工具:高效恢复数据库连接密码的Java实现方案
  • 2026上海装修公司业主好口碑TOP10观察:从真实业主反馈看十家本土装企 - 速递信息
  • 别再手动算了!Matlab dec2hex函数实战:从单个数字到数组批量转换(附负数和补码处理)
  • Netflix股价建模:业务驱动的可解释量化决策系统
  • 卫星遥感+AI预警葡萄烟雾污染风险
  • 2026年上海遗产纠纷律所实测评测:聚焦专业能力与案件结果 - 奔跑123
  • 5步掌握OpenRocket开源火箭设计:从零到飞行仿真实战指南
  • 2026年5月23日|无锡全域黄金回收实战指南!沪奢汇、橙子、惠库三家谁最值?过来人帮你算清这笔账 - 速递信息
  • STM32F407上电后第一行代码在哪?手把手带你读懂startup_stm32f407xx.s启动文件
  • 【全球仅12家机构掌握】:娱乐行业AI Agent可信度评估框架(含GDPR+广电新规双合规校验表)
  • VSCode调试C++报错‘program does not exist‘?手把手教你修改launch.json的正确姿势
  • 如何用GHelper轻量级工具彻底解决华硕笔记本性能控制难题:完整替代Armoury Crate的终极指南
  • 2026年5月卡地亚售后服务升级说明(附最新维修中心地址) - 速递信息
  • elec-ops-inspection:让NPU当“电力巡检员“,输电线路缺陷一扫即
  • Unity MCP:编辑器上下文感知工作流的底层重构
  • 破解超融合落地痛点:天维云MASC方法论如何助力千行百业数字化转型? - 速递信息
  • SDEdit:用颜色笔触精准控制扩散模型图像生成
  • AI Agent审计工具选型终极指南(仅限2024H2可用):对比LangChain Audit、OpenTelemetry-IA、AuditGPT三套方案实测吞吐量与证据链完整性
  • 在ubuntu上对接claude code避免封号与token不足的实践
  • AI Agent运维效能跃迁路径(从POC到规模化投产的5个生死关卡)
  • 通过Taotoken聚合接口实现一个支持多模型切换的简单聊天演示页面
  • 如何免费解决Windows游戏控制器兼容性:ViGEmBus驱动完整指南