基于STM32F103的USB学习笔记18 - CTR_LP

72 篇文章 40 订阅

设置好设备地址(开始设置为0),使能USB,USB中断就会开始工作。

1.设置设备地址,使能USB

_SetDADDR(Val | DADDR_EF);

2. USB中断函数调用CTR_LP()

void CTR_LP(void)
{
        __IO uint16_t wEPVal = 0;
        while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)  //如果一直有正确的传输就一直处理数据。EP0除外,EP0处理完就返回了。
        {
                EPindex = (uint8_t)(wIstr & ISTR_EP_ID);  //获取中断源是哪个端点
                if (EPindex == 0) //端点0
                {
                        SaveRState = _GetENDPOINT(ENDP0);     //读入端点0的端点寄存器
                        SaveTState = SaveRState & EPTX_STAT;  //保存TX状态
                        SaveRState &=  EPRX_STAT;                       //保存RX状态

                        _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); //设置端0的RX、TX状态都为NAK状态。

                        if ((wIstr & ISTR_DIR) == 0)
                        {//IN处理过程,设备发送数据给主机

                                _ClearEP_CTR_TX(ENDP0);  //清TX的CTR位。
                                In0_Process();  //端点0的IN处理函数

                                _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); //恢复RX和TX状态
                                return;
                        }
                        else
                        {//SETUP或OUT流程,主机发送数据给设备

                                wEPVal = _GetENDPOINT(ENDP0); //读入端点0的端点寄存器
        
                                if ((wEPVal &EP_SETUP) != 0)
                                {//SETUP处理流程
                                        _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
                                        Setup0_Process();

                                        _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
                                        return;
                                }

                                else if ((wEPVal & EP_CTR_RX) != 0)
                                {//OUT处理流程
                                        _ClearEP_CTR_RX(ENDP0);
                                        Out0_Process();
                                        _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
                                        return;
                                }
                        }
                }/* if(EPindex == 0) */
                else
                {//处理其他EP
                        wEPVal = _GetENDPOINT(EPindex);
                        if ((wEPVal & EP_CTR_RX) != 0)
                        {
                                _ClearEP_CTR_RX(EPindex);
                                (*pEpInt_OUT[EPindex-1])(); //其他7个EP OUT回调函数

                        } /* if((wEPVal & EP_CTR_RX) */

                        if ((wEPVal & EP_CTR_TX) != 0)
                        {
                                _ClearEP_CTR_TX(EPindex);
                                (*pEpInt_IN[EPindex-1])(); //其他7个EP IN回调函数
                        } /* if((wEPVal & EP_CTR_TX) != 0) */

                }/* if(EPindex == 0) else */

        }/* while(...) */
}

打印数据看流程:

Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值