打印

请教usb发送完成检测

[复制链接]
2529|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
junsi|  楼主 | 2010-1-8 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用st的usb库,但不知道如何检测发送完成?现在我用
while(GetEPTxStatus(ENDP1) != EP_TX_NAK);
但有些情况这个判断不行,现在只能在发送后加延时来解决。特向大家请教如何直接来判断?
沙发
香水城| | 2010-1-8 09:56 | 只看该作者
有些情况这个判断不行? 什么情况?

使用特权

评论回复
板凳
junsi|  楼主 | 2010-1-8 10:37 | 只看该作者
case ORDER_UPDATE:
                                        {
                                                if((ReBufBak[2] == DEVICE_ID) || (ReBufBak[2] == 0xff))
                                                {
                                                        WriteCom(ACK);                                                               
                                                        while(GetEPTxStatus(ENDP1) != EP_TX_NAK);//等待usb发送完
//                                                        Beep(2);
                                                          //跳转到 bootloader
                                                        GotoISP();
                                                        while(1);
                                                }
                                                else
                                                {       
                                                        WriteCom(NAK);
                                                        Beep(3);
                                                }
                                        }
                                        break;

以上是发ACK后,mcu进入USB ISP升级状态,会重启USB. 我的j-link和试验板插电脑不同的usb口没问题,但两个usb同时插到一个usb hub(1转4)就不行了,上程序加上Beep(2),又可以。我现在跟踪pc端的接收程序...

使用特权

评论回复
地板
junsi|  楼主 | 2010-1-8 10:50 | 只看该作者
更正一下,是试验板直接插pc usb口可以,通过usb hub就不行,跟j-link无关

使用特权

评论回复
5
junsi|  楼主 | 2010-1-8 11:01 | 只看该作者
用 Bus Hound 看,不行时,ACK确实没有发出

使用特权

评论回复
6
junsi|  楼主 | 2010-1-8 11:36 | 只看该作者
我现在认为:while(GetEPTxStatus(ENDP1) != EP_TX_NAK);是表示发送完成,但是数据只是发到了usb-hub中,因为我的后续是进入usbisp,要重启usb, usb-hub还没来得及吧数据发到pc,usb-hub就被重启信号中断了,pc就没收到数据。请香主指点。如果是这个原因,看来也只能加延时来解决了

使用特权

评论回复
7
香水城| | 2010-1-8 15:19 | 只看该作者
USB HUB只是一个转发器,没有存储的功能。HUB上的延迟只有几个ns,这么短的时间可以忽略不计。

还是从你的软件上找原因吧。

使用特权

评论回复
8
junsi|  楼主 | 2010-1-8 23:21 | 只看该作者
我用的是hid协议,包传输间隔设置为1ms,我对usb-hid深层的控制机理不了解,但我想是不是这个间隔时间是不能忽略的。而且加上延时后确实 解决了问题

使用特权

评论回复
9
香水城| | 2010-1-9 09:17 | 只看该作者
请介绍一下你的通信协议和控制流程,你给出的信息非常少,无法判断问题在哪里。

使用特权

评论回复
10
junsi|  楼主 | 2010-1-10 01:47 | 只看该作者
我的程序  ISP + App 两部分,首地址分别为0x0800000,0x08003000,先判断是否有ISP请求(如某个IO口为低),无就进入App. 这部分参考ST的DFU例程, 在ISP和App中分别实现USB-HID协议,这部分参考st的coustmer-hid例程,实现64byte, endpoint1 IN/OUT传输。然后在次基础上建立自己的硬件通讯协议(在ISP中)和通讯控制协议(在App中)。在上位机上做了对应的硬件升级软件,当发出升级命令时,下位机App中会相应此命令,就是我3楼贴出的程序片段,下位机由App转入ISP中运行,开始硬件更新。选用hid主要看中了无需驱动比较方便,isp都是自己的一套,便于加密。 ISP和App都有自己独立的HID程序部分,当初也想过共用ISP中的就可以了,可以省空间,但可能对以后App程序扩展性造成不利影响,独立出来后在进行App->ISP切换,USB要重新进行初始化,就是我上面说得 重启usb.

使用特权

评论回复
11
香水城| | 2010-1-10 10:20 | 只看该作者
重新看了一下所有的帖子,发现这里是关键:试验板直接插pc usb口可以,通过usb hub就不行,楼主能否再确认一下,直接插PC USB口没有问题

如果果然如此,是否你的HUB有问题,可不可以换一个HUB试试看?

另外,“独立出来后在进行App->ISP切换,USB要重新进行初始化,就是我上面说得 重启usb”,这个重启USB是怎么做的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

39

帖子

1

粉丝