周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 USB驱动程序简要说明及应用例子 USB总线主要用于USB设备与主机之间的数据通信,特别为USB设备与主机之间大 量数据的传输提供了高速、可靠的传输协议。例如:在嵌入式系统中,可以利用USB设备 与微控制器构成USB设备。USB设备与PC机USB主控器相连就可以实现嵌入式系统与 PC机之间的通信了,也就可以实现诸如U盘、移动硬盘、USB接口打印机等功能。 本驱动程序利用 Philips公司生产的USB芯片 PDIUSBD1与微控制器构成USB设备 在μCOS-Ⅱ操作系统上实现该USB设备与PC机通信的USB协议,为用户提供与PC机通 信的API函数。 下面先简单介绍USB芯片 PDIUSBD2。 1.1PD|USBD12简介 PDIUSBD12是一款性价比很高的USB器件,完全符合USB1.版的规范。具有以下特 性: 高性能USB接口器件,集成了SI、FIFO存储器、收发器以及电压调整器; 可与任何外部微控制器/微处理实现高速并行接口(2M字节/秒) ●完全自治的直接内存存取(DMA)操作 集成320字节多结构FIFO存储器 在批量模式和同步模式下均可实现1M字节/秒的数据传输速率 在挂起时可控制 Lazy Clock输出 采用 GoodLink技术的连接指示器,在通讯时使LED闪烁 可编程的时钟频率输出 符合ACPI、 OnNoW和USB电源管理的要求; 内部上电复位和低电压复位电路 有SO28和 TSSOP28封装 工业级操作温度:-40℃~+85℃ 高于&kV的在片静电防护电路,减少了额外元件的费用 ●具有高错误恢复率(>99%)的全扫描设计确保了高品质 双电源操作:3.3±0.3V或扩展的5V电源,范围为36-55V: PDIUSBDI2管脚排列及内部功能框图如图1所示,表1为 PDIUSBD12的管脚说明。 DATACOD AD ATA9 RESET N 串行接口引擎 CLKOUT国 电压调整器 并行和D INT_N 4 图1 PDIUSBD12管脚排列及内部功能框图
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 USB 驱动程序简要说明及应用例子 USB 总线主要用于 USB 设备与主机之间的数据通信,特别为 USB 设备与主机之间大 量数据的传输提供了高速、可靠的传输协议。例如:在嵌入式系统中,可以利用 USB 设备 与微控制器构成 USB 设备。USB 设备与 PC 机 USB 主控器相连就可以实现嵌入式系统与 PC 机之间的通信了,也就可以实现诸如 U 盘、移动硬盘、USB 接口打印机等功能。 本驱动程序利用 Philips 公司生产的 USB 芯片 PDIUSBD12 与微控制器构成 USB 设备, 在 µC/OS-II 操作系统上实现该 USB 设备与 PC 机通信的 USB 协议,为用户提供与 PC 机通 信的 API 函数。 下面先简单介绍 USB 芯片 PDIUSBD12。 1.1 PDIUSBD12 简介 PDIUSBD12 是一款性价比很高的 USB 器件,完全符合 USB1.1 版的规范。具有以下特 性: z 高性能 USB 接口器件,集成了 SIE、FIFO 存储器、收发器以及电压调整器; z 可与任何外部微控制器/微处理实现高速并行接口(2M 字节/秒); z 完全自治的直接内存存取(DMA)操作; z 集成 320 字节多结构 FIFO 存储器; z 在批量模式和同步模式下均可实现 1M 字节/秒的数据传输速率; z 在挂起时可控制 LazyClock 输出; z 采用 GoodLink 技术的连接指示器,在通讯时使 LED 闪烁; z 可编程的时钟频率输出; z 符合 ACPI、OnNOW 和 USB 电源管理的要求; z 内部上电复位和低电压复位电路; z 有 SO28 和 TSSOP28 封装; z 工业级操作温度:-40℃~+85℃; z 高于 8kV 的在片静电防护电路,减少了额外元件的费用; z 具有高错误恢复率(>99%)的全扫描设计确保了高品质; z 双电源操作:3.3±0.3V 或扩展的 5V 电源,范围为 3.6~5.5V; PDIUSBD12 管脚排列及内部功能框图如图 1 所示,表 1 为 PDIUSBD12 的管脚说明。 1 2 3 4 5 6 7 8 9 10 11 12 17 18 19 20 21 22 23 24 25 26 27 DATA 28 DATA DATA DATA GND DATA DATA DATA DATA ALE CS_N A0 VOUT3.3 D+ D– VDD XTAL2 XTAL1 RESET_N GL_N EOT_N DMACK_N SUSPEND DMREQ CLKOUT 13 16 WR_N INT_N 14 15 RD_N 控制 模拟 收发器 上游端口 PLL锁相环 位时钟恢复 PHILIPS 串行接口引擎 电压调整器 SoftConnect 内部RAM 存储器 管理单元 并行和DMA 接口 图 1 PDIUSBD12 管脚排列及内部功能框图 - 1 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 如图1所示, PDIUSBD12芯片内部集成了串行接口引擎SIE、存储器管理单元(MMU) 和集成RAM、模拟收发器以及电压调整器。可与任何外部微处理器实现高速数据传输的并 行接口(2MB/s)。 PDIUSBD12芯片提供3个端点,其中主端点(端点2)的双缓冲配置增 加了数据吞吐量并轻松实现实时数据传输。 PDIUSBD2采用 GoodLink技术的连接指示器,在通讯时使LED闪烁,为通信状态提供 了用户友好的指示,方便用户调试。 Softconnect技术允许系统微控制器可控制USB总线重 新连接和重新初始化而不需要拔出电缆 PDIUSBDI2的详细介绍请见北航出版的 双向数据位0 2DATA1>02双向数据位 3 DATA102 双向数据位2 DATA 双向数据位3 5 GND 6 DATA 向数据位4 7 DATA 102 双向数据位5 8DATA1O2双向数据位6 9 DATA102 双向数据位7 地址锁存使能。在多路地址数据总线中,下降沿关闭地址信息锁存 10 ALE 将其固定为低电平用于单地址/数据总线配置。 11 CS N 片选(低有效) 12 SUSPEND|LoD4器件挂起状态,高电平表示器件处于挂起状态 13 CLKOUT02 可编程时钟输出(可控分频) 14 INT_N OD4 中断(低有效) 15RD N 读选通(低有效) 16 WR N 写选通(低有效) 7 DMREQ 04 DMA请求 18 DMACK I DMA应答(低有效) DMA传输结束(低有效)。EOTN仅当 DMACK N和RDN或 19 EOT_N WRN一起激活时才有效。 20 RESET N 复位(低有效且不同步)。片内上电复位电路,该管脚可固定接vc 21 GL_NOD8 GoodLink LED指示器(低有效) 22 XTALI 晶振连接端1(6MHz) 接端2(6MHz)。如果采用外部时钟信号取代晶振,可连接 23 XTAL2 XTAL1,XTAL2应当悬空 电源电压(40V~55V),要使器件工作在3.3V,对V和Ⅴoum3脚 都提供3.3V A USBD数据线 26D+ A|UsBD+数据线
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 如图 1 所示,PDIUSBD12 芯片内部集成了串行接口引擎 SIE、存储器管理单元(MMU) 和集成 RAM、模拟收发器以及电压调整器。可与任何外部微处理器实现高速数据传输的并 行接口(2MB/s)。PDIUSBD12 芯片提供 3 个端点,其中主端点(端点 2)的双缓冲配置增 加了数据吞吐量并轻松实现实时数据传输。 PDIUSBD12 采用GoodLink技术的连接指示器,在通讯时使LED闪烁, 为通信状态提供 了用户友好的指示, 方便用户调试。SoftConnect TM技术允许系统微控制器可控制USB总线重 新连接和重新初始化而不需要拔出电缆。 PDIUSBD12 的详细介绍请见北航出版的>或 到 http://www.zlgmcu.com 网站下载 PDIUSBD12 使用手册。 表 1 PDIUSBD12 管脚描述 管脚 符 号 类型 描 述 1 DATA IO2 双向数据位 0 2 DATA IO2 双向数据位 1 3 DATA IO2 双向数据位 2 4 DATA IO2 双向数据位 3 5 GND P 地 6 DATA IO2 双向数据位 4 7 DATA IO2 双向数据位 5 8 DATA IO2 双向数据位 6 9 DATA IO2 双向数据位 7 10 ALE I 地址锁存使能。在多路地址/数据总线中,下降沿关闭地址信息锁存。 将其固定为低电平用于单地址/数据总线配置。 11 CS_N I 片选(低有效) 12 SUSPEND I,OD4 器件挂起状态,高电平表示器件处于挂起状态 13 CLKOUT O2 可编程时钟输出(可控分频) 14 INT_N OD4 中断(低有效) 15 RD_N I 读选通(低有效) 16 WR_N I 写选通(低有效) 17 DMREQ O4 DMA 请求 18 DMACK_N I DMA 应答(低有效) 19 EOT_N I DMA 传输结束(低有效)。EOT_N 仅当 DMACK_N 和 RD_N 或 WR_N 一起激活时才有效。 20 RESET_N I 复位(低有效且不同步)。片内上电复位电路,该管脚可固定接VCC。 21 GL_N OD8 GoodLink LED 指示器(低有效) 22 XTAL1 I 晶振连接端 1(6MHz) 23 XTAL2 O 晶振连接端 2(6MHz)。如果采用外部时钟信号取代晶振,可连接 XTAL1,XTAL2 应当悬空。 24 VCC P 电源电压(4.0V~5.5V),要使器件工作在 3.3V,对VCC和VOUT3.3脚 都提供 3.3V。 25 D- A USB D-数据线 26 D+ A USB D+数据线 - 2 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 (接上表) 3.3V调整输出。要使器件工作在3.3V,对Vcc和Vou、脚都提供 27v 地址位。A0=1选择命令指令,A0=0选择数据。该位在多路地址/ 28A0 I 数据总线配置时可忽略,应将其接高电平 2mA驱动输出 OD4:4mA驱动开漏输出 OD8:8mA驱动开漏输出0O2:4mA输出 在没有使用到DMA方式的时候, DMACK N和EOTN要求接上拉电阻。 明白了 PDIUSBD12所提供的资源与硬件接口,便可以设计 PDIUSBD2与LPC2200的 硬件电路了。 12 PDIUSBD12与LPc2200的硬件电路设计 这里以LPC2200微控制器与 PDIUSBD12构成USB设备, PDIUSBD2连接到LPC2200 的硬件原理图如图2所示,由该图可见 PDIUSBD2各引脚(图2中的网络标号)与LPC2200 的连接关系,如表2所示。 表2 PDIUSBD12与LPC2200连接关系 PDIUSBD12 LPC2200 D0~D7 PDIUSBD12数据总线 D0~D7 PDIUSBD2地址总线 CS USB PDIUSBDI2片选线 nCS2 PDIUSBD2读使能(低电平有效) PDIUSBD2写使能(低电平有效) nEW INT USB PDIUSBD12中断输出信号 PO.16 EINTO RST USB PDIUSBD2复位输入信号 SUSP PDIUSBD2挂起输入信号 PO. 13 DTR 由以上关系,可知 PDIUSBD12使用LPC2200外部存储控制的Bank2部分,其地址如 数据地址0x82000000(偶数地址) 命令地址0x8200000(奇数地址) RST USB、SUSP为LPC2200输出引脚, PDIUSBD12中断信号为中断输入信号,且为 外部中断0。 如图2所示C1、C2和X1为 PDIUSBD12提供工作所需的时钟输入;发光二极管 GoodLink在正常通信时闪烁; PDIUSBD2的AD0连接到LPC2200的A0,当LPC220在 A0引脚输出1时,表示输出到 PDIUSBD12数据总线D0~D7上的数据为命令字,当A0 引脚输出0时,表示输出到 PDIUSBDI2数据总线D0~D7的数据为数据字
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 (接上表) 27 VOUT3.3 P 3.3V调整输出。要使器件工作在 3.3V,对VCC和VOUT3.3脚都提供 3.3V。 28 A0 I 地址位。A0=1 选择命令指令,A0=0 选择数据。该位在多路地址/ 数据总线配置时可忽略,应将其接高电平。 注: O2 : 2mA 驱动输出 OD4 : 4mA 驱动开漏输出 OD8 : 8mA 驱动开漏输出 IO2 : 4mA 输出 在没有使用到 DMA 方式的时候,DMACK_N 和 EOT_N 要求接上拉电阻。 明白了 PDIUSBD12 所提供的资源与硬件接口,便可以设计 PDIUSBD12 与 LPC2200 的 硬件电路了。 1.2 PDIUSBD12 与 LPC2200 的硬件电路设计 这里以 LPC2200 微控制器与 PDIUSBD12 构成 USB 设备,PDIUSBD12 连接到 LPC2200 的硬件原理图如图 2 所示, 由该图可见 PDIUSBD12 各引脚(图 2 中的网络标号)与 LPC2200 的连接关系, 如表 2 所示。 表 2 PDIUSBD12 与 LPC2200 连接关系 PDIUSBD12 功 能 LPC2200 D0 ~ D7 PDIUSBD12 数据总线 D0 ~ D7 AD0 PDIUSBD12 地址总线 A0 CS_USB PDIUSBD12 片选线 nCS2 RD PDIUSBD12 读使能(低电平有效) nOE WR PDIUSBD12 写使能(低电平有效) nEW INT_USB PDIUSBD12 中断输出信号 P0.16_EINT0 RST_USB PDIUSBD12 复位输入信号 P0.10_RTS1 SUSP PDIUSBD12 挂起输入信号 P0.13_DTR1 由以上关系,可知 PDIUSBD12 使用 LPC2200 外部存储控制的 Bank2 部分,其地址如 下: 数据地址 0x82000000(偶数地址) 命令地址 0x82000001(奇数地址) RST_USB、SUSP 为 LPC2200 输出引脚,PDIUSBD12 中断信号为中断输入信号,且为 外部中断 0。 如图 2 所示 C1、C2 和 X1 为 PDIUSBD12 提供工作所需的时钟输入;发光二极管 GoodLink 在正常通信时闪烁;PDIUSBD12 的 AD0 连接到 LPC2200 的 A0,当 LPC2200 在 A0 引脚输出 1 时,表示输出到 PDIUSBD12 数据总线 D0 ~ D7 上的数据为命令字,当 A0 引脚输出 0 时,表示输出到 PDIUSBD12 数据总线 D0 ~ D7 的数据为数据字。 - 3 -
周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 oVCs 图2 PDIUSBD12与LPC2200硬件连接原理图 13 PDIUSBD12驱动软件构架 为了使驱动软件可移植性强、易维护,采用分层的方法编写 PDIUSBD2的驱动程序。 综合考虑USB协议、 PDIUSBD12硬件接线、μC/OS的结构来组织驱动软件的构架,如表 3所示为USB驱动程序软件分层结构表 表3UsB驱动程序软件包分层结构表 文件名 简要说明 相关性 DIZHAL.C PDIUSBD12与MCU之间的硬件接口 与硬件相关 DI2Cl.c PDIUSBDI2命令接口 与硬件无关 Chap 9.c USB协议层 与μCOS相关 Descriptor.c USB协议层 与CO-相关 DI2Driver.c USB应用层 与pC/OS-相关 其中Chap_9c、 Descriptor.c与D12 Driver.c与COS相关,以上各层关系可用图3用 来表示。 UsB应用层D12 Driver.c USB协议层Chap_9c, Descriptor. c USB接口控制驱动D12C.c UsB设备控制驱动D12HAL.C 图3UsB驱动分层结构图 14UsB驱动程序软件包的使用 本驱动软件包包括的文件见表4。表中的所有文件保存于本文档目录下的D12For uCos- II\USBDriverD12目录中,目前本USB驱动程序软件包的版本号为1.0
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 D12XTAL2 D12XTAL1 CS_USB USBDP /GOODLNK USBDM RST_USB D12DM D12DP AD0 INT_USB X1 6MHz VBUS 1 D- 2 D+ 3 GND 4 SHIELD 5 CZ1 USB R7 1K R3 18R+/-1% R2 18R+/-1% C5 C1 68pF C2 22pF R5 1M R4 1M C3 470pF C6 0.1uF + C4 105 + C7 4.7u16V R1 10K FB1 FB2 VCC33 VCC33 VCC33 RD WR DATA0 1 DATA1 2 DATA2 3 DATA3 4 GND 5 DATA4 6 DATA5 7 DATA6 8 DATA7 9 ALE 10 CS_N 11 SUSPEND 12 CLKOUT 13 INT_N 14 RD_N 15 WR_N 16 DMREQ 17 DMACK_N 18 EOT_N 19 RESET_N 20 GL_N 21 XTAL1 22 XTAL2 23 VCC 24 D- 25 D+ 26 VOUT3.3V 27 A0 28 U1 PDIUSBD12(TSSOP-28) L1 GOODLINK VBUS USBUSB+ SUSP R6 1M VCC33 C8 104 R8 1M D0 D1 D2 D3 D4 D5 D6 D7 GND R9 10K CBG201209U151B CBG201209U151B 104 R10 10K VCC33 INT_USB SUSP R11 10K 图 2 PDIUSBD12 与 LPC2200 硬件连接原理图 1.3 PDIUSBD12 驱动软件构架 为了使驱动软件可移植性强、易维护,采用分层的方法编写 PDIUSBD12 的驱动程序。 综合考虑 USB 协议、PDIUSBD12 硬件接线、µC/OS-II 的结构来组织驱动软件的构架,如表 3 所示为 USB 驱动程序软件分层结构表。 表 3 USB 驱动程序软件包分层结构表 文件名 简要说明 相关性 D12HAL.c PDIUSBD12 与 MCU 之间的硬件接口 与硬件相关 D12CI.c PDIUSBD12 命令接口 与硬件无关 Chap_9.c USB 协议层 与 µC/OS-II 相关 Descriptor.c USB 协议层 与 µC/OS-II 相关 D12Driver.c USB 应用层 与 µC/OS-II 相关 其中 Chap_9.c、Descriptor.c 与 D12Driver.c 与 µC/OS-II 相关,以上各层关系可用图 3 用 来表示。 实 时 操 作 系 统 USB应用层D12Driver.c USB协议层Chap_9.c,Descriptor.c USB接口控制驱动 D12CI.c USB设备控制驱动 D12HAL.c 图 3 USB 驱动分层结构图 1.4 USB 驱动程序软件包的使用 本驱动软件包包括的文件见表 4。表中的所有文件保存于本文档目录下的 D12 For uCos-II\USBDriver\D12 目录中,目前本 USB 驱动程序软件包的版本号为 1.0。 - 4 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 表4UsB驱动程序主要文件列表 文件名 描述及作用 D2 Config. h|D2驱动程序的配置,包括所有与硬件相关的配置 DI2HAL. c|UsB设备控制驱动,与具体使用的MCU及硬件相关 DI2HALhUSB设备控制驱动D2HALc的头文件 DI2CL.c USB接口控制驱动,与具体使用的USB芯片相关 DI2CIh USB接口控制驱动D12CIc的头文件 USB协议层,P 所有描述符取值 Descriptor. h|USB描述符结构体的定义,以及 PDIUSBD12用到的一些宏定义取值 Chap 9.c USB协议层,完成所有与控制传输相关的工作 Chap 9.h USB协议层Chap9c的头文件,包含控制传输用到的结构体的定义 D2 Driver.cUSB应用层,包含提供给用户使用的AP函数 D2 Driver h|UsB应用层D2 Driver.c的头文件 DI2 For uCos- IUSBDriver目录的 USBDriver.mcp工程提供了使用该驱动程序的一个例 子。该例子建立时使用的工程模板为: ARM Executable Image for UCOSI( (for lpc220 如果你的硬件配置与软件包的默认配置不同。那么只须修改软件包中的D2 Config. h文 件,该文件主要是配置 PDIUSBD2与LPC220的引脚。D12 Config. h文件相关配置的修改 的方法请见《嵌入式系统软件开发实例》中的《USB驱动程序开发》,这一章详细地说明了 该软件包的开发方法及该文件的配置方法。 除此以外,还有几点需要注意 (1)每个C文件的开始都包括了头文件(# include" config. h"),该头文件是工程模板 ARM Executable Image for UCOSll( for lpc2200)的配置文件,软件包中默认已加上。 (2)在工程模板的IRQs文件的END语句之前加上下面的语句(例子中默认已加上): Usb Handler HANDLER USb Exception (3)由于 PDIUSBD12收发大量数据时中断比较频繁,因此必须修改工程模板中允许 中断嵌套的层数,因此 Startup.s文件的第二行应改为(例子中已进行修改) IRQ STACK LEGTH EQU9*25;每层嵌套需要9个字堆栈,允许25层嵌套 (4)本例子使用了3个事件,控制传输处理使用了1个信号量,例子应用程序中使用 了2个信号量。因此 os cfg. h文件中操作系统最大事件数的定义应至少为3。 #define OS MAX events (5)本例子不使用统计任务,因此把统计任务关闭( os cfg. h文件中) #define OS TASK STAT EN (6) PDIUSBD12使用了外部存储空间的Bank2部分,所以必须配置LPC2200的BCFG2 寄存器,在模板的 target. c文件的 TargetInito函数添加以下代码 BCFG2=0 BCFG2F(0x04<<5米0x01<<10)(0x04<11) 配置BCFG2控制寄存器 (7)工程模板配置外部RAM和外部 FLASH ROM总线的访问速度是适应于大部分型 号的RAM与 FLASH ROM的。对于 EasyARM2200开发板上的RAM与 FLASH ROM的型 号,必须重新配置控制总线有关参数的BCFG0和BCFG1寄存器,这样程序的运行速度才 能跟上 PDIUSBD12的运行速度。这些值的配置的具体方法见LPC2200数据手册以及你所 使用的RAM与 FLASH ROM的数据手册。程序的运行速度主要与CPU主频与外部RAM FLASH速度相关。这方面在模板的 target.c的 TargetResetlnito函数中修改。如程序清单1所
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 表 4 USB 驱动程序主要文件列表 文件名 描述及作用 D12Config.h D12 驱动程序的配置,包括所有与硬件相关的配置 D12HAL.c USB 设备控制驱动,与具体使用的 MCU 及硬件相关 D12HAL.h USB 设备控制驱动 D12HAL.c 的头文件 D12CI.c USB 接口控制驱动,与具体使用的 USB 芯片相关 D12CI.h USB 接口控制驱动 D12CI.c 的头文件 Descriptor.c USB 协议层,PDIUSBD12 所有描述符取值 Descriptor.h USB 描述符结构体的定义,以及 PDIUSBD12 用到的一些宏定义取值 Chap_9.c USB 协议层,完成所有与控制传输相关的工作 Chap_9.h USB 协议层 Chap_9.c 的头文件,包含控制传输用到的结构体的定义 D12Driver.c USB 应用层,包含提供给用户使用的 API 函数 D12Driver.h USB 应用层 D12Driver.c 的头文件 D12 For uCos-II\USBDriver\目录的USBDriver.mcp工程提供了使用该驱动程序的一个例 子。该例子建立时使用的工程模板为:ARM Executable Image for UCOSII(for lpc2200)。 如果你的硬件配置与软件包的默认配置不同。那么只须修改软件包中的 D12Config.h 文 件,该文件主要是配置 PDIUSBD12 与 LPC2200 的引脚。D12Config.h 文件相关配置的修改 的方法请见《嵌入式系统软件开发实例》中的《USB 驱动程序开发》,这一章详细地说明了 该软件包的开发方法及该文件的配置方法。 除此以外,还有几点需要注意: (1)每个 C 文件的开始都包括了头文件(#include "config.h"),该头文件是工程模板 ARM Executable Image for UCOSII(for lpc2200)的配置文件,软件包中默认已加上。 (2)在工程模板的 IRQ.s 文件的 END 语句之前加上下面的语句(例子中默认已加上): Usb_Handler HANDLER Usb_Exception (3)由于 PDIUSBD12 收发大量数据时中断比较频繁,因此必须修改工程模板中允许 中断嵌套的层数,因此 Startup.s 文件的第二行应改为(例子中已进行修改): IRQ_STACK_LEGTH EQU 9*25 ;每层嵌套需要 9 个字堆栈,允许 25 层嵌套 (4)本例子使用了 3 个事件,控制传输处理使用了 1 个信号量,例子应用程序中使用 了 2 个信号量。因此 os_cfg.h 文件中操作系统最大事件数的定义应至少为 3。 #define OS_MAX_EVENTS 3 (5)本例子不使用统计任务,因此把统计任务关闭(os_cfg.h 文件中): #define OS_TASK_STAT_EN 0 (6) PDIUSBD12使用了外部存储空间的Bank2部分,所以必须配置LPC2200的BCFG2 寄存器,在模板的 target.c 文件的 TargetInit()函数添加以下代码: BCFG2 = 0; BCFG2 |= (0x04 << 5)|(0x01 << 10)|(0x04 << 11); //配置 BCFG2 控制寄存器 (7)工程模板配置外部 RAM 和外部 FLASH ROM 总线的访问速度是适应于大部分型 号的 RAM 与 FLASH ROM 的。对于 EasyARM2200 开发板上的 RAM 与 FLASH ROM 的型 号,必须重新配置控制总线有关参数的 BCFG0 和 BCFG1 寄存器,这样程序的运行速度才 能跟上 PDIUSBD12 的运行速度。这些值的配置的具体方法见 LPC2200 数据手册以及你所 使用的 RAM 与 FLASH ROM 的数据手册。程序的运行速度主要与 CPU 主频与外部 RAM、 FLASH 速度相关。这方面在模板的 target.c 的 TargetResetInit()函数中修改。如程序清单 1 所 - 5 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 程序清单1配置 TargetResetInit0函数 #ifdef DEBUG 开发板上JP6接为 BankO-RAM. Bank1- Flash,JP7接为 OUTSIDE MEMMAP=OX3 BCFG0=0x10000400, 外部RAM BCFGI=0x10000460, 1外部 #ifdef OUT CHIP 开发板上JP6接为Bank0 Flash, Bank1 RAMJP7接为 OUTSIDE MEMMAP=Ox3 BCFG0=0x1000046 ∥外部 FLASH BCFGI=0x10000400 ∥外部RAM #ifdef IN CHIP ∥开发板上JP6接为Bank0 RAM. Bank1- Flash.JP7接为Ⅰ NSIDE MEMMAP= OxI //remap BCFG0=0x10000400, 外部RAM BCFG1=0x10000460 1外部Fash #endif USB驱动程序软件包提供给用户6个API函数。这6个函数都在D12 Driver.c文件中。 下面说明这6个函数的作用以及入口参数,如表5到表10所示。 表5nitD120函数 数名称 函数原型INT8UntD12(vod 功能描述设置D2与硬件的连接,初始化D|2,复位D12,初始化相关变量 函数参数无 函数返回值0初始化成功:1初始化失败 特殊说明该函数执行时间比较长,且执行时关闭了中断,所以只允许在pCOS开始运行时调 和注意点用 表6 TaskSetup0函数 函数名称 Task Setup 函数原型| void Task Setup( void"pdata) 功能描述控制传输处理任务 函数参数|void" pdata:任务入口参数 函数返回值无 在μCOS-Ⅱ开始运行时要创建该任务,该任务的堆栈为:OS_ STK TaskSetup Stk28 特殊说明 该任务的优先级必须高于用户任务,以便USB能够及时完成枚举。建议设置该任务 和注意点 优先级设为0
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 示。 程序清单 1 配置 TargetResetInit ()函数 #ifdef __DEBUG //开发板上 JP6 接为:Bank0-RAM,Bank1-Flash,JP7 接为:OUTSIDE MEMMAP = 0x3; //remap BCFG0 = 0x10000400; //外部 RAM BCFG1 = 0x10000460; //外部 Flash #endif #ifdef __OUT_CHIP //开发板上 JP6 接为:Bank0-Flash,Bank1-RAM,JP7 接为:OUTSIDE MEMMAP = 0x3; //remap BCFG0 = 0x10000460; //外部 FLASH BCFG1 = 0x10000400; //外部 RAM #endif #ifdef __IN_CHIP //开发板上 JP6 接为:Bank0-RAM,Bank1-Flash,JP7 接为:INSIDE MEMMAP = 0x1; //remap BCFG0 = 0x10000400; //外部 RAM BCFG1 = 0x10000460; //外部 Flash #endif USB 驱动程序软件包提供给用户 6 个 API 函数。这 6 个函数都在 D12Driver.c 文件中。 下面说明这 6 个函数的作用以及入口参数,如表 5 到表 10 所示。 表 5 Init_D12()函数 函数名称 Init_D12 函数原型 INT8U Init_D12(void) 功能描述 设置 D12 与硬件的连接, 初始化 D12, 复位 D12,初始化相关变量 函数参数 无 函数返回值 0: 初始化成功; 1: 初始化失败 特殊说明 和注意点 该函数执行时间比较长,且执行时关闭了中断,所以只允许在 µC/OS-II 开始运行时调 用。 表 6 TaskSetup()函数 函数名称 TaskSetup 函数原型 void TaskSetup(void *pdata) 功能描述 控制传输处理任务 函数参数 void *pdata:任务入口参数 函数返回值 无 特殊说明 和注意点 在 µC/OS-II 开始运行时要创建该任务,该任务的堆栈为:OS_STK TaskSetupStk[128]; 该任务的优先级必须高于用户任务,以便 USB 能够及时完成枚举。建议设置该任务 优先级设为 0。 - 6 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 表7 Read Port10函数 函数名称 Read Port 函数原型INI8 U ReadPortI(INT32 Lenina8 U *recbuffINTI6 U timeout 功能描述从端点1读出len个字节 INT32U len 要读出的字节数(取值范围为0x0000001~0 XFFFFFFFE) 函数参数INT8 U * recbuf:接收数据指针(长度为len) INTI6 u timeout:超时时间,必须大于等于 函数返回值0读出成功 >0:读出失败(错误码,见表11) 特殊说明如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数 和注意点回0(读出成功)为止 表8 ReadPort20函数 数名称 Read Port2 函数原型|INT8 U Read Por2(INT32Ulen,INT8 U *rebuff, INT6 U timeout 功能描述从端点2读出len个字节 INT32U len 要读出的字节数(取值范围为0x0000000~0 XFFFFFFFF) 函数参数INT8U· rebuff:接收数据指针(长度为len) INTI6 0 timeout:超时时间,必须大于等于0 函数返回值0:读出成功 >0:读出失败(错误码,见表11) 特殊说明如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数 和注意点回0(读出成功)为止 表9 Write Port10函数 数名称 函数原型INT8 U Write Port I(NT32Ulen,INI8U* sendbuffINTI6 U timeout 「功能描述用端点1发送ln个字节 NT32U len 送的字节数(取值范围为0x0000001 函数参数|INT8 U sendbuff发送缓冲区指针 INTI6 U timeout:超时等待时间,必须大于等于0 函数返回值0发送成功: >0:发送失败(错误码,见表11) 特殊说明如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数 和注意点回0(发送成功)为止 表10 Write Port20函数 函数名称 Write Port2 函数原型INT8 U WritePort2(NT3Ulen,INI8 U*sendbuff, INTI6 U timeout 功能描述用端点2发送len个字节 发送的字节数(取值范围为0x000001~0 XFFFFFFFF) 函数参数INI8 0 sendbuf:发送缓冲区指针 INTI6 U timeout:超时等待时间,必须大于等于0
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 表 7 ReadPort1()函数 函数名称 ReadPort1 函数原型 INT8U ReadPort1(INT32U len,INT8U *recbuff,INT16U timeout) 功能描述 从端点 1 读出 len 个字节 函数参数 INT32U len: 要读出的字节数(取值范围为 0x00000001 ~ 0xFFFFFFFF) INT8U *recbuff: 接收数据指针(长度为 len) INT16U timeout: 超时时间, 必须大于等于 0 函数返回值 0: 读出成功; > 0: 读出失败(错误码,见表 11) 特殊说明 和注意点 如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数返 回 0(读出成功)为止。 表 8 ReadPort2()函数 函数名称 ReadPort2 函数原型 INT8U ReadPort2(INT32U len,INT8U *recbuff,INT16U timeout) 功能描述 从端点 2 读出 len 个字节 函数参数 INT32U len: 要读出的字节数(取值范围为 0x00000001 ~ 0xFFFFFFFF) INT8U *recbuff: 接收数据指针(长度为 len) INT16U timeout: 超时时间, 必须大于等于 0 函数返回值 0: 读出成功; > 0: 读出失败(错误码,见表 11) 特殊说明 和注意点 如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数返 回 0(读出成功)为止。 表 9 WritePort1()函数 函数名称 WritePort1 函数原型 INT8U WritePort1(INT32U len,INT8U *sendbuff,INT16U timeout) 功能描述 用端点 1 发送 len 个字节 函数参数 INT32U len: 发送的字节数(取值范围为 0x00000001 ~ 0xFFFFFFFF) INT8U sendbuff: 发送缓冲区指针 INT16U timeout: 超时等待时间, 必须大于等于 0 函数返回值 0: 发送成功; > 0: 发送失败(错误码,见表 11) 特殊说明 和注意点 如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数返 回 0(发送成功)为止。 表 10 WritePort2()函数 函数名称 WritePort2 函数原型 INT8U WritePort2(INT32U len,INT8U *sendbuff,INT16U timeout) 功能描述 用端点 2 发送 len 个字节 函数参数 INT32U len: 发送的字节数(取值范围为 0x00000001 ~ 0xFFFFFFFF) INT8U sendbuff: 发送缓冲区指针 INT16U timeout: 超时等待时间, 必须大于等于 0 - 7 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 (接上表) 函数返回值0发送成功:>0发送失败(错误码,见表1) 特殊说明如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数返 和注意点 回0(发送成功)为止。 表7至表10中提到的函数返回值所代表的错误码的定义如表11所示,这些错误码的定 义在D2 Driver h文件中 表11读写端点AP函数返回值 错误码宏定义 宏定义值 USB NO ERR 0x00 函数执行成功 USB ERR NO CONFIG USB总线未配置完成错误 USB ERR BUFF INVALID 接收或发送缓冲区错误 USB ERR WR TIMEOUT 0x03 接收或发送超时错误 调用读写端点函数: Write Port10、 WritePort2(、 Read Port1(、 Read Port20必须遵守以下 规则 读写端点的任务必须保证有机会能调用到以上函数,才能成功收发数据。 这是因为以上函数给出了接收数据的缓冲区或发送数据的缓冲区。只有给出了缓冲区 从主机发来的数据才有“地方(接收缓冲区)”让它存放。否则本驱动程序将收到的数据都 扔掉”。同理,只有这些函数给出了需要发送的数据在什么“地方(发送缓冲区)”,驱动 程序才能有目的地把数据发送出去。 15软件包使用例子 下面举一个例子来说明怎样使用表5至表10的API函数,例子演示了两个任务之间在 争着从端点2发送1024个字节。编写USB应用程序需要编写两个程序: (1) PDIUSBD12设备端程序。 (2)USB主机(PC机)端程序。 1. PD USBD12设备端程序分析 设备端的程序运行由μOS操作系统控制,它被动地等待来自PC机的命令,操作系 统的启动任务为 ask Start0,它初始化 PDIUSBD12以及创建各个任务以后,其运作过程如 图4所示。图中以及下面提到的 RW NUMS宏定义的值为1024 其中优先级为0的任务为 Task Setup,它负责完成USB的控制传输处理(枚举和标准设 备请求)。经过 PDIUSBD2的初始化以及枚举成功之后,μCOSⅡ操作系统的运作过程为 (1)任务1( Task Recl)和任务2( TaskRec2)分别在等待信号量 Task Recl Sem和 TaskRec2Sem。而起动任务( Task Start)一直在等待主机命令 (2) TaskStart如果收到命令字0x01,就发送信号量给 TaskRecl,使其就绪。如果收到 其它命令字,则发信号量给 TaskRec2,使其就绪 (3)任务1收到信号量以后,发一个字节ack给主机,作为应答。主机收到应答后 发1024个字节给该任务,该任务用 Reaport2(接收这1024个字节。然后延时1个时钟节拍, 最后该任务将收到的1024个字节发送给PC机( WritePo2()。 (4)任务2收到信号量以后,它的动作也与任务1一样,只是任务2接收到1024字节 没有延时就立即发送1024个字节给PC机
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 (接上表) 函数返回值 0: 发送成功; > 0: 发送失败(错误码,见表 11) 特殊说明 和注意点 如果用户需要无限等待,那么请在该函数返回超时错误时再次调用该函数,直至函数返 回 0(发送成功)为止。 表 7 至表 10 中提到的函数返回值所代表的错误码的定义如表 11 所示,这些错误码的定 义在 D12Driver.h 文件中。 表 11 读写端点 API 函数返回值 错误码宏定义 宏定义值 含义 USB_NO_ERR 0x00 函数执行成功 USB_ERR_NO_CONFIG 0x01 USB 总线未配置完成错误 USB_ERR_BUFF_INVALID 0x02 接收或发送缓冲区错误 USB_ERR_WR_TIMEOUT 0x03 接收或发送超时错误 调用读写端点函数:WritePort1()、WritePort2()、ReadPort1()、ReadPort2()必须遵守以下 规则: 读写端点的任务必须保证有机会能调用到以上函数,才能成功收发数据。 这是因为以上函数给出了接收数据的缓冲区或发送数据的缓冲区。只有给出了缓冲区, 从主机发来的数据才有“地方(接收缓冲区)”让它存放。否则本驱动程序将收到的数据都 “扔掉”。同理,只有这些函数给出了需要发送的数据在什么“地方(发送缓冲区)”,驱动 程序才能有目的地把数据发送出去。 1.5 软件包使用例子 下面举一个例子来说明怎样使用表 5 至表 10 的 API 函数,例子演示了两个任务之间在 争着从端点 2 发送 1024 个字节。编写 USB 应用程序需要编写两个程序: (1)PDIUSBD12 设备端程序。 (2)USB 主机(PC 机)端程序。 1. PDIUSBD12 设备端程序分析 设备端的程序运行由 µC/OS-II 操作系统控制,它被动地等待来自 PC 机的命令,操作系 统的启动任务为 TaskStart(),它初始化 PDIUSBD12 以及创建各个任务以后,其运作过程如 图 4 所示。图中以及下面提到的 RW_NUMS 宏定义的值为 1024。 其中优先级为 0 的任务为 TaskSetup(),它负责完成 USB 的控制传输处理(枚举和标准设 备请求)。经过 PDIUSBD12 的初始化以及枚举成功之后,µC/OS-II 操作系统的运作过程为: (1)任务 1(TaskRec1)和任务 2(TaskRec2)分别在等待信号量 TaskRec1_Sem 和 TaskRec2_Sem。而起动任务(TaskStart)一直在等待主机命令。 (2)TaskStart 如果收到命令字 0x01,就发送信号量给 TaskRec1,使其就绪。如果收到 其它命令字,则发信号量给 TaskRec2,使其就绪。 (3)任务 1 收到信号量以后,发一个字节 ack 给主机,作为应答。主机收到应答后, 发 1024 个字节给该任务,该任务用 ReaPort2()接收这 1024 个字节。然后延时 1 个时钟节拍, 最后该任务将收到的 1024 个字节发送给 PC 机(WritePort2())。 (4)任务 2 收到信号量以后,它的动作也与任务 1 一样,只是任务 2 接收到 1024 字节 后,没有延时就立即发送 1024 个字节给 PC 机。 - 8 -
周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 起动任务 TaskStart(优先级3) 初始化 PDIUSBD2 ∥创建各个任务 for( 4 err= ReadPortl(1, &Cmd, 200) 待主机命令 if if( Cmd=Oxon) OSSemPost( TaskRecI Sem),∥发送信号量给任务 OSSemPost(Task Rec2 Sem); 发送信号量给任务2 任务1 Task RecI(优先级1) 任务2 TaskRec2(优先级2) OSSemPend( TaskRecl Sem, 0, &err); OSSemPendcTaskRec2 Sem, 0, &err), ∥应答USB主机 Write PortI(1, &ack, 200); 应答USB主机 ReadPort2( RW NUMS,Bu,200),∥接收数据 ReadPort2( RW NUMS,Buf200),∥接收数据 OSTimeDly(1); Buff[0]=OSPrioCur, /际识任务优先级B= OSPrioCu 识任务优先级 WritePort2( RW NUMS,Bu200;,∥发送数据 WritePort2( RW NUMS,Bum1200),∥发送数捷 图4例子运行示意图 任务1和任务2发送1024个字节给PC机时,第一个字节为对应任务的优先级(Bum OSPriocur)。这样,主机就知道收到的数据来自哪一个任务了 任务1收到信号量以后,还要给主机一个应答,而不是立即就接收来自主机的1024个 字节,这是因为任务1收到信号量不一定就能很快取得运行的机会(可能它还在等待其它信 号量,而且任务切换还要花一定的时间,因此切换时间具有不确定性),而采用应答机制就确 保了 Read Port2( RW NUMS Bu;200)一定有机会运行了,该函数给出了接收数据的“地方(接 收缓冲区Buf”,有了地方存放数据,才能收取数据 任务1为什么要延时1个时钟周期才发送数据呢?这是为了显示两个任务争着发送 1024个字节的结果而特别使用的。因为 OSTimeDly(1)的延时是“不可靠”的,也就是说有 可能存在着抖动这一点在北京航空航天大学出版社出版的《嵌入式实时操作系统COS-I》 (第2版)的第2.32小节中详细分析了这一点。 由于ARM的执行速度很快,要使 OSTimeDly(1)抖动的可能性较大,就需要把μC/Os-I 每秒发生的中断次数减少,即改变 os cfg. h中宏定义 OS TICKS PER_SEC的值 #define OS TICKS PER SEC 100 那么怎样才看得出两个任务争着发送数据的结果呢?这就需要USB主机端程序的配合 2.PG机端程序分析 PC机端的编程必须与设备端紧密结合,在本例子中,PC机端程序的流程如图5所示。 图5的虚线表示USB主机(PC机)与 PDIUSBD12之间的发送与接收关系,箭头指向 接收的一方。图中,PC机为主机,主动发起了命令, PDIUSBD12设备对命令做出响应 图5的1和2,PC机使任务1就绪,并且收到了任务1的应答。 图5的3和4,PC机使任务2就绪,并且收到了任务2的应答。 图5的5和6,PC机向设备端发送了两次1024个字节,第1次被任务1接收到,第2
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 //初始化PDIUSBD12 //创建各个任务 for (;;){ err = ReadPort1(1,&Cmd,200); //等待主机命令 if (err == OS_NO_ERR){ if (Cmd == 0x01) OSSemPost(TaskRec1_Sem); //发送信号量给任务1 else OSSemPost(TaskRec2_Sem); //发送信号量给任务2 } for (;;){ OSSemPend(TaskRec1_Sem,0,&err); WritePort1(1,&ack,200); //应答USB主机 ReadPort2(RW_NUMS,Buff,200); //接收数据 OSTimeDly(1); Buff[0] = OSPrioCur; //标识任务优先级 WritePort2(RW_NUMS,Buff,200); //发送数据 } for (;;){ OSSemPend(TaskRec2_Sem,0,&err); WritePort1(1,&ack,200); //应答USB主机 ReadPort2(RW_NUMS,Buff,200); //接收数据 Buff[0] = OSPrioCur; //标识任务优先级 WritePort2(RW_NUMS,Buff,200); //发送数据 } 起动任务TaskStart(优先级3) 任务1TaskRec1(优先级1) 任务2TaskRec2(优先级2) 图 4 例子运行示意图 任务 1 和任务 2 发送 1024 个字节给 PC 机时,第一个字节为对应任务的优先级(Buff[0] = OSPrioCur)。这样,主机就知道收到的数据来自哪一个任务了。 任务 1 收到信号量以后,还要给主机一个应答,而不是立即就接收来自主机的 1024 个 字节,这是因为任务 1 收到信号量不一定就能很快取得运行的机会(可能它还在等待其它信 号量,而且任务切换还要花一定的时间,因此切换时间具有不确定性),而采用应答机制就确 保了 ReadPort2(RW_NUMS,Buff,200)一定有机会运行了,该函数给出了接收数据的“地方(接 收缓冲区 Buff)”,有了地方存放数据,才能收取数据。 任务 1 为什么要延时 1 个时钟周期才发送数据呢?这是为了显示两个任务争着发送 1024 个字节的结果而特别使用的。因为 OSTimeDly(1)的延时是“不可靠”的,也就是说有 可能存在着抖动。这一点在北京航空航天大学出版社出版的《嵌入式实时操作系统 µC/OS-II》 (第 2 版)的第 2.32 小节中详细分析了这一点。 由于 ARM 的执行速度很快,要使 OSTimeDly(1)抖动的可能性较大,就需要把 µC/OS-II 每秒发生的中断次数减少,即改变 os_cfg.h 中宏定义 OS_TICKS_PER_SEC 的值: #define OS_TICKS_PER_SEC 100 那么怎样才看得出两个任务争着发送数据的结果呢? 这就需要 USB 主机端程序的配合 了。 2. PC 机端程序分析 PC 机端的编程必须与设备端紧密结合,在本例子中,PC 机端程序的流程如图 5 所示。 图 5 的虚线表示 USB 主机(PC 机)与 PDIUSBD12 之间的发送与接收关系,箭头指向 接收的一方。图中,PC 机为主机,主动发起了命令,PDIUSBD12 设备对命令做出响应。 图 5 的 1 和 2,PC 机使任务 1 就绪,并且收到了任务 1 的应答。 图 5 的 3 和 4,PC 机使任务 2 就绪,并且收到了任务 2 的应答。 图 5 的 5 和 6,PC 机向设备端发送了两次 1024 个字节,第 1 次被任务 1 接收到,第 2 - 9 -
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 次被任务2接收到 USB主机 PDIUSBD12设备端 匚发送命令0xD2 [任务2 TaskRec2就绪 接收任务1的应答4 匚任务2发应答字0x01 [收任的应容]-4--任容0m 发送1024个子节 →>「任务1接收1024个字节 匚发送1024个字节------>[任务2接收1024个字节 接收1024个子节4------任务1或任务2发送1024个字节 接收个字节4-8---[任务或任务2发送24个子节 图5USB主机程序与 PDIUSBD12设备端程序的关系 图5的7和8,由于任务1收完1024个字节以后,延时了1个时钟周期,导致任务 或任务2谁先占用发送端点具有不确定性。这时,我们就可以看出两个任务争用端点的效果 为了方便用户使用D12PACK,我们提供了PC机端的 PDIUSBD12的驱动程序,驱动 程序在“DⅠ2驱动”目录下,请根据你的PC机使用的操作系统选择安装不同的驱动程序。 对于端点1和端点2的读写,我们提供了 EasyUSE.dl动态库,该动态库在“ EasyUSB 目录下,动态库的使用方法请见“ EasyUSB"”日录下的“ EasyUSB动态库使用指南 EasyUSB_pdf”文件。 PDIUSBD2设备端驱动程序提供的API函数与PC机端 EasyUSB dll动态库提供的函 数的对应关系如表12所示。表中每一行的两个函数是发送与接收的关系 表12设备端与主机端函数对应表 PDIUSBD2设备端驱动程序API函数 PC机主机端 Easy USB. dll int Write int pipenum, unsigned char *sendbuffer, INT8U ReadPortI(NT32U len, INTSU*recbuff, int len, int wartime=1) INT16U timeout) plenum取值为1 INT8U ReadPort2(INT32U len, INT8Urecbufr int Write Data(int pipenum, unsigned char*sendbuffer, int len, int waittime=1); INT16U timeout) plenum取值为3 int ReadData( int pipenum, unsigned charrecbuffer, INT8U Write PortI(NT32U len, INTSU *sendbuff int len, int wartime=-1) INT16U timeout) pipes取值为0 INT&U WritePort2(NT32U len, INTSU *sendbuff int Read Data(int pipenum, unsigned char *recbuffer int len, int wartime=-1) NT16U timeout) 取值为2 注意: EasyUSB.dl各函数的参数|en不得超过1024,PD|UsBD12设备端各函数的参数len无此限制
广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 次被任务 2 接收到。 发送命令0x01 发送命令0x02 任务1TaskRec1就绪 任务2 TaskRec2就绪 接收任务1的应答 任务2发应答字0x01 接收任务2的应答 任务2发应答字0x02 发送1024个字节 任务1接收1024个字节 发送1024个字节 任务2接收1024个字节 接收1024个字节 任务1或任务2发送1024个字节 接收1024个字节 任务1或任务2发送1024个字节 USB主机 PDIUSBD12设备端 1 2 3 4 5 6 7 8 图 5 USB 主机程序与 PDIUSBD12 设备端程序的关系 图 5 的 7 和 8,由于任务 1 收完 1024 个字节以后,延时了 1 个时钟周期, 导致任务 1 或任务 2 谁先占用发送端点具有不确定性。这时,我们就可以看出两个任务争用端点的效果 了。 为了方便用户使用 D12 PACK,我们提供了 PC 机端的 PDIUSBD12 的驱动程序,驱动 程序在“D12 驱动”目录下,请根据你的 PC 机使用的操作系统选择安装不同的驱动程序。 对于端点 1 和端点 2 的读写,我们提供了 EasyUSB.dll 动态库,该动态库在“EasyUSB” 目录下,动态库的使用方法请见“EasyUSB”目录下的“EasyUSB 动态库使用指南 _EasyUSB_.pdf”文件。 PDIUSBD12 设备端驱动程序提供的 API 函数与 PC 机端 EasyUSB.dll 动态库提供的函 数的对应关系如表 12 所示。表中每一行的两个函数是发送与接收的关系。 表 12 设备端与主机端函数对应表 PDIUSBD12 设备端驱动程序 API 函数 PC 机主机端 EasyUSB.dll INT8U ReadPort1(INT32U len,INT8U *recbuff, INT16U timeout) int WriteData(int pipenum,unsigned char *sendbuffer, int len,int waittime=-1); pipenum 取值为 1 INT8U ReadPort2(INT32U len,INT8U *recbuff, INT16U timeout) int WriteData(int pipenum,unsigned char *sendbuffer, int len,int waittime=-1); pipenum 取值为 3 INT8U WritePort1(INT32U len,INT8U *sendbuff, INT16U timeout) int ReadData(int pipenum,unsigned char *recbuffer, int len,int waittime=-1); pipenum 取值为 0 INT8U WritePort2(INT32U len,INT8U *sendbuff, INT16U timeout) int ReadData(int pipenum,unsigned char *recbuffer, int len,int waittime=-1); pipenum 取值为 2 注意:EasyUSB.dll 各函数的参数 len 不得超过 1024, PDIUSBD12 设备端各函数的参数 len 无此限制。 - 10 -