目前正在移植以前51的一个产品。在控制端点0要用到专用请求 host->device 第一字节0x02(表示专用的ID可以是小于255,不等与零的任意数) ,第二字节 0x02 表示实际的device设备有几个(在报告描述里有几个就是几个 可以是大于等于1 ,小于等于255),第三字节0xef,是houst给device的标识符。
在STM32 USB库中的USB的枚举过程是:void CTR_LP(void)函数判断是端点0还是非零端点,再以NAK,ACK来回应HOUST,在houst一直没有处于接收状态有三种方式:一、In0_Process()输入包,二、Setup0_Process();端点零的建立包,通常我们的USBHID枚举过程从这里开始,三、Out0_Process()输出包。但是我现在要解析host->device 的三个字节 0x02 0x02 0xef,在方式二下没有得到,通过PC机上的USB Mniter软件看到的却是发了数据包的。同时在u8 Out0_Process(void){ else if (ControlState == WAIT_STATUS_OUT)
{
Dputc(0x22);
(*pProperty->Process_Status_OUT)();
ControlState = STALLED;
}
}函数监控发现控制状态为暂停。为什么呢?
附:端点0中断
else //in包SETUP包或者OUT包
{
/* DIR = 1 */
/* DIR = 1 & CTR_RX => SETUP or OUT int */
/* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */
wEPVal = _GetENDPOINT(ENDP0); //端点0的状态
if ((wEPVal & EP_CTR_TX) != 0)
{
_ClearEP_CTR_TX(ENDP0);
Dputc(0x66);
In0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
else if ((wEPVal &EP_SETUP) != 0)
{
_ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
Setup0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
else if ((wEPVal & EP_CTR_RX) != 0)
{
_ClearEP_CTR_RX(ENDP0);
Out0_Process();
Dputc(0x44);
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
}
}/* if(EPindex == 0) */
此帖出自
小平头技术问答
一周热门 更多>