OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2451|回复: 1

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

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-12-21
在线时间
0 小时
发表于 2016-12-21 18:17:06 | 显示全部楼层 |阅读模式
1金钱
环境: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]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-25 23:32:23 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表