公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

FX3/FX2LP XferData() API使用 – KBA226200

FX3/FX2LP XferData() API使用 – KBA226200

ChaitanyaV_61
Employee
Employee
50 questions asked 25 likes received 25 sign-ins

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 手册或者CypressUSB Control Center的源代码,获知其使用方法。当用户在Control Center中点击 “Transfer data” 按钮后,这个API将会被调用。

当以下任一条件符合时,XferData() 将会返回:

  1. 请求数量的数据已经返回。
  2. 短包或零包传输完成。
  3. 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:

  1. PktMode”复选框没有勾选。
  2. Bytes to transfer”框中填写 16387 byte(非MaxPcktSize 的整数倍 )。

当用户按下“Transfer Data”的按钮后,XferData()保持等待直到超时,随后返回错误代码997表示传输事务失败。

 

pastedImage_0.png  

 

Case B:

  1. PktMode”复选框勾选。
  2. Bytes to transfer 框中填写 16387 byte(非MaxPcktSize 的整数倍 )。

当用户按下“Transfer Data”按钮后,数据传输请求将会被划分为数个XferData()函数调用,每一个调用请求的数据量等于端点属性中的MaxPcktSize参数值。在这种情况下,主机端将会接收到请求数据部分中的最大MaxPcktSize整数倍(在这个例子中即为16384 bytes, 0x4000)的数据。

 

  pastedImage_1.png

 

在以上两种场景中,端点都会变成停止状态,必须调用ResetPipe()函数清除此状态。另外,在执行新的传输之前,程序挂起的I/O 事务也必须调用AbortPipe() 函数清除。

pastedImage_2.png

1499 次查看