1. 赛普拉斯框架文件,fw.c
2. 描述符文件,dscr.a51
3. CyStream.c 文件
这些代码模块均是合适的,如下图所示。这种结构适用于所
有基于赛普拉斯固件框架的 FX2LP USB 应用。
图 1. CyStream 代码模块

fw.c
这个赛普拉斯编写的固件(即 Frameworks)用于处理 低级 USB 详细信息。该文件无需修改。Fw.c 包含了项目的 main()函数,启动时它将调用 TD_Init(),然后在操作过程 中重复调用 TD_Poll()。该无限循环也会处理 CONTROL 端 点(EP0)SETUP 数据包。对于 GET_DESCRIPTOR 请 求,它使用 dscr.a51 中提供的描述符数据。对于其它主机 请求,将调用您的应用来执行各种操作,例如修改某个接口 的备用设置。该无限循环还会处理 USB 暂停和恢复事件 (睡眠)。
dscr.a51
它是一个包含用于特定 USB 器件的描述符数据的 8051 汇 编语言模块。该文件含有‘.db’(define byte — 定义字 节)语句,按下面的顺序列出了描述符表格数据:
1. 器件描述符
a. USB 规范版本(2.0)
b. 器件标准类别(无)
c. EP0 MaxPacketSize(64)
d. 供应商 ID = 0x04B4 = 赛普拉斯
e. 产品 ID = 0x1003 = “EZ-USB 示例 Streamer 器 件”。
f. 制造商和产品字符串索引
g. 配置数量 = 1
2. 器件限定符:对于能够在全速或高速两种模式下运行的 器件,该选项为‘其它’(非当前)速度提供设置。
3. 高速配置
a. 接口数量 = 1
b. 选择该配置的索引 = 1
c. 七个接口-端点描述符配对,同表 3 中的七个备用 设置参数相对应。
4. 全速配置
a. 接口数量 = 1
b. 选择该配置的索引 = 1
c. 四个接口-端点描述符配对,同 表 4 中的四个备用 设置参数相对应。
5. 两个字符串描述符。
全速/快速操作概况
当 USB 外设连接至主机时,主机上的内部 USB 集线器或外部集线器,如果存在)将与外设进行协商,以确定其 操作速度。实际上,主机从未选择一个工作速度,而它将使 用集线器报道的速度。只要器件仍保持连接状态,集线器报 道的工作速度便不发生变化。仅在器件断开并重新连接的情 况下,才重新开始确定速度的过程。 对于可在全速或高速模式下运行的器件,集线器报道的速度 为‘当前’速度,而它可运行的速度是其他速度。由于拥有 两个配置描述符(每一个用于每一工作速度),主机可以在 器件插入不同端口的情况下确定器件支持其它速度。因此如果您将高速器件插入到全速端口上,Windows 将显示 图 2 中所示的信息。
FX2LP 固件负责检测当前工作速度,并指定适当的配置描 述符(FS 或 HS)作为当前正在使用的速度,另一个作为 与非选定(其它)速度相应的。通过将正确的 bDescriptorType 值(CONFIG 或 OTHERSPEED)插入每 个配置描述符的第二个字节,固件可以执行上述操作。

USB 总线 RESET(复位)后,器件将恢复 FS 操作。因 此,在 USB 复位中断服务子程序中,固件标出了描述符 (图 3)。它也设置指向每个描述符的指针(pConfigDscr 和pOtherConfigDscr) ,供在枚举过程中使用。如果器件 被插入全速端口上,将保持此标号。
每当 USB 内核为高速度模式成功协商时,FX2LP 将接收一 个中断(ISR_Highspeed)。在该 ISR 中,固件将交换标号,如图 4 所示,并且要设置相应的描述符指针。

