1 了解Cyusb3014
赛普拉斯 Cyusb3014 (EZ-USB FX3(后面缩写为 FX3))是一个功能强大的 USB 3.0 外设控制器,开发者能够将 USB 3.0 功能集成到他们的系统中。
编者知识有限,如有不足,请大家慷慨指出,本文主要是对官方数据手册内容的一个总结和学习理解。
推荐的官方手册阅读顺序:
1 AN75705:FX3 入门
2 AN76405:FX3启动选项
3 AN65974 / AN68829 slave fifo 设计
4 其他比较深入的文档:学习FX3固件和API的一些文档
AN84868
GettingStartedWithFX3SDK
FX3_Programmers_Manual
下面这两个文档变写固件变看,遇到不懂的API或者其他关键字就从这两个文档中查看
FX3APIGuide
EZ-USB_FX3_Technical_Reference_Manual-AdditionalTechnicalInformation
2 功能简介
2.1 FX3 开发知识体系
开发者需要学习如下所示的知识:
1 FX3 的固件编写,这里不需要了解太多,FX3很多东西都是封装好了的,调用FX3 API 就可以。如下图是FX3的SDK结构,我们在官方DEMO的基础上修改下就可以,什么实时操作系统RTOS这些可以不用管理。
2 GPIF 工具使用: GPIF 软件是 FX3 外设和FX3 芯片 通信时序接口的编写工具(后续补充),使用简单。
3 FPGA 代码编写
4 驱动开发
前期可以使用官方驱动:cyusb3.sys USB 设备驱动
驱动开发可以参考安装目录中的这个文档:
5 上位机软件编写
本文档先主要介绍前3个知识,后面的如果学到了再补充
关于软件的安装这里暂不提及。
2.2 FX3的硬件结构
可以看到,这里FX3的结构中有个ARM 9 CPU ,可以实现一些控制,这里看到FX3内部有SRAM,了512 KB 或 256 KB 的嵌入式 SRAM取决于所选择的设备型号,支持四种启动代码的方法(USB、GPIF II、I2C 或者 SPI)。
这里的GPIF是和外设通信的,也就是说你发送、接收的批量USB3.0高速数据从这里和FX3通信。
GPIF的数据通过DMA通道,和上位机通信。
FX3还支持一些低速总线,比如I2C,UART 等等....
FX3 支持晶振或外部时钟连接。支持的晶振频率为 19.2 MHz,支持的外部时钟频率为 19.2、26、38.4 和 52 MHz
对于时钟来说,输入的时钟会被内部的PLL倍频为500Mhz,系统时钟(system clock )再分频,系统时钟可分频的时钟是1.2.4.16
下图:时钟树
2.3 典型应用
如上图所示,本文章介绍的外设是FPGA。
在 FX3 连接到 FPGA 的应用中,可以通过FX3加载FPGA的bit文件,这样可以实现FPGA程序的动态更新。有关示例的实现,请参见 官方手册 AN84868 — 使用赛普拉斯 EZ-USB FX3 配置 FPGA。如下图所示:
其他的典型应用包括,可以外接一个CMOS 传感器等,比如:
2.4 FX3术语
DMA缓冲区:
FX3内部有RAM,可以将RAM中的资源分配给DMA缓冲区,可以分配多个DMA缓冲区。
FX3的DMA的类型:
DMA 描述符
是一组位于 FX3 RAM 中的寄存器。它保存了 DMA 缓冲区的地址和大小,以及指向下一个 DMA 描述符的指针。这些指针构建成了 DMA 描述符链
套接字(socket)
是外设硬件模块和 FX3 RAM 之间的连接点。FX3 上的每个外设硬件模块(如 USB、GPIF、UART 和 SPI)具有各自固定的套接字数量。
举个例子:
GPIF 套接字可以通知 USB 套接字它已经向 DMA 缓冲区写满了数据,或者USB 套接字可以通知 GPIF 套接字该 DMA 缓冲区目前为空。
也就是说你的 数据或者参数发送到这个套接字上,FX3会自动将你的数据发送到对应的另外一个设备上,一个模块和另外一个模块通信是通过套接字来进行,套接字相当于各个模块的邮寄站。
GPIF II 模块
GPIF II 模块提供四个 GPIF 线程。每次只有一个 GPIF线程能够传输数据。GPIF II 状态机必须选择一个有效的 GPIF 线程来传输数据。
GPIF 线程选择机制 和 复用器一样的。GPIF II 状态机使用内部控制信号或外部输入(地址线 A1 和 A0)来选择有效的 GPIF 线程。切换有效的 GPIF 线程时会切换用于数据传输的有效套接字,从而改变用于数据传输的 DMA 缓冲区。GPIF 线程切换没有延迟。
套接字与 GPIF 线程的默认映射如图 :
Tightly Coupled Memories (TCMs):
fx3内部0延迟缓存, The FX3 device has a
dedicated 16 KB Instruction TCM (I-TCM) for code and 8 KB Data TCM (D-TCM)
for data storage.
VIC
Vectored Interrupt Controller :FX3有32个中断
CONSUMER/PRODUCER
消费者和生产者,生产者是生产数据的一端,把数据送出去的一端是消费者,如下图:GPIF生产数据,USB EP 发送数据
ThreadX RTOS
RTOS实时操作系统,FX3 的底层操作系统,用户无需直接接触。
复位
有硬件复位,和软甲复位,硬件复位就是管脚上的拉低复位,
软复位有两种类型:CPU/热复位 和 设备复位, CPU/热复位是指在不影响任何硬件块(如USB或gifi - ii)的情况下复位CPU程序计数器。选定的块可以根据需要由固件重置。CPU/热复位 以后不需要重新加载固件了
设备复位和硬件复位一样的,复位后需要重新加载固件
EVENT 事件
所有USB事件都由USB驱动程序处理。这些包括连接、断开连接、挂起、恢复、重置、设置配置、速度更改、清除功能和设置数据包。( Connect, Disconnect, Suspend,
Resume, Reset, Set Configuration, Speed Change, Clear Feature, and Setup Packet)
用户应用程序可以注册特定的USB事件。使用回调中指定的事件类型向用户应用程序发出回调。
■应用程序可以执行必要的事件处理,然后从回调函数返回。
■如果特定事件不需要任何操作,应用程序可以简单地从发出的回调函数返回。
在这两种情况下,USB驱动程序完成事件的默认处理。
FX3重新枚举
当USB主机发出复位时,USB驱动程序处理复位,FX3设备重新枚举。如果应用程序已经注册了USB事件的回调,则会为Reset event 发出回调。
应用程序可以调用ConnectState API从USB主机断开电连接。随后调用相同的API以启用USB连接,同时导致FX3设备重新枚举。
PIB
The Processor Interface Block (PIB) on the FX3 device contains the GPIF-II controller and the associated DMA sockets and configuration registers.
The PIB driver in FX3 firmware is responsible for managing PIB bound data transfers and interrupts. This file contains the data types and API definitions for the general P-port functionality that is independent of the electrical protocol implemented by GPIF-II.
LPP_xxxx
是指低功耗外设,比如CY_U3P_LPP_SOCKET_UART_PROD代表UART的 RX 端口,CY_U3P_LPP_SOCKET_UART_CONS代表TX,因为数据要从TX端口发送。
P-PORT
指FX3中的GPIF端口
S-PORT
FX3存储类端口,比如SD/MMC
U-PORT
USB端口,或者说是Endpoint Socket端口
CPU_SOCKET
FX3的CPU所收到的数据储存的端口
2.5 FX3 demo
FX3开发套件安装目录中提供了一些DEMO,位于安装目录的 Cypress\EZ-USB FX3 SDK\1.3\firmware
有些位于firmware的下一级文件夹中,比如flash的控制demo 在 :basic_examples.文件夹
串行接口 demo在:serialf_examples文件夹
比如有:
1 USBBulkLoopAuto 固件:例默认配置了 BULK 端点 1 IN 以及 BULK 端点 1 OUT。FX3 固件使
USB 主机发送给 OUT 端点的数据循环返回到 IN 端点。相同数据可以从 IN 端点传送到 USB 主机。就是数据回环
修改 端点的举例:
2 slavefifo
FPGA 作为外设,和FX3通信的demo,有多种模式。后续介绍
3 摘自手册:
USB ISOCHRONOUS Data Loopback Examples
These examples illustrate a loopback mechanism between USB ISOCHRONOUS endpoints. This is similar to the BULK loopback examples, except that the endpoints used here are isochronous instead of BULK.
Slave FIFO Application Examples
The Slave FIFO application example demonstrates data transfer between the USB host and an external FIFO controller. The example consists of two unidirectional data pipes between the USB host and the external master. The GPIF II interface can be configured for either synchronous or asynchronous Slave FIFO transfers, using a 16-bit or 32-bit bus.
Serial Interface Examples
These examples demonstrate data accesses to the GPIOs, I2C, SPI, and UART.
USB BULK/ISOCHRONOUS Data Source Sink Examples
These examples illustrate data source and data sink mechanism with two USB BULK/ISOCHRONOUS endpoints.
Flash Programmer Example
This example illustrates the programming of I2C EEPROMS and SPI flash devices from USB. The read or write operations are done using pre-defined vendor commands. The utility can be used to flash the boot images to these devices.
Mass Storage Class Example
This example illustrates the implementation of a USB mass storage class (BULK Only Transport) device using a small section of the FX3 device RAM as the storage device. The example shows how mass storage commands can be parsed and handled in the FX3 firmware.
USB Audio Class Example
This example creates a USB Audio Class compliant microphone device, which streams PCM audio data stored on the SPI flash memory to the USB host
Two Stage Booter Example
A simple set of APIs have been provided as a separate library to implement two-stage booting. This example demonstrates the use of these APIs. Configuration files that can also be used for Real View Tool chain areprovided.
USB Host and OTG Examples
These examples demonstrate the host mode and OTG mode operation of the FX3 USB port.
关于DEMO更加详细的解释参考《 Getting Started with FX3 SDK》第 4.2章节 Firmware Examples
这里对我来说比较有用的demo:
1
2
3
4
2.6 功能接口
CyAPI.lib
CyAPI.lib 为 USB 设备提供了一个既简单又强大的 C++编程接口。C++类库为 cyusb3.sys 驱动程序提供了一个高级编程接口。此库只能与该驱动程序所支持的 USB 设备通信。
有关 CyAPI.lib 的详细信息,请参考《C++库编程者参考手册》中介绍的内容。它位于 USB 套件帮助文档中
CyUSB.dll
CyUSB.dll 是一个托管 Microsoft.NET 类库,为 USB 设备提供了一个高级编程接口。因此应用可通过库方法和属性来访问USB设备,而不用通过低级的Win32 API调用与USB设备驱动程序直接通信。由于CyUSB.dll是一个托管.NET库,因此用户可通过 Visual Basic.NET、C#、Visual J#和托管 C++等所有 Microsoft Visual Stuido.NET 语言对它的类和方法进行访问。如要使用该库,请将 CyUSB.dll 参考添加到项目的 References(参考)文件夹中。然后,访问 CyUSB命名空间的任何源文件都必须拥有用于按照准确语法添加命名空间的一行。
有关 CyUSB.dll 的详细信息,请参考《C#库编程者参考手册》中的内容。它位于 USB 套件帮助文档中
除了上述文档,还有些有些文档位于 \Cypress\EZ-USB FX3 SDK\1.3\doc
3 软件操作
(本节内容 逐步补充)
3.1 设置 输出DEBUG/RELEASE
Release模式下的固件镜像文件的尺寸小于 Debug 模式下的大小。debug模式的固件镜像包含了附加的调试符号
3.2 默认驱动安装
3.3 从USB下载程序
1 通过 Start 菜单,打开 Cypress Control Center
2 连接FX3 的USB线,然后按照下图
4 DMA 流程
使用上述 术语描述下DMA的一部分流程:
套接字链接列表是主存储器中的一组数据结构,这组数据结构在本处又称为 DMA 描述符。每个描述符指定了 DMA 缓冲区的地址和长度,以及指向下一个 DMA 描述符的指针。套接字运行时,逐个地检索 DMA 描述符,按照描述符指定的地址和长度向 DMA 缓冲区中传输数据。传输 L 个字节后,该套接字会检索下一个描述符,并继续将数据传输到另一个DMA 缓冲区内。
如下图:
套接字从存储器检索下一个 DMA 描述符时,通常需要 1 微秒,这个时候不能传输数据。
为了解决这个问题,可以使用2个套接字。
注意:
1 步骤 5a 与步骤 1a 相同,但它的套接字 1 不进行初始化,而是同时进行数据传输的。
2 只在接收端(USB)读空并释放掉 DMA 缓冲区(以接收 GPIF II 的下一个数据块)时,GPIF II 套接字才能传输数据。
3 如果接收端的速度不够块,对 DMA 缓冲区的写操作将被忽略,使套接字丢失数据。
系统中的DMA不仅仅指 批量的USB数据传输是用DMA,其他的比如I2C ,SPI ,UART都可以用DMA,所有的这些数据传输都要经过内部的System memory ,同时所有的数据访问都是经过AHB总线
CPU使用System AHB访问系统内存(System Memory, System Memory),外设的DMA路径都连接到DMA AHB。系统总线和DMA总线之间的桥接器在通过系统路由DMA通信时是必不可少的
待续.........