FX3/FX2LP XferData() API使用 – KBA226200
Version: **
问题: API XferData () 的参数 ”Packet Mode” 的意义是什么?
回答:
注: 本篇KBA讨论的场景中,设备(FX3)发送的数据包大小为端点描述符里的MaxPcktSize 的整数倍。
CyUSB 库定义了API函数XferData(),您可以从如下链接中获取库函数的源代码
http://www.cypress.com/documentation/software-and-drivers/ez-usb-fx3-software-development-kit.
这个API 用于主机和绑定到驱动 cyusb3.sys的设备之间的同步数据传输。您可以参考 CyUSB.NET 手册或者Cypress的USB Control Center的源代码,获知其使用方法。当用户在Control Center中点击 “Transfer data” 按钮后,这个API将会被调用。
当以下任一条件符合时,XferData() 将会返回:
- 请求数量的数据已经返回。
- 短包或零包传输完成。
- API调用时设定的超时发生。
XferData() 的声明如下:
public bool XferData(ref byte[] buf, ref int len, bool PacketMode);
在一个IN 传输期间,当主机端请求传输的数据量不是端点描述符里定义的MaxPcktSize 的整数倍时,XferData()将会失败。其错误代码是997,表示这是一次失败的传输事务。以此场景为例,我们对“PacketMode”做如下解释:
假设 FX3 烧录USBBulkSourceSink固件,其中配置 IN 端点的 MaxPcktSize 为1024 Bytes。 Cypress提供的 USB Control center用于从设备端读取数据。当用户在Control Center中选中 PktMode 时,XferData 函数的参数PacketMode 被设置为 true。
Case A:
- “PktMode”复选框没有勾选。
- “Bytes to transfer”框中填写 16387 byte(非MaxPcktSize 的整数倍 )。
当用户按下“Transfer Data”的按钮后,XferData()保持等待直到超时,随后返回错误代码997表示传输事务失败。
Case B:
- “PktMode”复选框勾选。
- “Bytes to transfer” 框中填写 16387 byte(非MaxPcktSize 的整数倍 )。
当用户按下“Transfer Data”按钮后,数据传输请求将会被划分为数个XferData()函数调用,每一个调用请求的数据量等于端点属性中的MaxPcktSize参数值。在这种情况下,主机端将会接收到请求数据部分中的最大MaxPcktSize整数倍(在这个例子中即为16384 bytes, 0x4000)的数据。
在以上两种场景中,端点都会变成停止状态,必须调用ResetPipe()函数清除此状态。另外,在执行新的传输之前,程序挂起的I/O 事务也必须调用AbortPipe() 函数清除。