wMaxPacketSize 的概况
用于高带宽端点的 wMaxPacketSize 入口的格式不是很明 显。很有吸引力的一点是一个端点在每个微帧能够处理三个 1024 字节的数据包,该端点具有一个最大大小为 3*1024 或 3072 字节的数据包。然而,这个内容不被定义在 USB 2.0 规范中,因为一个物理数据包的最大大小为 1024 字
节。规范中的内容定义了位 0-位 10 为 maxPacketSize,最 大大小为 1024;位 11-位 12 为每个微帧中的额外数据包: 00 表示没有额外的数据包、01 表示一个额外数据包、10 表 示两个额外数据包。因此,按低字节优先的原则,使用表 5 中的值填入高带宽端点描述符。
CyStream.c
这是数据流程序。该模块中的应用代码是通过 USB Framework(USB 框架)的帮助编写的:
1. 根据应用的要求编写 TD_Init()和 TD_Poll 函数。
2. 由于 Fw.c 将多个器件请求传到端点 0,它将调用您的 代码中的特定命名函数。赛普拉斯代码模板 (peripheral.c)通过提供包含了所有函数存根的代码 帧架保存创建函数的工作。只要对应用中需要使用的函 数进行编码。
3. 您需要提供中断服务子程序来处理您的应用所使用的中断。大多数这些程序(用星号表示)是简单的确认内部工作;若不需要采取其他行为,不要修改它们。
本部分的剩下内容描述了 CyStream.c 代码。
TD_Init()
初始化程序执行以下操作:
1. 将 IFCONFIG 寄存器设置为 0x40,以便选择 8051 48 MHz 时 钟 频 率 , 并 将 一 组 I/O 引 脚 配 置 为 端 口 (GPIO)引脚(这些引脚可以作为从设备 FIFO,也可 作为 GPIF 接口引脚)。
2. 关闭四个开发板上的 LED。注意,通过读取预定的存 储器位置可以打开和关闭开发板上的 LED。
3. 使能 EP2,会禁用所有其他 LED。然后,如果主机将 备用设置更改为使用 EP6-OUT 的设置,代码将在设置 更改的同时使能该端点。
4. 使能帧开始(SOF)中断。SOF ISR 处理 LED 闪炼时 序。
5. 将 1024 数据字节填充到 EP2-IN FIFO 内,并准备执行 第一个 IN 传输。在 FIFO 中带有特定数据将便于使用 USB 总线分析仪查看数据包,但是此数据与该应用无 关。因此,该步骤是可选的。
TD_Poll()
USB Frameworks 在无限循环中所调用的 TD_Poll()是很简 单的。它只需通过检查 FIFO 标志来确定端点 FIFO 需要重 新待命的时间点。该操作发生在两个相同的代码段内,其中 一个用于高速操作,另一个用于全速操作。每个代码段将执 行以下操作:
1. 检查 EP2-IN FIFO 的未满(not FULL)状态。 该状态 表明主机已成功读取了 FIFO IN 数据,并且 FX2LP 逻 辑将 FIFO 控制权转给 8051。如果它未满:
a. 打开 IN LED,并且设置 SOF 中断服务子程序 (ISR)的时间常量(inblink)以便关闭它。通过加载与当前备用设置相匹配的尺寸加载到 EP2-IN字节计数寄存器内来重新准备执行下一个 IN 传输。这些值与表 3(HS)和表 4(FS)中最右侧一列相应。
2. 检查 EP2-OUT FIFO 的非空(not EMPTY)状态。该 状态表明主机已经成功将 OUT 数据发送到 EP2-OUT FIFO 内,并且 FX2LP 逻辑将 FIFO 控制权转交给了 8051。如果它为非空:
a. 打开 OUT LED,并设置 SOF ISR 的时间常量 (outblink),以关闭它。
b. 通过将字节计数加载到 EP2BCL 寄存器内来重新 准备执行下一个 OUT 传输。实际字节计数值并不 重要,但必须将位 7 置位,以设置 SKIP 位。 SKIP 位允许忽略刚收到的数据包,并且它的缓冲 器立即可用于下一个 OUT 数据包。
3. (适用于 HS)检查 EP6-OUT FIFO 的非空状态。该状 态表明主机已经成功将 OUT 数据发送到 EP6-OUT FIFO,并且 FX2LP 逻辑将 FIFO 控制权转交给 8051。 如果它为非空,需要执行步骤 2a 和 2b,但是使用 EP6BCL 寄存器。
处理器件请求和 IRQ
大多数简单的器件请求是很明显的,如设置本机变量为配置 索引的 DR_SetConfiguration 以及返回索引的 DR_GetConfiguration。简单的 ISR 只清除 IRQ 标志。
CyStream.c 函数
CyStream.c 执行其操作时要使用下面四个函数:
ISR_Ures
ISR_Highspeed
DR_Set_Interface
DR_SOF
ISR_Ures
在 USB 总线 RESET 事件完成后触发该 ISR。高速器件从 全速模式中退出复位状态,所以 ISR 将 FS 配置描述符设置为主描述符,并将 HS 配置描述符设置为 OTHERSPEED
描述符(图 3)。然后,ISR 将关闭 HS LED(EVKIT 板上 的 D2),并使用‘blinkmask’为 LED D5 设置两秒周期。
ISR_Highspeed
FX2LP 进入高速模式时将触发该 ISR。配置描述符被替换 (图 4),高速 LED2 被打开,另外默认的 EP2-IN 被初始 化。设置变量‘blinkmask’以用于在高速模式下的 1 秒 D2 闪炼周期。
DR_SetInterface
USB 主机使用 Set_Interface 请求来更改某个接口的备用设 置。由于该设计只使用一个接口,所以无必要检查接口索 引。该代码需要检索 SETUP 数据包中表示所请求的备用设 置的第三个字节(SETUPDAT[2])。 两个‘switch’语句按照备用设置并使用表 3(高速模式) 和表 4(全速模式)中的参数来配置端点。‘case’语句将 执行以下操作:
只使能设置项需要使用的端点
对于 IN 端点,复位 FIFO 以便刷新任意过时数据。对 于 BULK IN 端点,将端点的数据切换复位为 0
对于 OUT 端点,准备执行所需的 FIFO 数量
更新 7 段显示屏,以便显示新的备用设置 0-6
DR_SOF
SOF 中断对时序事件(如 LED 闪炼频率)非常有用。SOF 中断在每 1 mSec(全速模式)和每 125 微秒(高速模式) 发生一次。SOF ISR 将计数关闭时间,并在合适场合下关 闭活动 LED D5、IN LED D4 以及 OUT LED D3。
文件来源于:
001-75393_AN4053_Streaming_Data_through_Isochronous_or_Bulk_Endpoints_on_EZ-USB_FX2_and_FX2LP_Datasheet_Chinese