关键词不能为空

当前您在: 主页 > 英语 >

USB CYPRESS 68013A开发重点讲解

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 23:31
tags:

-

2021年2月1日发(作者:sline)


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


对设备类型的子类定义都不 完


全相同,


所以写的时候最好几种文档对比起来写。

< p>
由于


USB


官方网站的文档中字

< br>段解释过于专业化,


所以对


USB


不是很熟悉的人比较难以理解其真正含义。


所以


要多参考不同 的书籍,


某种程度上降低了开发速度,


但对第一次做

< p>
USB


开发的人


来说,这也是值得的。

< p>


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()


中进行(多数操作都是在这个函数中完成的)。

< p>


另外非常重要的一点是,


中断程序的结尾应该 让中断复位,


允许下一次中断,



些端 点的计数器也要清零并允许接受新的中断请求。例如:



EP1OUTBC = 0; //


清空计数



EZUSB_IRQ_CLEAR(); //USB


中断复位



EPIRQ = 0x08; //


允许


EP1


中断请求




7.2



68013A


端点寄存器介绍



68 013A


内部的寄存器约有


300


个上 下,一次都记住是不可能的,而且每个寄存


器都有


8

< p>
个位,也就是说一共有


2000


多个可以配置的位 ,一次都理解掌握这些


位的含义也是不可能的,


所幸地是开发中 并不会用到所有的寄存器,


但是依然强


烈建议把


FX2REGS.H



FX2.H

走读一边,


这就像读书一样,


没有学会识字,


再看


都是天书。


结合


FX2



走读这些寄存器大约需要一到两天时间,


这点时间投入还是值得的。



在通讯过程中,


打交道最多的是各种端点寄存器,


掌握好这些寄存器地使用对提


升开发效率是很有帮助。值得特别关注的寄存器和配置位如下:



Rwuen



REVCTL


EP1OUTCFG



EP1I NCFG



EP2CFG


< p>
EP4CFG



EP6CFG


EP8CFG



EP2FIFO CFG



EP4FIFOCFG



EP6FIFOCFG



EP8FIFOC FG



FIFORESET



EPIRQ



EPIE



EP1OUTBC



APTR1H< /p>



APTR1L



EXTAUTODAT1



AUTOPTRH2



AUTOPTRL2



E XTAUTODAT2



EP2BCH



EP2BCL



其中有些寄存器的 设置需要连续设置多次,


看似重复了,


其实不然,


这和设置的


缓冲区数量有关。有些寄存器中间必须用


SYNCDELAY


来延时。这类寄存器


FX2



上有说明。



对于


EP0


,用于系统握手,相关的寄存器操作基本上都由< /p>


68013A


的内核(


SIE

< p>


来完成了。



对于< /p>


EP1,


分为


OUT/IN


两组配置和寄存器。



对于


EP2



EP8,


不分


OUT/IN


输入输出,主要有


EP2CFG/ EP2FIFOCFG/


EP2BCH/EP2BCL


寄存器。




7.3




什么是自动指针



自动指针是


CYPRESS


提供的一个非常有用的特性 。


在数据交互的过程中,


很多时


候都涉 及到数据的搬迁,比如从


EP2OUT


收到的数据需要转发到< /p>


EP6IN


上(一些


转换类设备)



再比如从


RAM


中 拷贝数据到


EP4IN


上,


传统的做法 是申明两个指


针,


指向源和目的地址,


然后用循环一个个字节拷贝,


同时还要考虑增加指针地


址,


对于连续的空间这到不是问题,


关键是如果数据需要拷贝到多个缓冲 时,



针地址是循环的。这时候如果手工完成操作很容易出错。



因此


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


< p>
LSB


获取


EP6FIFOBUF


的高位地址和地位地址。



EXTAUTODAT2


表示


AUTOPTRH2/AUTOPTRL2


指向的数据。




7.4



CYUSB

< p>


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


盘,看看他的


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


外设的宠儿


.


为了对抗


1394


速度的优势


(1394


可以达



400 Mb/s),1999


年提出了


US B 2.0


规范的思想


,2000



4



USB IF


推出


USB


2.0

< p>
向下兼容


1.1,


提供


3


种速度


,


最高可以达到


480 Mb/s[2].



USB 1.1



2.0


都是必须依赖于


PC



,


为了在一定程度摆脱对


PC


的完全


依赖


,


有一定 程度的主机功能


,2001



12


月推出了


OTG 1.0,


经过

< p>
6


次修改


,


< p>
2003



6


月推出了< /p>


USB OTG 1.0 a,


正式成为一个达到市场实用的规范


[3].




本文中分析讨论了


USB 2.0


补充 规范


OTG


的工作原理


,


并且针对目前数码


相机伴侣存在的问题


,

< p>
作者提出了自己的解决方案


.



1USB OTG


的工作原理




OTG


补充规范对


USB


2.0


的最重要的扩展是其更具节能性的电源管理和允


许设备以主机和外设 两种形式工作


.OTG


有两种设备类型


:


两用


OTG


设备

(Dualrole device)


和外设式


OTG


设备


(Peripheralonly OTG device) .


两用


OTG


设备完全符合

< p>
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


规范主机


/


外设的结构模型


.OTG


主机负责初始化数据通信的


任务


,

比如


:


总线复位、获取


USB < /p>


各种描述符和配置设备


.


这些配置完成后


,2



OTG


设备便可以分别以主机和从机方式传输信息


,2


个设备主从角色 交换的过程


由主机传输协议


(HNP)


定义


.




下面从


5


个方面说明


OTG


的工作原理


.

-


-


-


-


-


-


-


-



本文更新与2021-02-01 23:31,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/595820.html

USB CYPRESS 68013A开发重点讲解的相关文章