
三年前第一次用 CY7C68013A 做 USB2.0 采集板时我其实是很不情愿的这颗芯片的 CPU 是 805148MHz放今天连 Cortex-M0 都比不上。但方案做完之后我服了——做 USB2.0 高速外设芯片主频根本不是瓶颈关键在于 USB2.0 协议引擎和端点 FIFO 的设计。CY7C68013A 把 USB 收发器、SIE、增强型 8051 和大容量端点 FIFO 集成在一颗芯片里工程师只需要关心应用层如何往 FIFO 塞数据剩下的事 USB 协议栈替你做完了。这篇东西写给准备用这颗芯片做采集卡、逻辑分析仪、FPGA 下载器或者单纯想把大量数据通过 USB2.0 高速上抛的人。硬件、固件、上位机、调试整条链路我都会过一遍重点说那些说明书里不会写的坑。1. 为什么还在用CY7C68013A做USB2.0这颗芯片的定位与真正的取舍1.1 USB2.0协议没你想的那么简单USB2.0 协议在物理层上分低速 1.5Mbps、全速 12Mbps 和高速 480Mbps。大多数人对 USB 的认知停留在“插上就能用”但真到了自己设计外设时才会发现协议层的东西有多琐碎高速模式采用 125us 微帧主机和设备之间要交换令牌包、数据包、握手包设备来不及处理时要回 NAK主机过一会儿再重试批量传输 BULK 还要遵循事务拆分和数据包重传规则。很多单片机都自带有 USB 全速控制器但全速 12Mbps 的速度在数据采集场景几乎不够用。想跑高速就必须外接 ULPI PHY还得自己处理高速 chirp 和链路训练难度一下就上来了。CY7C68013A 的好用之处在于它把 USB2.0 物理层收发器、SIE、8051 内核和 FIFO 全部做进了一颗芯片。底层枚举、SOF 同步、错误重传这些事情不需要 8051 干预。8051 只负责配置寄存器、响应控制传输、管理端点状态。理解这一点非常重要。数据链路实际上是“外部逻辑 - 端点 FIFO - USB 主机”而不是“外部逻辑 - 8051 - USB 主机”。8051 不参与大数据搬运所以它的主频哪怕再低也不会成为高速传输的瓶颈。很多人用这颗芯片跑不出速度往往是因为没搞懂这个架构把数据都放到 F/W 里搬了一遍。1.2 FX2LP 的架构亮点和替代方案对比CY7C68013A 也叫 FX2LP是 Cypress 公司在 2002 年前后推出的低功耗版本。它内部集成了增强型 8051、16KB SRAM、I2C 控制器、USB2.0 HS PHY 和最多 4KB 的端点 FIFO。四个可配置端点 EP2、EP4、EP6、EP8每个可以设置成 512B、1KB、2KB、4KB支持双缓冲甚至四缓冲这对连续传输来说是基础保障。和现在常见的几种高速 USB 方案对比起来它的定位更清晰。方案是否内置高速USB PHY固件开发复杂度成本典型场景CY7C68013A是低低USB2.0 桥接、采集卡、逻辑分析仪STM32F4/F7 ULPI PHY否需要加USB3300之类高中已有 MCU 产品需要高速 USBFPGA USB PHY否需要自己实现协议栈非常高高需要完全自定义 SOPC 链路CYUSB3014 (FX3)是USB3.0 5Gbps中高需要超速 USB 的场景从表格能看出来CY7C68013A 的最大优势是“省事”。它不需要外部 PHY不需要在 FPGA 里写 USB 协议状态机官方还给了完整的固件框架和上位机示例。只要外部并口主控能遵循 Slave FIFO 时序CY7C68013A 就能稳定地以 30~40MB/s 的速度把数据送进 USB。对大多数 USB2.0 外设来说这个带宽完全够用。当然它不是没有缺点。16KB RAM 里跑的是 8051 代码不能用 C 标准库不能跑 RTOS 的完整版调试手段也原始。但做产品不是做性能表演稳定和好用比参数重要得多。这颗芯片到今天还在大量出货本身就说明它在工业市场里的地位还没被替代。2. 硬件设计里那些容易翻车的细节电源、时钟、引脚与PCB2.1 电源去耦芯片对纹波比你想的更敏感CY7C68013A 的供电引脚分为数字 DVCC 和模拟 AVCC工作电压都是 3.3V。芯片内部有稳压器产生 1.8V 给数字核心和 PLL 使用因此外部不需要再额外供 1.8V。但正因为内部有 LDO输入电源的纹波会直接影响 USB 收发器和 PLL 的稳定性。实际布线时我建议把 AVCC 和 DVCC 在 PCB 上分开走汇合点放在电源入口或者磁珠之后。用一颗 10uF 钽电容做低频蓄能每个 VCC 引脚附近放 0.1uF 或 0.01uF 陶瓷电容做高频去耦位置越靠近引脚下越好。如果空间允许AVCC 与 DVCC 之间加一颗磁珠或 1~2 欧姆电阻做隔离可以减少开关电源噪声对模拟部分的干扰。最容易被忽略的是地。很多人以为 AGND 和 DGND 必须严格分开结果在芯片下面切地割出一块孤立铜皮反而造成回流路径混乱导致 USB 信号眼图变差。我的做法是保持完整地平面模拟地和数字地统一只在布局时把模拟器件晶振、AVCC 电容放在芯片同一侧避免高频数字信号横穿模拟区域。这个做法在多层板上非常省心。有一个非常典型的故障现象电源纹波大时晶振能起振但 USB 高速 chirp 偶尔失败枚举成功后跑一段时间又掉线。用示波器量 VBUS 和 DVCC 能看到几十毫伏的毛刺。如果纹波已经到 100mV 以上不要犹豫先把电源入口的 LC 滤波加回来。2.2 时钟与复位晶振不起振是最常见的低级错误CY7C68013A 需要一颗 24MHz 晶振由芯片内部 PLL 倍频到 480MHz 给高速 USB 模块使用。晶振选用无源晶体即可并联一个 1MΩ 左右的反馈电阻两侧各接 12pF 到 22pF 的负载电容。具体容值要看晶振的负载电容规格常见 18pF 晶振配 15pF 左右比较稳。我在调试时碰到过一次批量板子全部枚举失败拿示波器量晶振引脚XIN 有波形但 XOUT 幅度很小。后来发现是那颗晶振的 ESR 偏高加上 PCB 寄尘电容较大导致起振条件不满足。换了一家低 ESR 晶振后问题消失。如果你也遇到上电后设备完全没反应先量晶振再用一个 10K 电阻把 RESET# 拉高并确认复位时序不要一上来就怀疑 USB线有问题。复位方面RESET# 引脚低电平复位保持时间建议不少于 5us。如果使用外部复位芯片注意复位输出类型是开漏还是推挽并且要等 3.3V 稳定后再释放复位。WAKEUP# 和保留引脚不要悬空按数据手册接到合适的上拉或下拉。2.3 USB座、D/D-走线与ESD保护USB2.0 高速信号的物理层要求差分阻抗 90Ω。无论做两层板还是四层板D 和 D- 的走线都应该尽量短、尽量等长并且少打过孔。如果必须转折就做圆弧或 45° 角不要走直角。D/D- 要平行走远离时钟、开关电源跟线缆。USB 座子的外壳地不要随意飞线最好是经 1MΩ 并联 1nF 的 RC 接到数字地防止机壳静电和噪声直接灌入芯片。ESD 保护管必须加尤其产品要面对真实用户时热插拔瞬间 USB 座引脚上的静电和浪涌非常猛。ESD 管的结电容要选小于 2pF 的否则会影响高速信号的眼图。注意 CY7C68013A 内部已经集成了用于全速/高速枚举的 D 上拉电阻外部不需要再额外挂上拉。很多初学者看到其他 USB 设计中有外部 1.5k 上拉电阻就不管三七二十一加了一颗结果在高速 chirp 时信号被拉坏反而导致枚举异常。2.4 Slave FIFO 接口引脚和同步/异步模式选择在常用的 Slave FIFO 模式下需要把 FD[15:0]、SLCS#、SLRD#、SLWR#、SLOE#、PKTEND# 和若干 FIFO 状态标志引出来。CY7C68013A 也支持 8 位总线模式这时只用到 FD[7:0]。16 位模式可以获得更高瞬时带宽但外部主控的接口也要按 16 位对齐字节序要在固件里确认清楚。引脚方向作用IFCLK可配置输入/输出同步模式的主时钟异步时可不接SLCS#输入片选信号SLOE#输入FIFO 输出使能SLRD#输入读选通把 FIFO 数据送到 FD 总线SLWR#输入写选通把 FD 总线数据写入 FIFOPKTEND#输入作用相当于“提交短包”或“强制结束当前包”FLAGA/B/C/D输出FIFO 状态标志可按需配置同步模式要求外部主控提供 IFCLK或者使用芯片内部产生的 48MHz 时钟。每个 IFCLK 上升沿SLRD# / SLWR# 有效一次就完成一次读或写。异步模式则用 SLRD# / SLWR# 的下降沿触发操作时序相对简单但外部主控的建立保持时间必须查手册确认清楚。我的建议是如果外部主控是 FPGA尽量用同步 Slave FIFO 模式用 FPGA 给 IFCLK这样时序收敛容易带宽也稳定。如果是 MCU 之类的慢速主控异步模式更好因为不需要精确控制采样时钟。无论哪种模式PCB 布线时 FD 总线都不要太长数据线与 SLWR# / SLRD# 之间要满足建立时间否则会出现“偶尔错一个字节”这种极难排查的问题。3. 固件不只是跑起来从描述符、端点配置到Slave FIFO数据流3.1 固件框架和 USB 描述符表的设计逻辑Cypress 官方提供的 FX2 固件框架通常包含 fw.c、periph.c、dscr.a51 三个核心文件。fw.c 负责 USB 中断处理、重枚举和任务调度periph.c 是用户代码的主要入口包括 TD_Init、TD_Polldscr.a51 是汇编写的 USB 描述符表。固件的启动流程是先由芯片内部的 8051 从内部 RAM 启动利用 USB 总线把固件下载进去。第一次上电时如果没有 EEPROM设备会枚举成一个空的 Cypress EZ-USB FX2 设备VID/PID 是 04B4/8613。然后用 CyControl Center 这类工具把编译好的 .hex 下载进去8051 跑起来后USB 控制器会断开并重新枚举成你自己的 VID/PID这个过程叫 renumeration。理解这个过程对调试非常重要。很多人板子没有 EEPROM每次上电后电脑里都出现一个“未知设备”就以为硬件坏了。其实这是正常的只要下载固件后能变成你需要的设备说明硬件链路是通的。描述符表里要改的是设备描述符的 VID/PID、字符串描述符的厂商名和产品名以及配置描述符里的端点描述符。注意 VID 不能随便填产品量产必须有 USB-IF 分配的合法 VID自己做开发板可以先用 04B4 顶着。3.2 端点 FIFO 配置和双缓冲的意义CY7C68013A 的端点缓冲配置决定了数据能跑多快。常用的四个端点 EP2、EP4、EP6、EP8每个都能配置成 IN 或 OUT。以批量传输为例单个 Bulk 端点的高速最大包长是 512 字节但如果只配 512 字节单缓冲外部主控写入 FIFO 后USB SIE 还没把数据发完外部主控就不能继续写带宽会被卡死。双缓冲的意思是 FIFO 分成两个 buffer一个 buffer 被 USB 引擎发送时外部主控可以同时写另一个 buffer。这样流水线操作能显著提高吞吐量。实际项目中我会把 EP2 配成 Bulk OUT 双缓冲把 EP6 配成 Bulk IN 双缓冲寄存器写法参考官方示例里的EP2CFG 0xA0;和EP6CFG 0xE0;。0xA0 表示有效、方向 OUT、Bulk、512 字节双缓冲0xE0 表示方向 IN、Bulk、512 字节双缓冲。固件初始化时还要对 FIFO 做一次复位清掉上电残留的状态避免第一次传输就乱。四缓冲用得较少因为它意味着端点 FIFO 占用的 RAM 更多留给 8051 程序的存储空间就少。只有在数据流量很大但外部写入很不均匀时才考虑把某个端点配成四缓冲。3.3 Slave FIFO 模式下 8051 到底在干什么Slave FIFO 模式下数据传输的主力是外部主控和 USB 引擎8051 只在开始阶段配置寄存器运行阶段基本不参与数据流。外部主控看到 FIFO 满/空标志后往 IBUF/OBUF 直接读写USB SIE 负责把 FIFO 中的数据打包成 USB Bulk 事务。举个例子如果用 FPGA 往 EP6 IN 端点写数据FPGA 需要先判断 EP6 对应的 FIFO 是否已经满。如果没满FPGA 就可以把数据总线放到 FD 上拉低 SLWR#每个有效时钟沿写入一个 16 位字。当写入字节数达到 512 的整数倍USB 引擎会自动把这一包提交给主机。最后如果不是 512 的整数倍或者想提前结束一批数据外部主控必须拉低 PKTEND# 至少一个周期告诉 USB 引擎“这包结束”。如果不发 PKTEND#主机会一直傻等一个完整包最后一包数据永远到不了上位机。这是 Slave FIFO 设计里最容易被忽略的细节。我在不少项目里看到传输过程中前面的数据都正常就是每次最后一批数据卡住直到超时。排查到最后几乎都是 PKTEND# 没有用对。3.4 GPIF 模式为什么不默认选GPIF 是 CY7C68013A 提供的一个可编程有限状态机通过 GPIF Designer 工具设计波形可以产生复杂的读写时序去适配 NOR Flash、SRAM、AD/DA 或某些 ASIC。如果你的外部主控不是主动方而是希望 CY7C68013A 去“读”某些数据源GPIF 就是必选项。但 GPIF 的学习成本和学习曲线远比 Slave FIFO 陡峭。状态机的时序仿真、波形生成、寄存器映射每一步都需要仔细看文档。对于绝大多数“FPGA/逻辑作为主控向外抛数据”的场景Slave FIFO 已经能解决 95% 的问题。我的经验是能用 Slave FIFO 就不要上 GPIF除非你的外部设备根本没有主控能力必须由 USB 芯片主动发起读写时序。4. 上位机与驱动把USB2.0的带宽真正吃满4.1 驱动选型CyUSB3.sys、WinUSB 还是 libusbCY7C68013A 的官方驱动是老牌 CyUSB.sys新版本里 Cypress 提供了 CyUSB3.sys实际上也能兼容 FX2 设备。对 Windows 开发来说最省事的是直接装 Cypress 官方提供的 SuiteUSB 驱动包然后用 CyControl Center 验证设备。但如果要发产品我更推荐使用微软的 WinUSB 或 libusb/K 方案。WinUSB 是微软系统自带的通用驱动用 WinUSB 的 INF 文件可以把设备绑定到 WinUSB.sys然后直接用 WinUSB API 做 Bulk 读写免去安装大型 SDK。libusb 则天然支持 Windows、Linux、macOS跨平台很省事。USBlyzer 和 Zadig 这类工具可以用来临时替换驱动做调试。需要注意64 位 Windows 对驱动签名要求严格。开发阶段可以用测试签名模式或者启动选项绕过量产阶段建议走正规的 WHQL 签名或者使用微软 WCID 免驱动方案。不要以为在 32 位系统上能跑就没问题拿到客户 64 位 Win11 上很可能会被驱动签名拦下来。4.2 上位机读写线程的设计Bulk 传输的正常工作方式是一个循环线程不断发起读取请求。上位机不能等到“有数据”再来读而应该预先提交一块足够大的缓冲区让 USB 驱动后台持续填充。缓冲区大小建议设置为 64KB 到 1MB并且必须是 512 的整数倍否则部分底层驱动会做额外拆分影响效率。下面是一段典型的 C# 读取循环伪代码private void BulkReadLoop() { byte[] buffer new byte[64 * 1024]; while (running) { int transferred usbDevice.BulkInEndPt.XferData(ref buffer, 5000); if (transferred 0) { // 把 buffer 里的 transferred 字节交给处理线程 } } }实际使用中请求缓冲区如果只有 1KB你会发现带宽可能只有几 MB/s因为每次 USB 请求的提交、等待、返回都有系统调用开销。换成 64KB 后同样的设备和固件带宽能提高好几倍。原因很简单USB 驱动一次请求可以打包多个事务而不是每个 512 字节包都往返一次。读取线程里不要直接做复杂的解析或写盘最好只把数据塞进线程安全队列再由后台处理线程消费。否则一旦处理速度跟不上线程阻塞USB 缓冲区溢出就会丢数据。4.3 实测带宽为什么不是 480Mbps 的满速很多第一次接触 USB2.0 的人会算一个账480Mbps 除以 8等于 60MB/s。但在协议世界里不存在这种理想值。高速 Bulk 传输每微帧能发送的事务数量有限协议层要占用 token、data、handshake 包的开销理论上限大约在 53MB/s 左右。再加上操作系统调度、驱动处理时间、设备端 FIFO 的填充节奏稳定跑到 35~40MB/s 已经算非常健康。我做过一个 EP6 IN 双缓冲 512 字节的固件上位机使用 64KB 请求块实测连续读取速度稳定在 36MB/s 左右峰值能摸到 40MB/s。如果你想再往上提可以尝试把数据总线改成 16 位模式并保证外部主控对 FIFO 的写入没有空档同时上位机使用异步 I/O 和更大的缓冲池。但总体很难再超过 45MB/s这是 USB2.0 物理层和协议层共同决定的。如果实测只有 5MB/s通常不是 USB 协议的问题而是固件里端点 FIFO 配置错误、外部主控写入速度太慢或者上位机请求过小。带宽上不去的排查永远是从链路两端一起看不要只怪一边。4.4 数据丢失与重传策略USB Bulk 协议本身是可靠传输USB 控制器会做 CRC、握手和重传。这里说的“丢数据”不是指 USB 字节传错而是指应用层数据流出现空档。比如外部数据产生速率超过 USB 传输速率时端点 FIFO 会满外部主控被迫暂停写入这时候如果外部数据源不能暂停就会溢出丢失。处理思路有两种一种是做流控外部主控通过 FIFO 满标志暂停数据源等 FIFO 空出来再继续另一种是做标记丢弃在固件或外部逻辑里检测到溢出时给数据流插入一个溢出帧头上位机识别后做丢弃并计数。大多数实时性要求不高的数据采集场景选择流控就够了。如果是连续采集且不允许停就必须在系统层面保证写入带宽峰值低于 USB 实际可用带宽并留下余量。5. 项目调试实录枚举失败、传输丢包、兼容性问题的完整排查链路5.1 枚举失败先从“空设备”和“黄叹号”说起遇到设备插上电脑没反应或者设备管理器里出现黄叹号先不要急着换芯片。第一步看设备管理器的 VID/PID。如果出现的是 04B4/8613说明 USB 物理层已经通了芯片内部默认设备已经被主机枚举只是没有固件。这时候用 CyControl Center 下载一份固件再观察。如果设备管理器里出现的是“未知 USB 设备设备描述符请求失败”那问题多数出在 D/D- 信号质量、供电或时钟上。我会依次检查USB 线是否带数据线、D/D- 是否接反、24MHz 晶振是否起振、3.3V 纹波是否过大。这些问题里晶振不起振和 D/D- 接反占比最高。另一种情况是芯片接了 I2C EEPROM但 EEPROM 里烧录了错误的启动配置导致枚举过程反复失败。CY7C68013A 支持从 I2C EEPROM 启动EEPROM 首字节决定了启动模式是无固件的描述符模式还是把 EEPROM 里的固件加载进 RAM 再枚举的完整启动模式。如果 EEPROM 里随机写入了出厂坏数据设备表现就是不稳定。排查时先把 EEPROM 摘掉或用烧录器清空再试空芯片枚举就能定位到问题。5.2 数据乱码和最后一包卡住外部时序的锅最多有次我帮客户调一个 FPGA CY7C68013A 的数据采集项目现象是主机收到的前几包全对跑几秒钟后出现连续乱码。用逻辑分析仪抓 SLWR#、FD、FLAG 后发现问题出在 FPGA 一侧FPGA 在 FIFO 满标志出现后还多写了一拍数据这一拍数据覆盖了 FIFO 中尚未读取的某个字节导致后续所有数据整体错位。这个问题的根源在于 FPGA 的写使能逻辑没有严格同步 FIFO 满标志。正确做法是FPGA 在每个 IFCLK 上升沿都采样 FLAG只有采样到 FIFO 未满时才允许 SLWR# 有效。另外还要考虑跨时钟域问题FLAG 信号从 CY7C68013A 传到 FPGA 后必须有同步器否则会出现亚稳态导致判断错误。另一个常出现的问题是最后一包卡死。前面说过的 PKTEND# 这里就派上用场了。外部主控写入的数据如果没有写满一个完整包USB 引擎不会自动提交必须靠 PKTEND# 强制提交短包。很多从官方示例里复制代码的人会漏掉这个逻辑导致主机端总是超时。调试时可以在上位机看一次传输的总长度如果长度正好是 512 的整数倍但主机等不到那基本就是短包提交没做。5.3 带宽上不去请求大小、端点缓冲、系统调度三维排查假设设备已经枚举成功传输也不乱码但速度只有 5MB/s我会按下面三步排查。第一步看固件端点的缓冲配置如果既不是双缓冲也不是四缓冲先把端点改成双缓冲通常立刻能看到明显提升。第二步看外部主控写入 FIFO 的节奏用逻辑分析仪统计 FLAG 有效的时间比例如果 FIFO 长时间处于满状态说明 USB 传输已经成为瓶颈如果 FIFO 经常空说明外部写入太慢或没持续写。第三步看上位机请求把请求块调到 64KB 以上使用异步或独立线程。Windows 系统的 USB 驱动调度也会影响带宽。某些老版本驱动、虚拟机、USB HUB 都会让设备降速。实测时尽量把设备直接插在主板背板 USB 口上不要经过 HUB也不要插前置面板因为前置面板的线缆质量不稳定可能导致高速链路降级为全速。可以在设备属性里确认当前连接速度是不是 480Mbps。如果以上都没问题但带负载后速度还是明显下降再检查 8051 固件里是否有频繁的中断或轮询操作占用了 USB 总线。FX2 固件在 TD_Poll 里不要做耗时过长的任务尤其是不要在每个 USB 中断里做大量数据搬移。5.4 常用的调试工具和调试流程做 CY7C68013A 开发手边最好常备这几样工具CyControl Center 或 CyConsole用来下载固件、读写端口、发起 Bulk 测试Bus Hound用来抓取总线上的 USB 请求和数据看错误码USB Tree Viewer用来快速查看设备当前连接的速率和驱动栈一个 16 通道以上的逻辑分析仪用来抓取 Slave FIFO 时序。一个高效的调试流程是先用 CyConsole 下载已知可用的官方固件确认硬件基本通路没问题然后用自己的固件替换成功后用 Bus Hound 抓取一次 Bulk 传输确认端点返回的字节数和数据内容是否正确最后再挂上外部主控逻辑用逻辑分析仪观察 Slave FIFO 的时序。每一步都验证过了再合在一起联调问题范围就会小很多。我在实践中发现很多“莫名其妙”的问题最后都出在外部主控与 CY7C68013A 的时序配合上而不是芯片本身。所以如果你卡了很久不妨多花点时间把逻辑分析仪接好把外部主控的时序逐拍抓出来和手册上的时序图对齐往往能很快找到答案。6. 项目复盘CY7C68013A之外的选择与升级路线6.1 什么时候继续用 FX2LP什么时候换 FX3当项目需求的数据速率在 40MB/s 以内并且接口简单、协议明确时CY7C68013A 依然是性价比极高的选择。它的开发和调试资料非常多网上随便搜都是参考设计招聘工程师也好找人。很多工控外设、测试仪器、医疗器械模块到今天都在用这颗芯片说明它在稳定性和供应链上经得起考验。如果产品明确要求 USB3.0 超速或者未来会有超过 40MB/s 的数据吞吐需求那就要考虑 FX3也就是 CYUSB3014。FX3 内置了 ARM9 和 USB3.0 PHY开发模式更接近嵌入式系统启动方式也更灵活。但代价是开发复杂度明显提升硬件布线难度、驱动适配、SDK 学习成本都会上涨。不要因为“用新不用旧”就盲目升级带宽需求才是选型的唯一决定因素。6.2 产品化时要补的细节开发板能跑通和产品能出货中间还有一段距离。产品上用 CY7C68013A建议在硬件上加入 I2C EEPROM把固件和描述符烧进去用户插上 USB 就能直接枚举成你的设备不需要每次用上位机下载固件。EEPROM 容量至少选 64KB可以存一份固件副本升级时先把新版固件写入 EEPROM再触发复位加载降低升级失败变砖的概率。还需要为每个设备写一个唯一序列号通常放在 EEPROM 的固定区域。上位机通过厂商自定义请求读取序列号这样用户在更换设备时不会出现驱动与硬件不匹配的问题。量产测试时要覆盖 USB 枚举、各端点全速/高速连接、连续长时间传输、热插拔重复测试。如果有条件最好用示波器测一下 D/D- 的眼图确保量产一致性。6.3 关于这颗老芯片我最后的看法开发一个 USB2.0 项目技术难点往往不在 USB 协议本身而在如何把外部数据通路和 USB 端点 FIFO 妥善地衔接起来。CY7C68013A 把最复杂的部分封装了起来但这不意味着可以偷懒。硬件上电源、时钟、差分走线、ESD 是一本账固件上描述符、端点缓冲、FIFO 复位和短包提交是一本账上位机上驱动选型、请求缓冲和线程模型又是一本账。任何一边出问题最后都会表现为速度不稳、丢数据或者枚举失败。以我个人的习惯每次改完 FX2 固件都会先跑一晚上的持续传输压力测试第二天再看抓包数据。很多偶发性问题在短时间联调里根本暴露不出来只有长时间跑才能看到端点 FIFO 满标志的触发频率、主机重试次数、系统睡眠唤醒后的恢复情况。按照这个方法做几个项目后你会发现自己对 CY7C68013A 的掌控力会越来越强这颗 20 年前的老芯片也真的可以在新产品里继续发光。