环境: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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>