打印

请教一下stm32 usb双缓冲问题

[复制链接]
6455|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sxw35035|  楼主 | 2009-11-11 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我将stm32的usb端点2设置为双缓冲,但是在测试的时候发现出现丢包现象;
设置双缓冲代码如下:
#define SPEED_UP
#ifdef SPEED_UP
        SetEPType(ENDP2, EP_BULK);
        SetEPDoubleBuff(ENDP2);
        SetEPDblBuffAddr(ENDP2, ENDP2_BUF0Addr, ENDP2_BUF1Addr);
        SetEPDblBuffCount(ENDP2, EP_DBUF_OUT, Device_Property.MaxPacketSize);
        ClearDTOG_RX(ENDP2);
        ClearDTOG_TX(ENDP2);
        ToggleDTOG_TX(ENDP2);
        SetEPRxStatus(ENDP2, EP_RX_VALID);
        SetEPTxStatus(ENDP2, EP_TX_DIS);
#endif
我在out中断中的代码处理如下所示:

        if(_GetENDPOINT(ENDP2) & EP_DTOG_TX)//判断本次接收到的数据存放在哪个缓冲区
        {
                //FreeUserBuffer(ENDP2, EP_DBUF_OUT);//先释放用户对缓冲区的占有,这样的话usb的下一个接收过程会立刻进行,同时用户并行处理接收到的数据
               
                Data_Len = GetEPDblBuf0Count(ENDP2);
                PMAToUserBufferCopy(usbinst.m_pBuffer + OUT_count/*blk_ctr.bulk_buf*/, ENDP2_BUF0Addr, Data_Len);
               
                //memcpy(usbinst.m_pBuffer + OUT_count, blk_ctr.bulk_buf, Data_Len);
                OUT_count += Data_Len;
                if(OUT_count >= USB_BUFFER_SIZE)
                {
                        blk_ctr.bulk_flag = 1;
                        OUT_count = 0;
                        //SetEPRxStatus(ENDP2, EP_RX_NAK);
                        //return;
                }
        }
        else
        {
                //FreeUserBuffer(ENDP2, EP_DBUF_OUT);//释放所占有的缓冲区

                Data_Len = GetEPDblBuf1Count(ENDP2);
                PMAToUserBufferCopy(usbinst.m_pBuffer + OUT_count/*blk_ctr.bulk_buf*/, ENDP2_BUF1Addr, Data_Len);

               
//                memcpy(usbinst.m_pBuffer + OUT_count, blk_ctr.bulk_buf, Data_Len);
                OUT_count += Data_Len;
                {
                        if(OUT_count >= USB_BUFFER_SIZE)
                        {
                                blk_ctr.bulk_flag = 1;
                                OUT_count = 0;
                                //SetEPRxStatus(ENDP2, EP_RX_NAK);
                                //return;
                        }
                }
        }
        //SetEPRxStatus(ENDP2, EP_RX_VALID);
        _ToggleDTOG_TX(ENDP2);

我这是参考的论坛中的设计进行修改的,但是在我的程序中出现丢包的现象
沙发
sxw35035|  楼主 | 2009-11-11 18:35 | 只看该作者
在线等待,急!!有人给个提示吗?

使用特权

评论回复
板凳
lxyppc| | 2009-11-11 18:49 | 只看该作者
有响应USB_HP_CAN_TX_IRQHandler中断吗?

使用特权

评论回复
地板
sxw35035|  楼主 | 2009-11-11 19:10 | 只看该作者
有响应啊,就是少两个包

使用特权

评论回复
5
sxw35035|  楼主 | 2009-11-11 20:30 | 只看该作者
有没有人对此提出疑问或者解释一下啊??

使用特权

评论回复
6
sxw35035|  楼主 | 2009-11-11 20:43 | 只看该作者
我测试发现在用双缓冲时,既响应USB_HP_CAN_TX_IRQHandler中断,也响应USB_LP_CAN1_RX0_IRQn中断,这正确吗

使用特权

评论回复
7
lxyppc| | 2009-11-12 10:08 | 只看该作者
两个都呼应是正确的
用BusHond抓取会丢包吗?

使用特权

评论回复
8
sxw35035|  楼主 | 2009-11-12 10:38 | 只看该作者
我是用bushound发送的,它应该是没有丢包

使用特权

评论回复
9
sxw35035|  楼主 | 2009-11-12 10:47 | 只看该作者
而且我在测试中发现我还没有翻转DTOG_TX位时,两个缓冲区中都有内容了

使用特权

评论回复
10
sxw35035|  楼主 | 2009-11-12 10:53 | 只看该作者
在测试时发现DTOG_TX和DTOG_RX都为0或都为1时,STAT_RX还为11即仍然是ACK状态,不应该是NAK状态吗?

使用特权

评论回复
11
lxyppc| | 2009-11-12 11:18 | 只看该作者
没有,当双缓冲启动后,状态由STAT_RX以及DTOG_TX和DTOG_RX共同决定
当DTOG_TX和DTOG_RX都为1或都为0时,即使STAT_RX为ACK也会返回一个NAK状态

关于你丢包的问题还是不太明白

使用特权

评论回复
12
sxw35035|  楼主 | 2009-11-12 11:26 | 只看该作者
那有没有关于usb双缓冲的完整代码啊,在stm官方网站上哪个包中有啊

使用特权

评论回复
13
lxyppc| | 2009-11-12 11:44 | 只看该作者
官方包中好像没有双缓冲的
对了,你是如何得知数据有丢包的呢

使用特权

评论回复
14
sxw35035|  楼主 | 2009-11-12 12:18 | 只看该作者
我是通过在中断中添加一个变量进行计数的,比如我从bushound中发送4096字节,我在中断中只接受到了4032或者其它的自节数啊

使用特权

评论回复
15
lj1978| | 2012-3-9 17:05 | 只看该作者
usb和CAN用的是同一组脚和中断资源,所以用usb就会屏蔽can,反过来也是一样

使用特权

评论回复
16
微兮兮| | 2013-4-26 20:57 | 只看该作者
我想请问一下,是不是在实现BOT的时候,不一定非要用双缓冲的?
另外,是不是本来由于端点地址的设置,一次收发只能64bytes,所谓的Mass storage,只是说将数据都先存着SD里,比如存8次,共512字节,然后再一次性发出去?新手感谢您!!

使用特权

评论回复
17
gongxd126com| | 2014-3-13 20:35 | 只看该作者
同问

使用特权

评论回复
18
abswzp| | 2015-10-9 13:23 | 只看该作者
sxw35035 发表于 2009-11-12 11:26
那有没有关于usb双缓冲的完整代码啊,在stm官方网站上哪个包中有啊

在stm32给的例子,STM32_USB-FS-Device_Lib_V4.0.0中的Audio_Speaker端点1就是双缓冲的

使用特权

评论回复
19
wywwdxf| | 2015-12-1 10:28 | 只看该作者
您的双缓冲速度能达到多少?

使用特权

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

本版积分规则

1

主题

10

帖子

1

粉丝