USBCYPRESSA开发重点讲解

上传人:宝路 文档编号:5722847 上传时间:2017-09-07 格式:DOCX 页数:10 大小:106.90KB
返回 下载 相关 举报
USBCYPRESSA开发重点讲解_第1页
第1页 / 共10页
USBCYPRESSA开发重点讲解_第2页
第2页 / 共10页
USBCYPRESSA开发重点讲解_第3页
第3页 / 共10页
USBCYPRESSA开发重点讲解_第4页
第4页 / 共10页
USBCYPRESSA开发重点讲解_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《USBCYPRESSA开发重点讲解》由会员分享,可在线阅读,更多相关《USBCYPRESSA开发重点讲解(10页珍藏版)》请在金锄头文库上搜索。

1、USB CYPRESS 68013A 开发重点讲解7. 重点讲解 7.1 如何理解 CYPRESS 68013A 程序框架 CYPRESS 提供了非常好的程序框架,免去了用户自己编写一些通用性比较强、模式化的程序(如果不提供,很少有人能写出如此高效,结构紧凑的程序,实际上此框架和 68013A 内部结构关系密切,一般人也没有足够的内部资料也不可能写出来)。在框架的基础上,用户只需在相应的地方写相应的代码即可完成USB 工作。 一般来说框架可以分成 3 个部分。 1) 描述符文件。例如 dscr.a51 文件,里面定义了枚举设备的时候要用的各种描述符信息,这部分用户需要根据实际的情况自己编写。我

2、写的时候发现一个最大的问题就是各种书籍协议版本不同,翻译质量不同,同一字段的意义表述不同,容易让人产生困惑。例如 USB 1.1/2.0/2.13 对设备类型的子类定义都不完全相同,所以写的时候最好几种文档对比起来写。由于 USB 官方网站的文档中字段解释过于专业化,所以对 USB 不是很熟悉的人比较难以理解其真正含义。所以要多参考不同的书籍,某种程度上降低了开发速度,但对第一次做USB 开发的人来说,这也是值得的。 2) 固件文件,例如 FW.C 文件,这是硬件程序的函数入口。主要有以下这些方法: void SetupCommand(void); /握手命令处理 void TD_Init(v

3、oid); /初始化,完成配置,启动时调用一次 void TD_Poll(void); /用户处理程序,循环调用 void IO_Init(void); /8051 IO 初始化 void REG_Init(void); /8051 寄存器初始化 BOOL TD_Suspend(void); /挂起处理 BOOL TD_Resume(void); /唤醒处理 /以下为各种描述符的获取和设置函数,重枚举时自动调用 BOOL DR_GetDescriptor(void); BOOL DR_SetConfiguration(void); BOOL DR_GetConfiguration(void);

4、 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) 功能文件,处理各种中断。例如 PERIPH.C 文件。8051 一般默认只有四个中断,这显然不够 USB 使用,所以 CYPRESS 引入了自动向量的概念,相当于软中断,大大扩展了现有的中断数量。主要的中断有: void ISR_Sudav(void) interrup

5、t 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

6、 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 voi

7、d 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 I

8、SR_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 I

9、SR_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_GpifCompl

10、ete(void) interrupt 0 void ISR_GpifWaveform(void) interrupt 0 特别是对于接受数据,一般都在中断中完成相应处理,“中断中适合进行少量简短的操作,不适合进行复杂操作”,这句话在此依然有效。如果要进行复杂的操作可以在 TD_POLL()中进行(多数操作都是在这个函数中完成的)。 另外非常重要的一点是,中断程序的结尾应该让中断复位,允许下一次中断,有些端点的计数器也要清零并允许接受新的中断请求。例如: EP1OUTBC = 0; /清空计数 EZUSB_IRQ_CLEAR(); /USB 中断复位 EPIRQ = 0x08; /允许 EP1

