qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1756回复:5

转载一篇对D12新手引路的好文章

楼主#
更多 发布于:2002-11-05 09:11

这里多一些这样的好文章就好了。

USB接口器件PDIUSBD12的接口应用设计

作 者: 天津大学 王 朔  李 刚


3 软件设计

3.1 单片机方面软件设计

  对于单片机控制程序,目前没有任何厂商提供自动生成固件(firmware)的工具,因此所有程序都 要由自己手工编制。USB单片机控制程序通常由三部分组成:第一、初始化单片机和所有的外围电路 (包括PDIUSBD12);第二、主循环部分,其任务是可以中断的;第三、中断服务程序,其任务是对时 间敏感的,必须马上执行。根据USB协议,任何传输都是由主机(host)开始的,这样,单片机作它 的前台工作,等待中断。主机首先要发令牌包给USB设备(这里是PDIUSBD12),PDIUSBD12接收 到令牌包后就给单片机发中断,单片机进入中断服务程序,首先读PDIUSBD12的中断寄存器,判断 USB令牌包的类型,然后执行相应的操作。因此,USB单片机程序主要就是中断服务程序的编写。在 USB单片机程序中要完成对各种令牌包的响应,其中比较难处理的是SETUP包,主要是端口0的编程。

  单片机与PDIUSBD12的通信主要是靠单片机给PDIUSBD12发命令和数据来实现的。 PDIUSBD12的命令字分为三种:初始化命令字、数据流命令字 和通用命令字。PDIUSBD12给出了各种命令的代码和地址。单片机先给PDIUSBD12的命令地址发命 令,根据不同命令的要求再发送或读出不同的数据。因此,可以将每种命令做成函数,用函数实现 各个命令,以后直接调用函数即可。

在编写USB的单片机程序时,需要注意:

① 单片机的中断应设置为电平触发;中断后一定要读上次传输状态寄存器(命令40-45H),以清 除中断寄存器中的中断标志。这样,PDIUSBD12的中断输出才能变回高电平,这一点非常重要。
② 在接收到Setup包后,一定要调用ACK set up命令重新使能端口0。
③ 在向IN端点写完数据后,一定调用Val i date Buffer(命令FAH),指明缓冲区中的数据有效,可以发送到主机。
④ 当读完数据后,一定调用Clear Buffer(命令F2H),以保证可以接收新的包。
⑤ 可以通过调用Read Chip ID(命令FDH)检查PDIUSBD12是否工作。该命令要读两个字节数 据。

USB初始化过程为:

① Set Address Enable;
② Set Endpoint Enable(此时LED亮);
③ Disconnect;
④ delay(1~2 s);
⑤ Connect(即用43h参数调用Set Mode,此时LED灭);
⑥ Read Interrupt Register。

  完成初始化工作后,就可作其它的前台工作了,并在前台判断是否有 Setup包(通过一个变量,当中断服务程序检测到有Setup包时,设置该变 量),然后执行响应的控制传输。

  在调试USB单片机程序时,还要特别注意Win dows对USB 设备的枚举顺序:

① GetDeviceDescriptor。主机主要对Length域感兴趣,发送内容一定要正确,特别是第 2字节type一定为0x01,即Device;否则,主机将不响应,或 者再重复2次后放弃。可检查一下对EP0的RX、TX的设置次序。

② SetAddress。一般为02或03。

③ 连续3次GetDeviceDescriptor,读取全部设备描述符,一般为 18 B,分为多次传输。如果不正确,主机将不响应或重复2次后放弃。

④ GetConfigDescriptor。注意第2字节一定为0x02,即config 。

⑤ GetStringDescriptor(可能没有),根据在设备描述符中是否有 String索引而定。一般先读取LanguageID,再读取product string。

⑥ 读取全部ConfigDescriptor,次数根据描述符的大小决定(端点个数不同,描述符大小不同),如 果不正确,主机将不响应或再重复2次后放弃。

⑦ 如果以上步骤都正确,主机将找到新设备,提示安装驱动程序;否则找到未知设备,不可用。 安装驱动程序后,以后的每次PlugIn,枚举次序与以上步骤略有不同,之后会有 SetConfiguration、GetConfiguration和GetInterface等调用。

3.2 主机方面软件设计

  Windows98 提供了多种USB设备的驱动程序,但好像还没有一种是专门针对数据采集系统的,所 以必须针对特定的设备来编制驱动程序。尽管系统已经提供了很多标准接口函数,但编制驱动程序仍 然是USB开发中最困难的一件事情,通常采用Windows DDK来实现。目前有许多第三方软件厂商提供了各种各样的生成工具,像 Compuware的driv er works,Blue Waters的Driv er Wizard等,它们能够很容易地在几分钟之内生成高质量的USB 的驱动程序。作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的 WIN95的VXD方式的驱动程序不同。它是WDM类型的。

  在调试USB设备时,可使用UsbView程序检测设备是否能被Windows枚举并配置,如果成功, 还可在该程序中查看设备描述符、配置描述符和端点描述符是否正确。之后可以使用Driver Wiz ard生成一个通用驱动程序,在Windows提示安装驱动程 序时,选择Driver Wizard生成的驱动程序。其实Driver Wizard生成的仅是一个Windows控制台的应用程序,它会调用安装Driver Wizard时安装在系统中的通用USB驱动程序。使用该程序就可测试设备 是否能够正确传输数据以及传输速度。该程序也可作为最终产品USB传输部分的框架;如果不能满足 要求,也可用WDM重新编制驱动程序,用调试好的USB设备来开发、调试主机软件。----------------------------------------------------------------------------------------

最新喜欢:

tmgui00000tmgui0... lhaihlhaih
chengjian_hui
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2003-09-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-05 10:36
文章写的好,转发也有功劳,就一些问题再提一些问题。
我以前一直以为,只要上位机来要数或者向固件写数,D12都可以
产生中断信号,然后进入相应的中断处理程序,但后来发现:后者成立,但上位机来要数时,端点缓冲区必须已经有数,这样在读取后,进入相应的中断程序,进行readlasttransatinnstatus操作,或执行其它
chengjian_hui
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2003-09-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-05 10:38
请问,这是第三章,还有其它
jasmine_wu001
驱动小牛
驱动小牛
  • 注册日期2002-04-26
  • 最后登录2010-09-20
  • 粉丝0
  • 关注0
  • 积分169分
  • 威望107点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-05 11:42
此文的网址是:http://www.dpj.com.cn/html/magazine/2002_4/4-1.htm可以找到
smartcatty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2003-08-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-12 15:54
第三步get device descriptor中,分三次传输是什么意思?
主机会连续三次发送get descriptor命令,而我们只能把描述符分三次分段传输?
不是很明白.....


nofer
驱动中牛
驱动中牛
  • 注册日期2001-06-08
  • 最后登录2008-12-17
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-12 17:36
好东东
[img]http://www.driverdevelop.com/forum/upload/nofer/2002-11-16_32_740_5.jpg[/img] [size=3]想着梦中天堂的样子不知不觉睡着了。。。。 [/size]
游客

返回顶部