感谢49的朋友,依照官方论坛网友的回帖,在OTGD_FS_Handle_RxStatusQueueLevel_ISR()中有个寄存器变量未赋初值0,加上后我的问题依旧.
小弟经过前几天的测试,发现只有在TxFIFO中有数据的时候,主机连续OUT几次后再IN,stm32会无中断产生.
所以我在stm32每次接收到主机的OUT指令后,用OTGD_FS_FlushTxFifo(0x10)对TxFIFO进行初始化,然后再OTGD_FS_PCD_EP_Write(EP1_IN, RXBUF0, 64)写入,就会解决这个问题,但是OTGD_FS_FlushTxFifo()这个函数非常的耗费时间(具体多长时间没测试),不知道是否有其他的解决办法.
下面是函数原型:
USB_OTG_Status OTGD_FS_FlushTxFifo (uint32_t num )
{
USB_OTG_Status status = USB_OTG_OK;
__IO USB_OTG_rst_ctl_data greset;
int count = 0;
greset.d32 = 0;
greset.b.txfflsh = 1;
greset.b.txfnum = num;
WRITE_REG32( &core_regs.common_regs->rst_ctl, greset.d32 );
do
{
greset.d32 = READ_REG32( &core_regs.common_regs->rst_ctl);
if (++count > 200000)
{
break;
}
}
while (greset.b.txfflsh == 1);
/* Wait for 3 PHY Clocks*/
uDELAY(3);
return status;
} |