11、 中断请求 7.2 68013A 端点寄存器介绍 68013A 内部的寄存器约有 300 个上下,一次都记住是不可能的,而且每个寄存器都有 8 个位,也就是说一共有 2000 多个可以配置的位,一次都理解掌握这些位的含义也是不可能的,所幸地是开发中并不会用到所有的寄存器,但是依然强烈建议把 FX2REGS.H 和 FX2.H 走读一边,这就像读书一样,没有学会识字,再看都是天书。结合 FX2 TechRefManual.pdf 走读这些寄存器大约需要一到两天时间,这点时间投入还是值得的。 在通讯过程中,打交道最多的是各种端点寄存器,掌握好这些寄存器地使用对提升开发效率是很有帮助。值得特别关注的

12、寄存器和配置位如下: Rwuen、REVCTL、EP1OUTCFG、EP1INCFG、EP2CFG、EP4CFG、EP6CFG、EP8CFG、EP2FIFOCFG、EP4FIFOCFG、EP6FIFOCFG、EP8FIFOCFG、FIFORESET、EPIRQ、EPIE、EP1OUTBC、APTR1H、APTR1L、EXTAUTODAT1、AUTOPTRH2、AUTOPTRL2、EXTAUTODAT2、EP2BCH、EP2BCL 其中有些寄存器的设置需要连续设置多次,看似重复了,其实不然,这和设置的缓冲区数量有关。有些寄存器中间必须用 SYNCDELAY 来延时。这类寄存器FX2 TechRe

13、fManual.pdf 上有说明。 对于 EP0,用于系统握手,相关的寄存器操作基本上都由 68013A 的内核(SIE)来完成了。 对于 EP1,分为 OUT/IN 两组配置和寄存器。 对于 EP2EP8,不分 OUT/IN 输入输出,主要有 EP2CFG/ EP2FIFOCFG/ EP2BCH/EP2BCL 寄存器。 7.3 什么是自动指针 自动指针是 CYPRESS 提供的一个非常有用的特性。在数据交互的过程中,很多时候都涉及到数据的搬迁,比如从 EP2OUT 收到的数据需要转发到 EP6IN 上(一些转换类设备);再比如从 RAM 中拷贝数据到 EP4IN 上,传统的做法是申明两个指针

14、,指向源和目的地址,然后用循环一个个字节拷贝,同时还要考虑增加指针地址,对于连续的空间这到不是问题,关键是如果数据需要拷贝到多个缓冲时,指针地址是循环的。这时候如果手工完成操作很容易出错。 因此 CYPRESS 提供了两组自动指针,用的时候一组指向源,一组指向目的地址。然后循环拷贝数据就行了,自动指针会自动指向下一个源或目的空间,不论是否是循环地址方式。这样减少了程序出错的几率。 下面的程序将 EP2OUT 接受到的数据拷贝到 EP6IN 发送出去: if(!(EP2468STAT & bmEP6FULL) / check EP6 FULL(busy) bit in EP2468STAT (S

15、FR), core sets this bit when FIFO is full APTR1H = MSB( &EP2FIFOBUF ); APTR1L = LSB( &EP2FIFOBUF ); AUTOPTRH2 = MSB( &EP6FIFOBUF ); AUTOPTRL2 = LSB( &EP6FIFOBUF ); count = (EP2BCH 100 k).当 2 个 OTG 设备连接到一起的时候,MiniA插头边的 ID 引脚会注入一个“0”状态,MiniB 插头边的 ID 引脚为 “1”,ID为 0 的 OTG 设备默认为主机(Adevice),ID 为 1 的 OTG 设备

16、默认为从机(B device).图 1 对上述内容进行了图解4.1.2 对话请求协议 SRP(Session Request Protocol)这个协议允许 Adevice(可以是电池供电)在总线未使用时通过切断 Vbus来节省电源消耗,也为 Bdevice 启动总线活动提供了一种方法.任何一个Adevice, 包括 PC 或便携式电脑,都可以响应 SRP;任何一个 Bdevice,包括一个标准 USB 外设, 都可以启动 SRP;要求一个双重功能设备既能启动 SRP,又能响应SRP.1.3 主机流通协议 HNP(Host Negotiation Protocol)HNP 是一种用来实现 Adevice 和 Bdevice 主机/从机转换的协议(实际上是电缆的反转).主/从机功能交换的结果表现在下列过程中:(1)利用

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号