USB设备,如何控制OUT端点数据接收?

2019-10-15 22:29发布

环境:STM32F103ZET6, USB设备模式,接收PC上的USB端口打印数据。

需求:在连续打印的情况下,打印机打印速度有限,并且内建缓存不够,需要STM32在接收一部分数据后暂停从OUT端点接收数据,待处理完之后继续接收数据。

我的做法:

1、调用USBLIB中的NOP_Process()函数暂停接收数据,这样STM32会自动回复NAK,PC端就会暂停打印数据。但是我发现在STM32的usb中断函数void USB_Istr(void)中,程序会跑进
[mw_shl_code=c,true]#if (IMR_MSK & ISTR_SOF)
        if (wIstr & ISTR_SOF & wInterrupt_Mask)
        {
                _SetISTR((uint16_t)CLR_SOF);
                bIntPackSOF++;
        #ifdef SOF_CALLBACK
                SOF_Callback();
        #endif
        }
#endif[/mw_shl_code]
而不能够再进入
[mw_shl_code=applescript,true]#if (IMR_MSK & ISTR_CTR)
        if (wIstr & ISTR_CTR & wInterrupt_Mask)        //处理端点传输完成的代码,最重要
        {
                /* servicing of the endpoint correct transfer interrupt */
                /* clear of the CTR flag into the sub */
                CTR_LP();
        #ifdef CTR_CALLBACK
                CTR_Callback();
        #endif
        }
#endif [/mw_shl_code]
中的的CTR_LP()函数,也就是不能进入(*pEpInt_OUT[EPindex-1])(),也就是不能再次进入正常接收的中断函数EP1_ReceiveAndthenCopyToTxbuff(),于是不能再重新接受数据。做法如下:

[mw_shl_code=c,true]void EP1_ReceiveAndthenCopyToTxbuff(void)
{
if(wFlag_Test_ReadyToRec)
{
dCount_EDP1IN_count++;
ReceiveByteCount = GetEPRxCount(ENDP1);        //从端点来一帧数据计数(64字节)

PMAToUserBufferCopy(Buffer_Receiv,ENDP1_RXADDR,ReceiveByteCount);
SetEPRxValid(ENDP1);       

count = count + ReceiveByteCount;

}
else
{
NOP_Process();
}[/mw_shl_code]

2、直接使用usb_regs.h中的_SetEPRxStatus()函数,设置OUT端点为忙。结果和方法1一样不能再重新接收数据。做法如下:

[mw_shl_code=c,true]void EP1_ReceiveAndthenCopyToTxbuff(void)
{        
        if(wFlag_Test_ReadyToRec)
        {
                dCount_EDP1IN_count++;
                ReceiveByteCount = GetEPRxCount(ENDP1);        //从端点来一帧数据计数(64字节)
               
                PMAToUserBufferCopy(Buffer_Receiv,ENDP1_RXADDR,ReceiveByteCount);
                SetEPRxValid(ENDP1);       

                count = count + ReceiveByteCount;

        }
        else
        {
                _SetEPRxStatus();
        }
       
}[/mw_shl_code]


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