清除usb设备txfifo中的数据

2019-07-20 09:10发布

背景: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);
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。