CY7C68013A USB开发实战:从GPIF到重枚举的嵌入式高速通信指南
1. 项目概述从零开始理解CY7C68013A USB开发如果你是一名嵌入式工程师正打算把手头的传感器、采集卡或者任何需要与PC高速通信的设备接入USB总线那么Cypress的EZ-USB FX2LP系列芯片尤其是CY7C68013A绝对是一个绕不开的经典选择。我接触这颗芯片超过十年从早期的FX2到现在的FX2LP用它做过数据采集卡、图像传感器接口、甚至自定义的协议分析仪。很多人一听到“USB固件开发”就觉得头大感觉要深入理解USB协议栈、编写复杂的驱动。但FX2LP的魅力就在于它通过一个独特的“软核”架构和成熟的开发套件把很多底层复杂性都封装好了让工程师可以更专注于自己的应用逻辑。简单来说它就像是一个自带USB“翻译官”的增强型8051单片机你告诉它数据从哪里来、到哪里去它就能帮你搞定与主机之间高速、可靠的数据传输。目前Cypress的USB外设产品线虽然历经迭代但FX2LPCY7C68013A和它的前身FX1CY7C64713仍然是全速12 Mbps和高速480 Mbps应用的中坚力量且两者在开发层面高度统一。这意味着你掌握了一套工具和方法就几乎能通吃这两个系列的项目大大降低了学习和迁移成本。不过正如所有经典器件一样官方文档的某些细节可能存在模糊地带开发环境也需仔细配置否则极易踩坑。这篇手记我将结合多年的一线开发经验为你拆解FX2LP USB部分开发的核心流程、关键陷阱以及那些官方手册里不会明说的实战技巧目标是让你看完后能独立搭建环境、理解框架、并动手实现一个基础的USB通信功能。2. 开发环境搭建与核心工具链解析工欲善其事必先利其器。FX2LP的开发离不开Cypress提供的一整套工具。但很多新手容易在这里迷失因为网上能找到的教程和开发板资料很多还停留在古老的开发套件上直接照搬会导致环境冲突、编译失败。2.1 工具链选型避开历史版本的坑首先绝对不要使用支持早期AN2131/FX1的旧版开发工具包例如那些基于Keil C51 v7.x和古老Cypress套件的。虽然FX2LP兼容FX1的代码但旧工具链对新芯片的支持不完整且与新版Windows系统、驱动可能存在兼容性问题。你应该去Cypress官网现为Infineon旗下下载并安装EZ-USB FX3/FX2LP/FX1 SDK。这个SDK是一个集成包里面包含了我们所需的一切固件开发库与头文件位于Target目录下这是编写单片机代码的核心。主机端开发组件位于Host目录下包括驱动、控制台和API库。开发板原理图与示例代码极具参考价值。安装完成后你的开发工具链核心包括以下几部分必须理解各自的作用Keil μVision IDE 与 C51 编译器这是编写和编译8051固件代码的主战场。确保你使用的是较新版本如Keil C51 v9.x以获得更好的兼容性和优化。Cypress USB Console (CyConsole)这是一个极其重要的主机端调试工具。它可以枚举连接的USB设备、查看描述符、向端点发送/接收数据、执行控制传输等。在固件调试初期用它来验证设备是否被正确识别、描述符是否正确比写主机程序快得多。Cypress Generic USB Driver (CYUSB.SYS)这是Cypress提供的通用驱动程序。无论是FX1还是FX2LP在未加载特定固件或EEPROM为空时芯片都会枚举成一个默认设备并由这个驱动接管。之后当你的固件通过“重枚举”加载了新的PID/VID系统可能会提示安装新驱动此时你既可以继续使用这个通用驱动通过.inf文件指定也可以为其编写特定的过滤驱动。Cypress USB Control Panel / USB Studio这是一个更高级的主机端应用程序框架和驱动开发辅助工具.SPT文件用于生成基础的主机端测试程序。对于快速原型开发很有帮助。Cypress GPIF Designer如果你需要使用FX2LP强大的可编程接口GPIF与FPGA、ADC等外部硬件进行高速并行通信那么这个图形化波形设计工具必不可少。它可以帮你配置GPIF的时序状态机并生成对应的C代码。注意安装路径最好保持默认C:\Cypress\USB\避免因路径包含中文或空格导致一些脚本或工具运行异常。安装后务必仔细阅读C:\Cypress\USB\doc\General\DvkUsersGuide.pdf这是官方最权威的开发环境指南。2.2 项目文件结构解剖从模板开始最稳妥的起步方式不是自己从头创建每一个文件而是直接使用Cypress SDK提供的项目模板。模板位于C:\Cypress\USB\Target\Fw\LP目录下。我建议你直接将整个LP文件夹复制到你的项目目录中并重命名为你的项目名例如MyUSBDevice。让我们打开模板中的LP.jpwKeil项目文件看看核心文件有哪些FW.C这是固件的主框架和调度中心。它包含了main()函数负责初始化芯片、处理USB事件调度通过TD_Poll、管理电源挂起/恢复以及解析来自主机的标准设备请求。在项目初期你通常不需要修改这个文件只需理解其调用关系。PERIPH.C这是用户应用代码的核心载体。按照惯例你应该立即将其重命名为与项目相关的名字比如MyDevice.c。这个文件包含了几个关键的“钩子”函数TD_Init(): 设备上电或复位后仅执行一次用于初始化你的硬件GPIO、定时器、外部芯片等。TD_Poll(): 在设备空闲时被FW.C反复调用。这里是放置你的主循环任务的最佳位置比如检查传感器数据、处理非USB相关逻辑。TD_Suspend()和TD_Resume(): 用于处理USB挂起和恢复事件实现低功耗功能。 此外它还包含了所有端点0控制端点的设备请求处理函数如DR_GetDescriptor,DR_SetConfiguration等以及一长串的USB中断服务程序ISR。这些ISR是处理批量传输Bulk、中断传输Interrupt数据收发的关键。DSCR.A51这是一个汇编文件定义了设备的所有USB描述符。这是USB开发的“身份证”和“合同”主机通过读取这些描述符来了解你的设备是什么、有什么功能、如何通信。你需要重点修改这里的厂商IDVID、产品IDPID、设备版本、字符串描述符以及最重要的——端点描述符类型、方向、大小。EZUSB.LIB和USBJmpTb.OBJ这是Cypress提供的固件库和中断跳转表对象文件由SDK提供直接添加到项目即可。它们封装了底层的USB寄存器操作、延迟函数、I2C用于EEPROM操作等。理解这个框架是成功的第一步。你的大部分工作将集中在修改DSCR.A51来定义设备特性以及在PERIPH.C或你重命名后的文件中填充TD_Init,TD_Poll和各个端点ISR来实现具体功能。3. 核心概念深度解析GPIF、描述符与重枚举要玩转FX2LP仅会调用API是不够的必须理解其核心工作原理。这能让你在调试时知其所以然快速定位问题。3.1 GPIF超越普通USB-FIFO的并行引擎FX2LP最强大的特性之一是其可编程接口GPIF。它不是一个简单的FIFO接口而是一个由固件编程控制的、能够产生复杂读写时序的状态机。你可以把它想象成一个极速的、可定制的“并行DMA控制器”。为什么需要GPIF标准USB芯片的FIFO接口通常需要单片机8051内核来搬运数据这会成为高速传输的瓶颈。GPIF则允许外部硬件如FPGA、高速ADC在GPIF状态机的控制下直接与FX2LP内部的端点FIFO进行数据交换8051内核只需负责配置和监控几乎不参与实时数据搬运从而轻松达到USB 2.0 High-Speed的理论带宽。GPIF工作流程设计波形使用GPIF Designer工具根据外部器件的时序图如读/写周期、地址/数据建立保持时间图形化地设计一个状态机波形。定义每个状态的输出控制线CTL[2:0]、地址线IFCLK等和跳转条件外部信号输入RDY[5:0]。生成代码GPIF Designer会生成一个.c和一个.h文件里面包含了描述该波形描述符的数组。固件集成在你的TD_Init()函数中调用GPIFInit()等函数将这个波形描述符数组加载到FX2LP的GPIF相关寄存器中。数据流使能相应端点如EP6 OUT或EP8 IN的GPIF模式。当外部硬件触发时GPIF状态机自动运行按照预设的波形将数据从FIFO读出或写入完全由硬件完成。实操心得调试GPIF时逻辑分析仪是必需品。首先要确保GPIF的时钟IFCLK频率和相位设置正确。其次仔细比对GPIF Designer生成的波形与外部器件数据手册的时序要求特别是建立Setup和保持Hold时间。一个常见的坑是忽略了IFCLK的负载能力如果驱动多片器件或长线可能需要加缓冲器。3.2 描述符与主机沟通的协议蓝图USB描述符是一组严格定义的数据结构告诉主机“我是什么”、“我能做什么”。DSCR.A51文件里就存放着这些结构。对于FX2LP你需要重点关注设备描述符Device Descriptor包含VID、PID、设备类bDeviceClass、协议bDeviceProtocol等。关键点bcdUSB字段决定了设备是高速0x0200还是全速0x0110。FX2LP支持两者但硬件设计上拉电阻位置和描述符必须一致。配置描述符Configuration Descriptor一个设备可以有多个配置但通常只有一个。它包含了该配置下的接口数量、供电模式等。接口描述符Interface Descriptor定义了一个功能集合。bInterfaceClass和bInterfaceProtocol在这里尤为重要。如果你使用Cypress通用驱动通常设为0xFF厂商自定义类和0x00。如果你想实现HID人机接口设备或CDC通信设备类则需要设置相应的标准类代码。端点描述符Endpoint Descriptor这是数据通道的定义。你需要为每个用于数据收发的端点如EP2, EP4, EP6, EP8在此描述其地址含方向、类型Bulk/Interrupt/Isochronous、最大包大小。高速Bulk端点最大包大小是512字节这是USB 2.0规范规定的。在描述符中需要正确体现。端点方向0x8X表示IN设备到主机0x0X表示OUT主机到设备。修改描述符后必须确保其结构正确、长度字段计算无误。一个错误的描述符会导致设备枚举失败在Windows设备管理器中显示为“未知设备”或带感叹号的设备。3.3 重枚举固件加载的魔法这是EZ-USB系列芯片的精华设计也是新手最容易困惑的地方。第一次枚举默认枚举当FX2LP芯片上电且EEPROM为空或未配置时其内部ROM中的默认程序会运行。它会使用默认的VID/PID0x04B4/0x8613 for FX2LP将自己枚举为一个“Cypress EZ-USB FX2LP - EEPROM missing”设备。此时主机加载的驱动是Cypress通用驱动CYUSB.SYS。固件下载主机应用程序或CyConsole可以通过控制传输将你的固件程序.hex或.iic文件通过端点0下载到FX2LP的片内RAM中。重枚举ReNumeration下载完成后固件中的EZUSB_Discon(TRUE)函数被调用。这个函数会模拟一次USB总线的断开与重连。芯片内部进行“软复位”8051从RAM中新的入口地址开始执行你的固件。第二次枚举自定义枚举这次芯片将使用你的固件DSCR.A51中定义的自定义VID/PID和描述符再次枚举。主机此时会为这个新的硬件ID寻找驱动。你可以让它继续使用CYUSB.SYS通过修改.inf文件包含你的新PID/VID或者安装你为特定功能编写的专用驱动。这个过程使得开发和调试变得非常灵活你无需每次修改固件都烧写EEPROM只需通过工具下载到RAM即可测试。只有当固件稳定后才需要将其烧录到EEPROM中实现上电自启动。注意事项在调试阶段如果你发现设备枚举后VID/PID还是默认的没有变成你自定义的99%的原因是重枚举没有成功。检查固件中是否调用了EZUSB_Discon(TRUE)以及调用后程序是否跑飞。另外确保DSCR.A51中的描述符数据正确无误。4. 固件编程实战从初始化到数据收发现在我们进入实战环节看看如何在一个典型的Bulk传输项目中编写代码。4.1 初始化与主循环框架在你的应用文件如MyDevice.c中首先完成基础初始化void TD_Init(void) { // 1. 初始化用户硬件LED、按键、外部传感器等 LED_INIT(); // 假设的LED初始化宏或函数 InitExternalSensor(); // 2. 初始化USB相关功能 // 使能自动指针加速提升内存访问速度对于高速数据传输至关重要 AUTOPTRH1 0x40; // 设置自动指针高字节 AUTOPTRL1 0x00; // 设置自动指针低字节 AUTOPTRH2 0x40; AUTOPTRL2 0x00; // 3. 初始化端点缓冲区 // 例如配置EP6为512字节的Bulk OUT端点主机-设备使用双缓冲 EP6CFG 0xE0; // 0b11100000: 使能端点类型Bulk方向OUT大小512 SYNCDELAY; // 重要FX2LP对某些寄存器写入需要延迟 EP6FIFOCFG 0x11; // 0b00010001: 自动输出双缓冲 // 配置EP8为512字节的Bulk IN端点设备-主机使用双缓冲 EP8CFG 0xA0; // 0b10100000: 使能端点类型Bulk方向IN大小512 SYNCDELAY; EP8FIFOCFG 0x09; // 0b00001001: 自动输入双缓冲 // 4. 如果是GPIF应用在此初始化GPIF波形 // GPIF_Init(); // 调用GPIF Designer生成的初始化函数 // 5. 使能中断可选也可以在需要时再开启 // ENABLE_EP6_OUT_INTERRUPT(); }TD_Poll()函数是你的后台任务调度器void TD_Poll(void) { // 这里放置非实时、低优先级的任务 // 例如轮询按键状态、更新状态指示灯、处理低速传感器数据 if(CheckButtonPressed()) { ProcessButtonEvent(); } // 可以在此检查USB传输状态但高速数据流通常在中断中处理 // 例如检查EP8 IN缓冲区是否就绪以便发送数据 if(EP8IN_Ready()) { // 填充数据到EP8 IN缓冲区 // EP8IN_WriteBuffer(data, length); } }4.2 实现批量数据收发中断服务程序是关键对于需要实时响应的数据收发尤其是高速Bulk传输必须使用中断服务程序ISR。模板PERIPH.C中已经为你声明了所有端点的ISR空函数你只需要填充你需要用的那几个。例如实现从主机接收数据EP6 OUT并原样发回EP8 IN的回环测试// 假设EP6 OUT中断已使能 void ISR_Ep6out(void) interrupt 0 { // 1. 清除中断标志具体寄存器位参考头文件 EP6OUTCS ~bmEPBUSY; // 假设bmEPBUSY是忙标志位掩码 SYNCDELAY; // 2. 获取OUT端点缓冲区中的数据长度 WORD bytesInBuffer EP6OUTBC; // 读取字节计数寄存器 SYNCDELAY; // 3. 从EP6 OUT FIFO读取数据到用户缓冲区 BYTE xdata recvBuffer[512]; EZUSB_ReadFifo(EP6OUTBUF, recvBuffer, bytesInBuffer); // 4. 处理数据这里简单复制到EP8 IN的发送缓冲区 // 首先等待EP8 IN缓冲区可用非忙 while(EP8INCS bmEPBUSY); // 忙等待简单示例实际可优化 SYNCDELAY; // 5. 将数据写入EP8 IN FIFO EZUSB_WriteFifo(EP8INBUF, recvBuffer, bytesInBuffer); SYNCDELAY; // 6. 提交ArmEP8 IN缓冲区使其可被主机读取 EP8INBC bytesInBuffer; // 写入字节计数即提交 SYNCDELAY; // 7. 如果需要清空EP6 OUT缓冲区准备接收下一包 EP6OUTBC 0; // 写入0可清空缓冲区根据手册 SYNCDELAY; } // EP8 IN 发送完成中断可选用于确认发送完成 void ISR_Ep8in(void) interrupt 0 { // 清除EP8 IN中断标志 EP8INCS ~bmEPBUSY; SYNCDELAY; // 可以在这里设置一个标志通知主循环或其它任务“发送完成” bEP8InTxComplete TRUE; }代码解析与关键点SYNCDELAY这是一个极其重要的宏。由于FX2LP内部总线时钟与8051内核时钟的差异对某些特定寄存器的连续写操作之间必须插入延迟。SYNCDELAY宏就提供了这个必要的延迟。忘记加SYNCDELAY是导致USB行为异常的最常见原因之一。双缓冲通过配置EPxFIFOCFG启用双缓冲可以允许FX2LP在向主机传输一个缓冲区数据的同时8051内核或GPIF准备下一个缓冲区的数据从而实现无缝的连续数据传输避免因缓冲区切换导致的延迟。中断使能默认情况下端点中断可能是关闭的。你需要在TD_Init()或合适的地方通过设置USBIEUSB中断使能寄存器和相应的端点中断使能位来开启它们。4.3 同步延迟与时钟的陷阱这是手册中语焉不详但实际影响巨大的部分。时钟频率官方技术参考手册TRM可能提到默认时钟是12MHz但这通常指的是FX1。对于FX2LP其内部默认的主时钟是48MHz通过内部PLL从外部晶振产生。这个48MHz时钟经过分频后供给8051内核例如24MHz和USB收发器。你必须在固件初始化时根据你实际使用的外部晶振频率如24MHz正确配置CPUCS寄存器中的时钟分频设置以确保8051运行在合适的频率下。配置错误会导致程序运行速度不对甚至USB通信失败。SYNCDELAY宏的实现它通常被定义为执行几条NOP指令或一个基于定时器的短延时。其根本原因是对FIFO相关寄存器、EPxBC字节计数寄存器等的写入操作需要一定周期才能反映到内部总线。连续写入必须等待上一个写操作完成。在FX2.H或syncdly.h中查看其具体定义确保你的项目包含了正确的头文件。5. 调试技巧与常见问题排查实录USB开发调试三分靠写码七分靠调试。以下是我积累的一些实战排查经验。5.1 枚举失败问题排查速查表现象可能原因排查步骤设备管理器显示“未知设备”1. 描述符错误结构、长度。2. 固件未运行或崩溃。3. 重枚举未发生。1. 使用USBlyzer或Wireshark需USBPcap驱动抓取USB数据包查看主机获取描述符请求GetDescriptor和设备的回复。这是黄金标准。2. 检查Keil编译输出的.hex文件大小确保已正确下载到RAM。3. 在TD_Init()开头点亮一个LED确认固件已运行。4. 检查固件中是否调用了EZUSB_Discon(TRUE)。设备管理器显示“Cypress EZ-USB...”但VID/PID是默认的1. 重枚举失败。2.DSCR.A51中的自定义VID/PID未被使用。1. 确认EZUSB_Discon(TRUE)调用后程序流程正常没有死循环或跑飞。2. 检查DSCR.A51文件是否被正确编译并链接到项目中。设备感叹号驱动安装失败1..inf文件不正确或未签名。2. 系统驱动策略限制。1. 对于测试可以先使用Cypress通用驱动。在设备管理器手动更新驱动指向C:\Cypress\USB\Driver\bin\i386或amd64。2. 在Windows 10/11上可能需要禁用驱动程序强制签名测试模式。3. 检查.inf文件中[Manufacturer]和[Strings]节是否与你的VID/PID匹配。设备反复连接断开1. 电源不稳定。2. 固件中USB相关中断频繁异常触发。3. D/D-信号线布线问题。1. 用示波器检查VBUS和芯片VCC电压确保上电瞬间无跌落。2. 检查中断服务程序是否过长或未及时清除中断标志导致重复进入。3. USB差分线应遵循阻抗匹配90Ω并尽量短远离噪声源。5.2 数据传输问题排查数据丢失或错误检查双缓冲配置如果只用了单缓冲主机在设备尚未处理完上一包数据时又发来新数据会导致覆盖。确保EPxFIFOCFG配置正确。检查SYNCDELAY在所有FIFO和端点缓冲区寄存器操作后务必使用SYNCDELAY。核对端点大小确保主机端应用程序发送的数据包大小不超过端点描述符中定义的wMaxPacketSize。对于高速Bulk端点最大是512。如果主机发送了更大的包需要拆包。使用CyConsole验证在编写主机程序前先用CyConsole向端点发送和读取数据排除固件问题。传输速度远低于预期8051成为瓶颈如果你是在TD_Poll()中轮询处理数据速度会很慢。必须使用端点中断和双缓冲让硬件自动处理FIFO8051仅负责搬运数据或触发GPIF。主机端程序效率主机API调用如CyAPI是否在循环中频繁打开/关闭设备句柄数据传输是否使用了重叠异步IO确保主机程序是高效的。GPIF时序未优化如果使用GPIF用逻辑分析仪检查实际波形看是否有不必要的等待状态Wait State。优化GPIF波形描述符减少状态切换时间。5.3 关于监控程序与硬件调试项目资料中提到了监控程序Monitor它主要用于配合Keil进行源码级调试。你可以单步执行固件、查看变量、设置断点。这对于排查复杂的逻辑错误非常有用。如何选择对于带有外部64KB RAM的开发板大多数FX2LP开发板都有使用mon-ext-sio1-c0.hex默认。它占用外部RAM的高端地址0xC000-0xCF75不影响用户程序空间通常从0x0000开始。如何使用在Keil中配置Debug选项为“Use: Keil Monitor-51 Driver”。在“Settings”中选择正确的串口COM Port和波特率通常38400。确保开发板的串口与PC连接。开始调试前Keil会自动尝试通过USB下载监控程序。如果失败你需要先用CyConsole工具手动将.hex文件下载到RAM。注意事项使用监控程序调试时USB通信可能会被干扰因为监控程序本身占用了部分资源。对于纯USB通信的调试有时更可靠的方法是使用printf通过串口输出调试信息如果板子有串口或者用GPIO引脚驱动LED来指示程序状态。6. 从开发板到产品EEPROM与量产考虑当你的固件在开发板上调试稳定后下一步就是让它脱离调试环境独立运行。6.1 EEPROM配置与固件自举FX2LP支持通过I2C接口从外部EEPROM通常是24LC64或类似上电自动加载固件。生成.iic文件在Keil中编译生成.hex文件后需要使用Cypress SDK提供的Hex2bix.exe工具或其在CyConsole中的集成功能将.hex文件转换为.iic格式。这个工具会添加必要的头信息包括加载地址和校验和。EEPROM内容最简单的配置是“C0 Load”。EEPROM的第一个字节写入0xC0后面紧跟转换后的.iic文件内容。这样芯片上电后会从EEPROM的0x01地址开始读取固件并加载到内部RAM执行。VID/PID覆盖在EEPROM模式你可以选择是否让EEPROM中的VID/PID覆盖DSCR.A51中的设置。通过在.iic文件头中设置相应选项来实现。烧录EEPROM可以使用编程器或者更简单的方法在固件程序中实现I2C读写函数先让FX2LP以默认模式运行然后通过主机工具或自定义命令将.iic文件内容通过I2C接口写入EEPROM。Cypress库函数EZUSB_WriteI2C和EZUSB_ReadI2C可以用于此目的。6.2 硬件设计要点时钟为FX2LP提供一个稳定的24MHz或48MHz无源晶振。时钟质量直接影响USB信号的眼图和质量。电源USB VBUS为5VFX2LP核心电压通常是3.3V。需要良好的LDO稳压器并在电源引脚附近放置足够的去耦电容如10uF钽电容 0.1uF陶瓷电容。USB信号线D和D-必须作为90Ω差分对进行布线等长、尽量短、远离噪声源。在D对于全速/高速设备上接一个1.5kΩ的上拉电阻到3.3V这个电阻的位置决定了设备速度高速模式下内部会动态控制。EEPROM接口连接24LCXX的I2C线路SDA, SCL需要加上拉电阻通常4.7kΩ。复位电路可靠的复位电路是必须的尤其是在复杂电磁环境中。6.3 驱动签名与系统兼容性对于产品化驱动签名是个大问题。Cypress提供的通用驱动CYUSB.SYS虽然有微软的WHQL签名但它的.inf文件只包含了Cypress自己的VID/PID。如果你使用自定义的VID/PID你需要修改.inf文件复制一份CYUSB的.inf文件在[Manufacturer]和[Strings]节添加你自己的VID/PID信息。驱动签名为修改后的.inf和.sys文件获取有效的数字签名。对于个人或小批量产品这成本很高。一个变通方案是指导用户将系统启动到“禁用驱动程序强制签名”模式测试模式下安装驱动但这显然不专业。使用WinUSB对于Windows 8及以上系统可以考虑使用微软内置的WinUSB驱动。通过为设备安装WinUSB你可以在应用程序层使用微软的WinUSB API或开源的libusb库进行通信完全无需自己签名的内核驱动。这需要你在设备描述符中正确配置并提供一个包含特定“Microsoft OS Descriptor”的固件或EEPROM信息。这是目前更流行的免驱方案。折腾CY7C68013A这么多年我感觉它就像一位老朋友初识时觉得它复杂神秘但一旦摸清了它的脾气比如那个必须的SYNCDELAY和时钟配置的坑就会发现它无比可靠和强大。它的GPIF功能在今天看来依然能打足以应对很多高速数据采集和传输的场景。最后给一个最实在的建议动手做一遍比看十遍文档都强。从官网下载最新的SDK找一个开发板CY3684 kit或者兼容板从最简单的“Bulkloop”例子开始让它跑起来然后用CyConsole试着发数据、收数据。在这个过程中你会遇到各种问题而解决问题的过程正是你真正掌握它的开始。当你第一次看到自己编写的固件与主机程序稳定地高速交换数据时那种成就感就是驱动我们工程师不断探索的最佳燃料。