阅读:2249回复:16
紧急求助!pc机通过usb(D12)来读取数据时固件程序的工作过程!(50分)
在D12实现usb的固件过程中,对PC机通过usb口读取数据的过程有点糊涂!我有以下疑问:
1.pc机执行ReadFile(),假设通过端点2读取数据后,D12应该产生IN令牌包,那么MCU通过那个端点来读取到这个IN令牌包???也就是说这个IN令牌包会通过哪个端点传入MCU??? 2.在很多几乎一样的D12固件程序中,我好像没有发现它们是怎样来处理这个IN令牌包的,也就是说,在固件程序中我们怎样来判断这个向端点2输出数据的IN令牌包从而实现向PC机发送数据???当然,在固件程序中响应这个IN令牌包向PC机发送数据的程序片断我好像也没看到! 也就是说,PC机、D12和MCU之间怎样协调来实现PC数据的输入工作??? 以上问题希望那位大侠能解答一下,不胜感激!!! |
|
最新喜欢:![]() |
沙发#
发布于:2004-05-18 08:39
那位兄弟指点一下!!!!
好急呀!!! |
|
板凳#
发布于:2004-05-18 10:53
设备被配置好了之后,用于数据传输的管道已经配置好了。
这个你可以从驱动程序中的源程序中分析出来,如DDK/src/wdm/usb/bulkusb的例子就是这个样子。 一般是configureDevice,然后selectInterface 对于厂商自定义的请求来说:管道是用的系统默认的控制管道0(双 向的),对应于设备中的端点0 。 在驱动程序中用UsbBuildVendorRequest 来创建URB,然后提交URB即可实现 对于普通输入输出端点来说:数据传输也是通过管道来传输的。 比如说对于端点1 索引3 来说: 在D12Test.sys中,对应的管道名称为PIPE01(输出管道) 具体的实现过程为: 用函数找到设备路径。 打开设备 打开管道: 管道的路径为:设备路径+\"\\\\PIPE01\" 然后就可以将数据输出到设备了 [编辑 - 5/18/04 by zhaobeishengcool] |
|
地板#
发布于:2004-05-18 11:32
WriteFile将数据发送给设备,
USB HOST安排一个中断或批量传输, OUT令牌包发给D12,D12自动响应令牌包,并接受数据,发送ACK状态信息 因为D12自动处理这些协议上的东西,所以你当然看不到了 你要做的仅仅是在D12接受到数据,发出中断请求后,读出缓冲区的数据即可 CreateFile打开设备或者管道 D12Test.sys中 端点1 index 2 对应的管道为 PIPE00 端点1 index 3 对应的管道为 PIPE01 端点1 index 4 对应的管道为 PIPE02 端点1 index 5 对应的管道为 PIPE03 WriteFile写数据 ReadFile读数据 我想应该说的很清楚了哦。不明白的可以参考D12test.exe的源程序 |
|
地下室#
发布于:2004-05-18 17:05
在D12实现usb的固件过程中,对PC机通过usb口读取数据的过程有点糊涂!我有以下疑问: 举例在中断传输的方式中,HOST端通过定时查询的方式查询SLAVE端是否有数据,如果有数据,pc机执行ReadFile(),假设通过端点2读取数据,由于中断管道是一个流管道,因此它总是单向的,并且,一个中断管道仅用于向主机输入数据,USB不支持输出中断管道。流管道不具有确定的USB定义的结构,数据从一端留入总线,一端流出!所以没有相应的IN令牌包,也没有相应的固件程序。 这是我的理解,请各位DX批评指正。 [编辑 - 5/18/04 by mirror] |
|
5楼#
发布于:2004-05-18 18:01
首先谢谢zhaobeishengcool和mirror
的解答!我想估计是我表达不清楚!我想问的是: 由PC机发起的通过端点2的ReadFile()过程而不是writefile()。按zhaobeishengcool的说法,PC机在发出ReadFile()后,D12响应IN令牌包,读入ReadFile的要求,那么MCU怎样来判断什么时候来向D12发送PC机要求读取的数据呢????因为在固件程序中,在PC执行writeFile时PC机往外写的数据先进入D12,再由D12产生中断通知MCU,MCU这时响应main_rxdone()函数把数据写入MCU即可!而在PC执行ReadFile时,MCU是在向D12输入PC机需要读取的数据后D12才产生中断,然后MCU执行main_txdone()函数! |
|
6楼#
发布于:2004-05-18 21:55
你问的问题大概是这个意思吧:
就是 什么时候 MCU向缓冲写数据;什么时候 PC机读数据。 往缓冲区里写数据,MCU在任何时候都可以写的。。。。。。。 而一般的端点,如中断和批量传输,是主机发出IN包后, 如果缓冲区中有数据,则传输数据,若没有则以NACK回应,表示设备忙。 记住一点的是 所有的传输都是由主机发起的,D12只是被动的响应 所以才会有以下的策略: 就是在要输入数据之前,先写一个字节的数据,指示现在是要往主机传输数据了,或者是干其他事情。 这个可能是你要的答案吧! [编辑 - 5/18/04 by zhaobeishengcool] |
|
7楼#
发布于:2004-05-19 09:11
你问的问题大概是这个意思吧: 我想问zhaobeishengcool 如果是中断传输,是主机要输入数据,要发出IN包吗?这时候的管道应该是流管道,不应该具有USB格式才对,主机直接取数据。我的理解对吗/? 就是在要输入数据之前,先写一个字节的数据,这个数据是什么数据? USB1.1协议中有相关规定吗?我好象没有看到 |
|
8楼#
发布于:2004-05-19 16:14
这个可能是你协议还没看清楚的缘故了。
中断传输和批量传输的过程为(发IN包,接受数据,返回状态包)这三个阶段,所以肯定有IN令牌包了,而且是主机发出的令牌包。。。。不然的话,怎么会知道要发数据呢 控制传输分为三个阶段(建立阶段,数据阶段,状态阶段) 建立阶段就是一个完整的传输(setup,8字节数据,状态返回) 数据阶段就是有几个OUT或IN传输组成(IN包,数据,状态返回) 状态阶段 就是 一个不带数据的IN或者OUT传输 至于先写一个字节数据,这个字节数据用于通知MCU该发送数据了。。 这个是你在读写上,用的一个策略。。。与USB规范没有关系 |
|
9楼#
发布于:2004-05-19 17:41
那么“一个流通道没有固定的USB格式”又怎么理解呢?
谢谢! |
|
10楼#
发布于:2004-05-19 20:07
在zhaobeishengcool的帮助下基本搞懂了!先给上30分,余下的以后奉上!因为还有几个不明白的地方:
1.按你的意思,在执行ReadFile的时候,PC先通过WriteFile向MCU发一个规定数据,MCU在收到规定数据后再往D12中写需要传送的数据,那PC什么时候开始执行ReadFile呢?是否是执行完WriteFile后马上执行ReadFile还是需要等到一段时间呢???对这个时间是否有什么要求??? 2.我让PC机执行WriteFile发送一个规定的数据后马上执行ReadFile,然后在固件中接受到一个规定的数据后,马上就向D12发送数据,但是ReadFile虽然返回的一个非零值,而其中的参数显示接受到的数据为0个,PC机没有接受到MCU发送的任何数据。想不明白是什么问题,zhaobeishengcool能不能解答一下???? |
|
11楼#
发布于:2004-05-19 21:49
可能举个例子要说的明白一点:
比如你做了一个数据采集系统,并且要编写应用程序和固件。 应用程序肯定要和固件配合起来,才能正常运行。 如果想要从设备里面得到数据,首先WriteFile,写两个数据到 D12。 我们规定第一个字节不为零,则表示要求发送数据。第二个字节表示要传输的字节数 MCU中断后从D12得到数据,程序就开始检测第一个字节,如果不为零,就准备数据,并且将数据写入D12的IN缓冲区。 应用程序紧跟着WriteFile后面用ReadFile 读数据,,因为此时D12已经将数据准备好,所以肯定可以得到数据。即使用同步的读操作,也不会有很大的延迟。 至于你说的零个数据,你Debug一下看看,可能你 连管道的句柄都没有打开,就读了。。。虽然也能返回数据,但肯定是不正确的。我记得以前好像是返回的-52吧。。。 按照我以前的回答做做看,应该可以的。再不行,去参考一下D12测试板的源程序。 |
|
12楼#
发布于:2004-05-19 22:38
D12收到setup包后产生中断,MCU分析包的内容(8个字节),并将setuppacket标志置位。根据setup包的内容(bmRequestType,bRequest等),MCU固件跳转到不同的处理函数。如果方向是IN,则MCU把主机要的东西写入断点缓冲区(Write_Endpoint),在D12收到IN标志时(主机总是主动发送包的),缓冲区的内容自动上传到主机。
我的理解对吗? |
|
13楼#
发布于:2004-05-20 10:41
理解的 非常正确
|
|
14楼#
发布于:2004-05-21 09:59
我用D12test测试我的USB接口,writefile时PC机通过USB口往MCU发送数据成功,但是readfile时MCU往PC机发送数据失败!监视D12test发现:PC机顺利打开USB设备和相应的USB管道,但是在执行readfile后返回的bResult = TRUE,而读取的数据数为0,读取失败,有时也会出现bResult = !TRUE的情况!在固件中我是在接收中断main_rxdone的最后执行 D12_WriteEndpoint(5,64, EpBuf)的,监视固件程序发现:数据写入D12的端点(也就是执行D12_WriteEndpoint(5,64, EpBuf))后相应端点的缓冲区满,在发送中断main_txdone中察看端点最后处理状态寄存器显示数据发送成功!情况就是这样,不知道到底是什么原因导致readfile失败?????
|
|
15楼#
发布于:2004-05-21 13:20
兄弟们!帮帮忙呀!!!!
|
|
16楼#
发布于:2004-05-21 14:02
现在又发现一些问题:当我不向D12端口中写数据就使用readfile来读取数据的话,主机程序readfile返回的bResult = TRUE,而读取的数据量为0!!!但是如果向D12端口中写数据再使用readfile来读取数据的话,主机程序readfile返回的bResult = !TRUE,使用getlastfile得到的错误是23,也就是ERROR_ERC(循环冗余校错错误)!!!不知这是什么原因????问题会出在那呢?????
|
|