打印

清除usb设备txfifo中的数据

[复制链接]
304|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaloulin|  楼主 | 2018-7-14 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
背景:USB设备不能直接操作USB总线,只有USB主机许可才行。USB主机是PC端软件,USB设备是自定义的一个设备,通信过程是:USB主机发送获取设备状态的指令,USB设备回复设备的状态。但如果USB设备超时才回复一个状态,USB主机超时退出,则接收不到状态帧。

则此时USB设备TXFIFO中一直缓存着这一帧,下次USB主机再发送一帧获取状态帧后,USB设备会马上将之前缓存在TXFIFO中的数据应答到USB主机上。这样的状态帧并不是当前的状态。

可以用以下函数进行清除,测试暂时没发现问题:
static void ClearUSBDTxFifo(USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
{
        USB_OTG_DTXFSTSn_TypeDef  txstatus;
        USB_OTG_DEPCTL_TypeDef           depctl;
        DWORD fifoemptymsk = 0;

        txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[0x7f&epnum]->DTXFSTS);
        depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0x7f&epnum]->DIEPCTL);
        
        //判断txfifo是否存在数据
        if(txstatus.b.txfspcavail < TX1_FIFO_HS_SIZE)
        {
                g_senderData.abnormal |= USBB_TXFIFO_NOT_EMPTY;
                g_senderData.clearUSBDtxfifo = 1;
               
                //关闭txfifo empty中断
                fifoemptymsk = 0x1 << (0x7f&epnum);
                USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
                        
                //清空txfifo
                USB_OTG_FlushTxFifo(pdev, epnum & 0x7F);
               
                //关闭端点
                if (depctl.b.epena)
                {
                  depctl.b.epdis = 1;
                  depctl.b.snak = 1;
                }
                else
                {
                  depctl.d32 = 0;
                }
                USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0x7f&epnum]->DIEPCTL, depctl.d32);
        }
}

使用特权

评论回复

相关帖子

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

本版积分规则

439

主题

448

帖子

0

粉丝