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