-
USB CYPRESS
68013A
开发重点讲解
7.
重点讲解
7.1
如何理解
CYPRESS
68013A
程序框架
CYPRE
SS
提供了非常好的程序框架,免去了用户自己编写一些通用性比较强、模
式化的程序(如果不提供,很少有人能写出如此高效,结构紧凑的程序,实际上
此框架和
68013A
内部结构关系密切,一般人也没有足够
的内部资料也不可能写
出来)。在框架的基础上,用户只需在相应的地方写相应的代码即
可完成
USB
工作。
一般来说框架可以分成
3
个部分。
< br>
1
)
描述符文件。
例如
dscr.a51<
/p>
文件,
里面定义了枚举设备的时候要用的各
种描述符信息,
这部分用户需要根据实际的情况自己编写。
我
写的时候发现一个
最大的问题就是各种书籍协议版本不同,
翻译
质量不同,
同一字段的意义表述不
同,容易让人产生困惑。例如
USB 1.1/2.0/2.13
对设备类型的子类定义都不
完
全相同,
所以写的时候最好几种文档对比起来写。
由于
USB
官方网站的文档中字
< br>段解释过于专业化,
所以对
USB
不是很熟悉的人比较难以理解其真正含义。
所以
要多参考不同
的书籍,
某种程度上降低了开发速度,
但对第一次做
USB
开发的人
来说,这也是值得的。
2
)
固件文件,例如
FW.C
文件,这是硬
件程序的函数入口。主要有以下这些
方法:
void SetupCommand(void);
//
握手命令处理
void
TD_Init(void);
//
初始化,完成配置,启动时调用一次
void TD_Poll(void);
//
用户处理程序,循环调用
void IO_Init(void); //8051
IO
初始化
void
REG_Init(void);
//8051
寄存器初始化
BOOL TD_Suspend(void);
//
挂起处理
BOOL
TD_Resume(void); //
唤醒处理
//
以下为各种描述符的获取和设置函数,重枚举时自动调用<
/p>
BOOL
DR_GetDescriptor(void);
BOOL
DR_SetConfiguration(void);
BOOL
DR_GetConfiguration(void);
BOOL DR_SetInterface(void);
BOOL DR_GetInterface(void);
BOOL DR_GetStatus(void);
BOOL DR_ClearFeature(void);
BOOL DR_SetFeature(void);
BOOL DR_VendorCmnd(void);
3
)
<
/p>
功能文件,处理各种中断。例如
PERIPH.C
文件。
8051
一般默认只有四
个中断,
这显然不够
USB
使用,<
/p>
所以
CYPRESS
引入了自动向量的概
念,
相当于软
中断,大大扩展了现有的中断数量。主要的中断有
:
void ISR_Sudav(void)
interrupt 0 //
收到
setup
包
void ISR_Sutok(void)
interrupt 0 //
收到
SETUP
令牌
void ISR_Sof(void)
interrupt 0 //
收到起始帧
void ISR_Ures(void) interrupt 0
//
收到
RESET
void ISR_Susp(void) interrupt 0
//
收到挂起信息
void
ISR_Highspeed(void) interrupt 0
//
高速模式
void
ISR_Ep0ack(void) interrupt 0
//
正常响应
ACK
void ISR_Stub(void) interrupt
0
void ISR_Ep0in(void)
interrupt 0
void
ISR_Ep0out(void) interrupt 0
void ISR_Ep1in(void) interrupt
0
void ISR_Ep1out(void)
interrupt 0 //EP1
输入中断
void ISR_Ep2inout(void) interrupt 0
//EP2
中断
void
ISR_Ep4inout(void) interrupt 0
void ISR_Ep6inout(void) interrupt
0
void ISR_Ep8inout(void)
interrupt 0
void
ISR_Ibn(void) interrupt 0
void ISR_Ep0pingnak(void) interrupt
0
void ISR_Ep1pingnak(void)
interrupt 0
void
ISR_Ep2pingnak(void) interrupt 0
void ISR_Ep4pingnak(void) interrupt
0
void ISR_Ep6pingnak(void)
interrupt 0
void
ISR_Ep8pingnak(void) interrupt 0
void ISR_Errorlimit(void) interrupt
0
void
ISR_Ep2piderror(void) interrupt 0
void ISR_Ep4piderror(void) interrupt
0
void
ISR_Ep6piderror(void) interrupt 0
void ISR_Ep8piderror(void) interrupt
0
void ISR_Ep2pflag(void)
interrupt 0
void
ISR_Ep4pflag(void) interrupt 0
void ISR_Ep6pflag(void) interrupt
0
void ISR_Ep8pflag(void)
interrupt 0
void
ISR_Ep2eflag(void) interrupt 0
void ISR_Ep4eflag(void) interrupt
0
void ISR_Ep6eflag(void)
interrupt 0
void
ISR_Ep8eflag(void) interrupt 0
void ISR_Ep2fflag(void) interrupt
0
void ISR_Ep4fflag(void)
interrupt 0
void
ISR_Ep6fflag(void) interrupt 0
void ISR_Ep8fflag(void) interrupt
0
void
ISR_GpifComplete(void) interrupt 0
void ISR_GpifWaveform(void) interrupt
0
特别是对于接受数据,
一般都在
中断中完成相应处理,
“中断中适合进行少量简
短的操作,不适
合进行复杂操作”,这句话在此依然有效。如果要进行复杂的操
作可以在
TD_POLL()
中进行(多数操作都是在这个函数中完成的)。
另外非常重要的一点是,
中断程序的结尾应该
让中断复位,
允许下一次中断,
有
些端
点的计数器也要清零并允许接受新的中断请求。例如:
EP1OUTBC = 0; //
清空计数
EZUSB_IRQ_CLEAR();
//USB
中断复位
EPIRQ = 0x08; //
允许
EP1
中断请求
7.2
68013A
端点寄存器介绍
68
013A
内部的寄存器约有
300
个上
下,一次都记住是不可能的,而且每个寄存
器都有
8
个位,也就是说一共有
2000
多个可以配置的位
,一次都理解掌握这些
位的含义也是不可能的,
所幸地是开发中
并不会用到所有的寄存器,
但是依然强
烈建议把
FX2REGS.H
和
FX2.H
走读一边,
这就像读书一样,
没有学会识字,
再看
都是天书。
结合
FX2
走读这些寄存器大约需要一到两天时间,
这点时间投入还是值得的。
在通讯过程中,
打交道最多的是各种端点寄存器,
掌握好这些寄存器地使用对提
升开发效率是很有帮助。值得特别关注的寄存器和配置位如下:
Rwuen
、
REVCTL
、
EP1OUTCFG
、
EP1I
NCFG
、
EP2CFG
、
EP4CFG
、
EP6CFG
、
EP8CFG
、
EP2FIFO
CFG
、
EP4FIFOCFG
、
p>
EP6FIFOCFG
、
EP8FIFOC
FG
、
FIFORESET
、
EPIRQ
、
EPIE
、
EP1OUTBC
、
APTR1H<
/p>
、
APTR1L
、
EXTAUTODAT1
、
AUTOPTRH2
、
AUTOPTRL2
、
E
XTAUTODAT2
、
EP2BCH
、
EP2BCL
其中有些寄存器的
设置需要连续设置多次,
看似重复了,
其实不然,
这和设置的
缓冲区数量有关。有些寄存器中间必须用
SYNCDELAY
来延时。这类寄存器
FX2
上有说明。
对于
EP0
,用于系统握手,相关的寄存器操作基本上都由<
/p>
68013A
的内核(
SIE
)
来完成了。
对于<
/p>
EP1,
分为
OUT/IN
两组配置和寄存器。
对于
EP2
~
EP8,
不分
OUT/IN
输入输出,主要有
EP2CFG/
EP2FIFOCFG/
EP2BCH/EP2BCL
寄存器。
7.3
什么是自动指针
自动指针是
CYPRESS
提供的一个非常有用的特性
。
在数据交互的过程中,
很多时
候都涉
及到数据的搬迁,比如从
EP2OUT
收到的数据需要转发到<
/p>
EP6IN
上(一些
转换类设备)
;
再比如从
RAM
中
拷贝数据到
EP4IN
上,
传统的做法
是申明两个指
针,
指向源和目的地址,
然后用循环一个个字节拷贝,
同时还要考虑增加指针地
址,
p>
对于连续的空间这到不是问题,
关键是如果数据需要拷贝到多个缓冲
时,
指
针地址是循环的。这时候如果手工完成操作很容易出错。
因此
CYPRESS
提供了两组自动指针,用的时候一组指向源,一组指向目的地址。
然后循环拷
贝数据就行了,
自动指针会自动指向下一个源或目的空间,
不论
是否
是循环地址方式。这样减少了程序出错的几率。
下面的程序将
EP2OUT
接受到的数据拷贝
到
EP6IN
发送出去:
if(!(EP2468STAT &
bmEP6FULL))
{ //
check
EP6
FULL(busy)
bit
in
EP2468STAT
(SFR),
core
set's
this
bit when FIFO is full
APTR1H = MSB( &EP2FIFOBUF
);
APTR1L = LSB(
&EP2FIFOBUF );
AUTOPTRH2 = MSB( &EP6FIFOBUF );
AUTOPTRL2 = LSB( &EP6FIFOBUF
);
count = (EP2BCH << 8) + EP2BCL;
// loop EP2OUT
buffer data to EP6IN
for( i = 0x0000; i < count; i++ )
{
// setup to transfer EP2OUT buffer to EP6IN buffer
using
AUTOPOINTER(s)
EXTAUTODAT2 =
EXTAUTODAT1;
}
EP6BCH = EP2BCH;
SYNCDELAY;
EP6BCL = EP2BCL;
// arm EP6IN
SYNCDELAY;
EP2BCL = 0x80; //
re(arm) EP2OUT
}
}
APTR1H/APTR1H
通过
MSB
< br>和
LSB
获取
EP2FIFOB
UF
的高位地址和地位地址。
EX
TAUTODAT1
表示
APTR1H/APTR1H
指向的数据。
AUTOPTRH2/AUT
OPTRL2
通过
MSB
和
LSB
获取
EP6FIFOBUF
的高位地址和地位地址。
EXTAUTODAT2
表示
AUTOPTRH2/AUTOPTRL2
指向的数据。
7.4
CYUSB
和
CYAPI
的关系
以前
68013
上位机程序的编写过程
中,
应用程序端通过调用
DeviceIoControl()
API
或
CREATEPIPE()
API
与驱动进行交互,继而读写控制硬件设备,在新的
680
13A
的驱动中采用了两种新的调用方法:
第一种是继续使用
DeviceIoControl()
函数读写,不同的是,
IOCTL
控制字和老
驱动完全不同,
具体定义参考
。
用户可以通过这些底层
API
完成操
作。
第二种是使用
CYPRESS
提供的面对对象的类,
一共有
9
个类,
调用这些类的方法
就可以和硬件打交道
。这些类是对第一种方法的封装,使用起来非常简便。
用户
可以根据需要选择这两种方法或混合使用,
使用时需要加上头文件
CyAPI.h
和
cyioctl.h
,另外在项目中还要引用
。
7.5
同步和异步读写的比较
CYAPI
提供了同步和异步读写方式。同步方式的时候调用线程阻塞在
哪里,直到
读写到数据或超时;异步方式的时候调用线程立即返回。具体实例参考
。
7.6
如何用
C++
BUILDER
写上位机程序
1
)
首先确定使用
7.4
中的第几种方法,添加相
应的头文件和库文件。
2
)
连接
USB
设备,确保驱动已经被正确加载。
3
)
编写收发数据线程。
通过开发板上的
L
ED
或
CYPRESS
CONSOLE
或
BUS
HOUND
分析收发正确与否。
7.7
U
盘如何正确加载驱动
在
WINDOWS
2000/XP<
/p>
上
U
盘使用的
P
ID/VID
应该直接能加载操作系统默认的海量
存储器的驱动
程序。为了使用正确的
PID/VID
,可以通过以下途径:<
/p>
1
)
找一个现有品牌的
U
盘,看看他的
p>
PID/VID
是何值。
2
)
在注册表中查找海量存储器信息。
1994
年
,Intel,Compa
q
等七家软硬件全球知名企业为了突破当时
PC
使用串
口和并口传输速度的限制
,
成立了通用串行总线开发者论坛
(USB Implementers
Forum, USB IF),
并在
1994
年
11
月提出了
USB 0.7
版
,
到了<
/p>
1998
年开始出现了
支持
USB
1.1
的设备
,<
/p>
他的高速性
(USB1.1
支持
1.5
Mb/s
和
12
Mb/s
两种速度
[1])
和易用
性迅速使之成为
P
C
外设的宠儿
p>
.
为了对抗
1394
速度的优势
(1394
可以达
到
p>
400
Mb/s),1999
年提出了
US B 2.0
规范的思想
,2000
年
4
月
USB
IF
推出
USB
2.0
向下兼容
1.1,
提供
3
种速度
,
最高可以达到
480 Mb/s[2].
USB 1.1
和
2.0
都是必须依赖于
PC
的
,
为了在一定程度摆脱对
PC
的完全
依赖
,
有一定
程度的主机功能
,2001
年
12
p>
月推出了
OTG 1.0,
经过
6
次修改
,
于
2003
年
6
月推出了<
/p>
USB OTG 1.0
a,
正式成为一个达到市场实用的规范
[3].
本文中分析讨论了
USB 2.0
补充
规范
OTG
的工作原理
,
并且针对目前数码
相机伴侣存在的问题
,
作者提出了自己的解决方案
.
1USB OTG
的工作原理
OTG
补充规范对
USB
2.0
p>
的最重要的扩展是其更具节能性的电源管理和允
许设备以主机和外设
两种形式工作
.OTG
有两种设备类型
:
两用
OTG
设备
(Dualrole device)
和外设式
OTG
p>
设备
(Peripheralonly OTG device)
.
两用
OTG
设备完全符合
USB 2.0
规范
,
同
时
,
他还要提供有限的主机能力和一个
MiniAB
插
座、支持主机流通协议
(Host Negotiatio n Protocol, HNP),
并和外设式
OTG
设备一样支持事务请求协议
(S
ession
Request
Protocol,
SRP).
当作为主机工作
时
,
两用
OTG
设备可在总线上
提供
8 mA
的电流
,
而以往标准主机则需要
提供
100~500
mA
的电流
.
2
个两用
OTG
< br>设备连接在一起时可交替以主机和从机的方式工作
,
这个
特
点兼容了现有
USB
规范主机
p>
/
外设的结构模型
.OTG
主机负责初始化数据通信的
任务
,
比如
:
总线复位、获取
USB <
/p>
各种描述符和配置设备
.
这些配置完成后
,2
个
OTG
设备便可以分别以主机和从机方式传输信息
,2
个设备主从角色
交换的过程
由主机传输协议
(HNP)
定义
.
下面从
5
个方面说明
OTG
的工作原理
.
-
-
-
-
-
-
-
-
-
上一篇:最新英语中19种修辞手法和例句
下一篇:离心水泵叶轮