ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CY7C68013A C0模式启动全解析:固件下载与EEPROM引导实践

CY7C68013A C0模式启动全解析:固件下载与EEPROM引导实践 做 USB 外设开发的人十有八九都绕不过一块老芯片CY7C68013A也就是行业里常说的 FX2LP。这颗“不服老”的 8051 内核 USB 控制器到现在依然是逻辑分析仪、USB 转并口/JTAG、视频采集卡和各类定制 HID 设备里的常客。我最近帮一个硬件团队把一个自研 USB 工具从原型倒腾成小批量产品卡在最开始的启动环节整整两天。问题说起来很简单CY7C68013A 的 C0 模式启动——设备插上后能被电脑认到但固件不加载、设备不稳定、换台电脑就失效。这篇就把 C0 模式从原理到实操完整捋一遍包括启动模式判断、驱动安装、固件下载、EEPROM 引导切换以及我踩过的几个坑。适合刚接触 FX2LP 的硬件工程师、嵌入式开发还有想做 USB 工具原型验证的朋友。1. 先把 C0 模式的来龙去脉讲清楚1.1 一块没有“硬盘”的 8051 单片机FX2LP 内部是一个增强型 8051 内核加完整的 USB 2.0 高速 PHY 和控制器。这里有个关键特性它内部没有 Flash、没有 EPROM用户程序只能放在片内 RAM 里跑。RAM 是易失的断电就没了所以芯片上电那一瞬间CPU 手里根本没有代码可执行。那电脑第一次插上它怎么知道它是谁答案是芯片出厂 ROM 里固化了一小段引导代码。硬件复位后USB 内核先起来用一组默认描述符把设备枚举成一个“无固件的 FX2LP 设备”然后等待主机把真正的固件通过 USB 下载到它的 RAM 里。固件到位后引导代码再释放 8051 复位CPU 开始跑用户程序。这种“固件由主机供给、CPU 随后启动”的流程就是行业里常说的 C0 模式。可以用一个生活化类比FX2LP 是一台没有硬盘的迷你电脑。上电后它只能进 BIOSBIOS 通过网络USB等待远程服务器主机把操作系统固件发到内存里然后才开始干活。这里的 BIOS 就是芯片 ROM 里的引导代码远程服务器就是跑在电脑上的下载工具。C0 模式的好处是开发阶段非常灵活改完固件重新下载一次 RAM 就行不需要反复擦写外部存储坏处也很明显断电之后固件就没了设备没法独立工作。1.2 常见启动模式怎么区分FX2LP 的启动模式不是靠跳线帽选的而是由外部 I2C EEPROM 是否存在以及 EEPROM 的首字节内容决定的。官方手册里最常见的两种模式是 C0 和 C2我实际用下来足够覆盖绝大多数项目模式EEPROM 情况启动行为典型用途C0无 EEPROM或首字节为 0xC08051 不运行设备以默认 USB 设备枚举等待主机下载固件开发调试、逻辑分析仪、需要主机加载固件的产品C2有 EEPROM首字节为 0xC2复位后 8051 自动从 I2C EEPROM 拷贝固件到 RAM 并运行量产产品、插上就能用的独立 USB 设备具体判断流程大概是芯片复位后内部逻辑通过 SCL/SDA 引脚去读外接 EEPROM 的首字节。读不到 EEPROM或者读到的首字节不是有效的引导标志就落入 C0 模式读到 0xC2就走 EEPROM 引导流程。所以 C0 模式其实根本不需要外接 EEPROM原型验证时器件清单可以砍掉这个芯片少一个采购料号。但如果项目后面要转量产我还是建议 PCB 上预留 EEPROM 焊盘理由到第 4 节讲 C0 转 C2 的时候你自然就明白了。这里有一个新手经常忽略的点SCL/SDA 是 I2C 总线就算不接 EEPROM这两个引脚也建议各放一颗 2.2k 欧姆上拉电阻到 3.3V。因为芯片复位后要去探测 I2C 总线总线上没有上拉探测逻辑可能处于不确定状态极少数板子会出现枚举不稳定。我见过有人画板时觉得“反正不用 EEPROMI2C 上拉省了”结果设备时好时坏查了半天。1.3 为什么项目最终选了 C0 模式做启动我们那个自研工具最初需求是“插上电脑就能被识别然后由上位机软件决定跑哪一套固件”。如果直接做成 C2 模式固件烧死在 EEPROM 里后面要升级固件就得重新烧芯片现场维护成本高。C0 模式天然适合这种“主机下发固件”的架构每次上电设备只是默认枚举上位机检测到设备后根据用户选择的模式下载不同固件到 RAM一个硬件就能当多个设备用。另外一个原因是硬件迭代节奏太快。原型阶段几乎每半天就要改一次固件如果用 EEPROM 引导每次改动都要烧录一颗 EEPROM浪费时间不说反复插拔还容易把焊盘弄坏。C0 模式下下载固件只是点一下按钮的事整个流程三秒钟完成。所以我的建议是产品原型阶段无脑用 C0等固件定型、进入小批量交付再考虑切到 C2 或 C0C2 双引导。2. 开工前的硬件与工具准备2.1 硬件清单和板级检查C0 模式启动实验需要的硬件很少一块 FX2LP 核心板或自制板、一根确定能传数据的 USB 线、一个 5V 电源开发板一般自带 USB 供电再加一块可选的 I2C EEPROM 用于后面的 C2 实验。EEPROM 我推荐 AT24C64 或同兼容型号容量 8KB 足够放大多数固件而且到处都能买到。拿到板子后别急着插电先做一轮静态检查。用万用表蜂鸣档量一下 3.3V 和 GND 之间有没有短路再看 USB 座子的 D、D- 到芯片引脚之间的走线是否连通。FX2LP 是 56 脚 QFN 或 128 脚 QFP 封装焊接不良的情况在手工样板里很常见尤其是 QFN 中心的散热焊盘虚焊会导致芯片整体不工作。还要确认 24MHz 晶振的两个负载电容有没有焊反、晶振本体有没有破损。很多“插上没反应”的板子问题根本不在固件而在硬件。上电后如果有示波器可以量一下晶振引脚应该能看到 24MHz 正弦波幅度一般在几百毫伏到 1V 左右。没有示波器也没关系后面看 USB 枚举结果也能间接判断。注意 FX2LP 需要外部晶体频率是 24MHz不推荐用随意频率的晶振因为内部 PLL 和 USB 时钟都是按 24MHz 计算出来的。2.2 软件工具链全家桶开发 FX2LP 的软件工具我这里按用途分三类第一类必装后两类看情况。第一类是 Cypress 官方工具。老一点的叫 Cypress SuiteUSB装好后里面带 Cypress USB Control Center这是下载固件、读 EEPROM、做 USB 抓包分析的主力工具。还要装 EZ-USB FX2LP 的驱动包里面有针对默认设备 0x04B4:0x8613 的 inf 文件。现在 Infineon 接管之后这些工具还能在官网下载到搜 “FX2LP SDK” 或 “SuiteUSB” 就能找到。第二类是固件编译工具。官方示例工程基本都用 Keil C51配合 Cypress 提供的 FX2LP 寄存器头文件和示例库。Keil 是商业软件但有评估版。如果不想花钱也可以用开源编译器 SDCC很多第三方项目已经验证过 SDCC 能编译 FX2LP 固件只是要自己调整启动文件和内存模型。我个人的建议是新手先用 Keil 跑官方示例少踩坑。第三类是辅助工具。Windows 下可以用 Zadig 给设备装 WinUSB 或 libusbK 驱动这样用 Python 或 C# 写上位机下载固件会方便很多。Linux 下可以用 fx2lib 项目里的 fx2load 工具或者直接用 sigrok 生态里的固件加载工具。如果你要抓 USB 协议包Wireshark 配合 USBPcap 也行但最顺手的还是 Cypress USB Control Center 自带的监控功能。2.3 Windows 驱动安装的必经之路C0 模式第一次插上设备Windows 设备管理器里大概率会出现一个带黄色感叹号的未知设备或者显示为 “Cypress FX2LP” 但没有正确驱动。这时候手动更新驱动指向 SuiteUSB 安装目录下的驱动文件夹选 “Cypress USB Console Driver” 或对应版本的 EZ-USB 驱动即可。这里有两个容易踩的坑。第一个是 Win10/Win11 的驱动签名问题。老版本 Cypress 驱动没有微软签名系统默认会拒绝安装。解决办法有两个一是开机进高级启动选择“禁用驱动程序强制签名”装完驱动再恢复正常启动二是用 Zadig 把设备驱动换成微软签名的 WinUSB 或 libusbK。我现在一般直接用 Zadig省得每次重启都折腾。第二个坑是 64 位系统下老版本 SuiteUSB 自带的上位机示例工程可能编译不过或者 Control Center 打不开。我建议装新一点的 SuiteUSB 版本如果使用中遇到缺少 dll 之类的问题大概率是安装包没装全重装并勾选所有组件就行。驱动装上之后打开 Cypress USB Control Center左边设备列表如果能看到 VID 04B4、PID 8613说明 C0 模式最基本的枚举已经通了。3. C0 模式启动实操从接线到第一行日志3.1 静态确认你拿到的到底是不是 C0 模式把板子通过 USB 线连到电脑先不要打开任何下载工具等 Windows 弹出“设备已识别”的提示音。然后打开设备管理器在“通用串行总线设备”或“通用串行总线控制器”里找到 Cypress FX2LP 设备右键看属性-详细信息里面的硬件 ID 应该包含 VID_04B4 和 PID_8613。如果你看到的是 VID_04B4、PID_8613恭喜芯片已经进入默认 C0 枚举状态。此时 8051 内核是停在复位状态的设备只是个空壳 USB 外设。如果看到的 PID 不是 8613可能板子上已经烧过其他固件或者 EEPROM 里已有内容芯片直接跑进了 C2 模式。处理方式是先尝试擦除 EEPROM或者在固件下载工具里强行走 “Program RAM” 流程覆盖当前行为。这一步很重要因为很多人一上来就直接点下载固件结果工具报“设备未找到”其实就是没确认设备当前处于什么状态。C0 模式调试第一步永远是把默认枚举搞定。3.2 用 Cypress USB Control Center 下载第一份固件启动 Cypress USB Control Center设备列表里选中 0x04B4:0x8613。然后点击菜单里的 “Program RAM” 或右键选择 “Download to RAM”找到编译好的 .hex 固件文件确认下载。下载成功后设备通常会“消失”一下然后重新枚举成固件里定义的 VID/PID这个过程叫重枚举。我建议第一次实验用 Cypress 官方示例里的 Bulkloop 固件它有现成的 Keil 工程编译后生成 .hex而且行为简单设备枚举后你在上位机往 bulk 端点发什么数据它就原样返回什么。如果 Bulkloop 能跑通说明整个下载链路、8051 启动、USB 端点配置都没问题。之后再换成自己的固件出问题也好定位。下载时注意 Cypress USB Control Center 的状态栏会显示类似 “Download successful” 或 “Programming completed” 的提示。如果你点了下载后一直转圈先检查设备是不是已经被其他软件占用比如上位机调试程序把设备句柄打开了关掉占用程序再试一次。3.3 重枚举机制为什么下载完设备会“消失”C0 模式下载固件后设备不会一直保持 0x04B4:0x8613。固件运行起来之后会执行一段重枚举逻辑芯片主动把 USB 总线断开一小段时间让主机认为设备被拔出然后再重新连接用固件里新的设备描述符、配置描述符完成枚举。这个设计是为了让设备从“空壳 FX2LP”变成“真正的自定义设备”。实际调试中如果固件里 USB 描述符写的不对最常见现象是下载固件后设备消失了但再也不出现。这时 Cypress USB Control Center 也看不到设备需要拔掉 USB 线重新插一下让芯片回到 C0 默认枚举状态重新下载修改后的固件。这种“设备消失”不是芯片坏了而是重枚举逻辑卡住了。这里有个实用技巧调试阶段可以在固件里加一个很小的延时比如启动后等 500ms 再执行重枚举给主机驱动足够时间释放旧设备节点。很多重枚举不稳定的问题加个延时就好了原理是避免主机端驱动资源还没释放完毕新设备就急着上线导致枚举冲突。3.4 命令行和脚本化下载批量调试不再痛苦图形界面点按钮适合单个板子调试但如果你同时调三块板子或者要做量产下载手动点击就太慢了。Windows 下可以利用 SuiteUSB 自带的 CyUSB.NET 库写一个 C# 小程序打开设备、下载固件、释放设备一条龙完成。原理很简单就是找到 VID/PID 匹配的设备对象调用下载函数传入固件字节数组。Linux 下更直接fx2load 命令行工具就能完成同样的事。典型的调用方式是# 先确认设备节点例如 /dev/bus/usb/001/004 lsusb # 再下载固件到 RAM fx2load -I firmware.hex -D /dev/bus/usb/001/004不同版本 fx2load 参数可能略有差异以你机器上fx2load --help的输出为准。核心思路就是指定固件文件和设备节点工具会通过 USB 控制传输把固件写入 RAM然后释放 8051。Linux 下跑 C0 模式还有个好处可以用 udev 规则在设备插入时自动执行下载脚本实现“插上即编程”这对嵌入式设备的研发效率提升非常明显。4. 从 C0 到 C2掉电后能不能自己启动4.1 为什么 C0 模式留不住固件C0 模式的固件在 RAM 里RAM 断电即失。这意味着每次设备重新上电都必须由主机重新下载一次固件设备自身没有任何“记忆”。这在开发阶段完全没问题但到了产品交付阶段就很尴尬用户买回去插上电脑如果上位机软件没装好或者没启动设备就是个未知设备功能完全不工作。所以正式产品一般会切到 C2 模式在板上放一颗 I2C EEPROM把固件固化进去。上电后芯片自动从 EEPROM 搬固件到 RAM然后启动 8051整个过程不需要主机参与插上就能用。C2 模式配合驱动自动安装用户体验和普通 U 盘、键鼠外设没什么区别。4.2 把固件转成 .iic 并烧录 EEPROM从 C0 切到 C2核心动作是生成 EEPROM 镜像文件也就是 .iic 文件然后写进 I2C EEPROM。Cypress 官方提供了 hex2bix 工具能把编译出的 .hex 转成 .iic。转换时要注意指定引导首字节 0xC2这样芯片上电后才知道要从 EEPROM 引导。具体命令参数不同版本略有差别用之前先敲一下hex2bix --help看帮助核心参数就是输入文件、输出文件、引导标志。拿到 .iic 文件之后设备在 C0 模式下插入电脑打开 Cypress USB Control Center选择 “EEPROM” 相关的编程菜单加载 .iic 文件写入。写入完成后断电重启设备应该直接枚举成固件里定义的 VID/PID而不是默认的 0x04B4:0x8613。如果重启后还是默认 PID大概率 .iic 首字节不对或者 EEPROM 写入没成功。4.3 EEPROM 烧录时常见的几个坑第一个坑是 EEPROM 写保护。AT24C64 的写保护引脚 WP 如果被拉高I2C 写入会被硬件拒绝工具可能报错或者假装成功但数据根本没写进去。很多开发板为了省事把 WP 直接接地但如果你用的是通用 EEPROM 模块一定要检查 WP 引脚电平。第二个坑是 I2C 地址。FX2LP 访问 EEPROM 时要求 EEPROM 的地址线 A0、A1、A2 全部接地对应 I2C 从机地址是 0x008 位写地址 0xA0。如果你的模块把地址线拉高了芯片读不到还是会落入 C0 模式。买 EEPROM 模块时优先选地址可配置且默认全 0 的。第三个坑是 .iic 文件大小。FX2LP 从 EEPROM 引导时能加载的固件大小有限制实际取决于 EEPROM 容量和引导逻辑常见 AT24C64 是 8KB如果你的固件编译出来超过这个容量就要裁剪功能或者改用更大容量 EEPROM。我见过有朋友固件写了 12KB烧进去之后 8051 只跑了一半代码现象极其诡异。4.4 双固件方案把 C0 当 Bootloader 用如果你既想产品插上就能用又想保留现场升级能力最灵活的做法是 C0C2 混合EEPROM 里只放一个极小的 Bootloader 固件上电后由这个 Bootloader 决定是直接运行已有应用还是等待主机通过 USB 下载新固件到 RAM。这个思路和安卓手机刷 Recovery 是同一个套路。具体实现时应用固件可以放在 RAM 中由 Bootloader 加载也可以把应用固件放到 EEPROM 的另一段区域。为了降低复杂度我通常这样设计Bootloader 上电后先尝试从 I2C EEPROM 读应用固件到 RAM如果读到有效固件就跳转运行如果检测到主机端升级工具发送的升级命令就进入下载模式接收新固件并写回 EEPROM。这样量产时预烧 Bootloader用户拿到手插上就能用以后升级只需要上位机发一段升级指令不用拆机烧录。这个方案唯一的代价是引导时间变长一点Bootloader 要先读 EEPROM 再跳转但一般几十毫秒内能完成用户根本感知不到。5. 我踩过的 C0 启动坑与排查技巧5.1 枚举成功但 PID 还是 0x8613固件没跑起来这是 C0 模式最经典的问题设备能被电脑识别下载固件也提示成功但 PID 始终是 0x8613说明 8051 实际上没有开始执行用户代码。先别怀疑下载工具重点检查 CPUCS 寄存器是否被正确设置。正常情况下下载工具会在写完 RAM 后释放 8051 复位但有些自制板或者特殊固件环境这一步会被跳过或失败。此时可以用 Cypress USB Control Center 的 vendor request 功能手动向 CPUCS 寄存器地址 0xE600写入释放复位的值再观察设备是否重枚举。如果手动释放后设备正常说明问题出在下载工具的自动流程可以在自己的上位机下载脚本里补上这一步。5.2 固件下载后设备彻底“消失”重插才恢复这个现象我刚才提过本质是重枚举没有顺利完成。可能原因有三个一是固件里 USB 描述符有问题新设备无法枚举成功二是固件启动后立即死机或跑飞没来得及完成重枚举三是主机端驱动资源没释放干净。排查顺序我建议这样先拔掉 USB 重新插确认设备能恢复成默认 C0 状态然后在固件启动处加延时等 500ms 再执行后续操作再用 Cypress USB Control Center 抓一下设备重新枚举的过程看主机有没有收到 SETUP 包。如果抓包显示设备上线但没有返回描述符基本就是固件里描述符指针或端点配置写错了。5.3 自制板完全不上电枚举USB 线插上没反应如果一块自制 FX2LP 板插上电脑任何设备都不出现甚至连未知设备都没有问题大概率在硬件。优先量三个地方芯片供电引脚电压是否稳定在 3.3V24MHz 晶振是否起振RESET 引脚复位时序是否正确。供电方面FX2LP 对电源纹波有一定要求如果开发板上同时跑电机、继电器等大电流负载USB 供电会被拉垮设备会间歇性掉线。这种情况建议用独立稳压器别直接从 USB 的 5V 硬怼。USB 走线方面D 和 D- 要尽量等长、差分阻抗控制在 90 欧姆左右如果走线太长或者绕了太多弯高速握手会失败设备表现为时好时坏。需要说明的是FX2LP 内部已经集成了 D 的上拉电阻不需要像普通低速 USB 设备那样外接 1.5k 上拉我看到过有人额外加了一颗反而把 USB 信号拉坏了。5.4 实用排查速查表现象优先检查解决办法插入完全没有反应供电、晶振、USB 走线示波器量晶振万用表量电源短路换 USB 线枚举为未知设备驱动未安装/签名问题用 Zadig 装 WinUSB或禁用驱动签名枚举为 0x04B4:0x8613 但固件不跑CPUCS 复位未释放、下载工具异常手动写 CPUCS换 Control Center 版本下载后设备消失固件描述符、重枚举时序加延时检查描述符重插恢复PID 显示正常但功能不对固件逻辑、端点配置用 Bulkloop 交叉验证逐步调试换台电脑就不工作上位机未启动、驱动未预装C0 模式产品必须配自启动上位机或切 C25.5 最后留一个实用技巧我自己做 FX2LP 板子时会故意在设计上留一个“调试跳线”把 EEPROM 的 SCL 引脚通过 0 欧电阻接到芯片量产时贴电阻开发调试时不贴。这样既能随时切回纯 C0 模式又不用焊来焊去。另外第一次画板子千万别急着做功能先把 C0 模式跑通只要插上能看到 0x04B4:0x8613后面固件问题都只是时间问题这一关过了这个项目基本就成功一半了。
返回列表