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