ST官方USB例程中返回STALL的问题
群主有研究过ST官方USB例程吗,有个问题不太明白,想请教一下:
最近在看ST官方USB例程(芯片:stm32f103,USB虚拟串口实验),发现官方例程在处理控制读传输的状态过程时,如果数据过程的数据长度不是整数个数据包时,总是在状态过程挂起端点0,即返回STALL;不明白为什么要返回STALL,返回STALL不是代表设备不支持这个请求吗。
主要代码:
1、在控制读传输的数据过程(DataStageIn函数),会进入到第二个红框中(标记ControlState状态为WAIT_STATUS_OUT),这时数据过程的最后一个数据包已经发送完成,然后会进入到控制读传输的状态过程
2、控制读传输的状态过程(在 Out0_Process 函数中),进入到 ControlState == WAIT_STATUS_OUT,标记ControlState为STALLED,然后在Post0_Process()函数中就设置了端点为STALL
3、Post0_Process()函数内容
STALL 握手包一般由 USB 功能设备发送,表示该 USB 功能设备不支持这个请求,或者无法发送和接收数据。 STALL 握手包分为以下两种情况。
- 协议 STALL 握手包:在控制传输中使用。协议 STALL 握手包表明了该 USB 功能设备不支持这个请求协议(如设备限定描述符的获取)。
- 功能 STALL 握手包:表明该 USB 功能设备的相应端点已经停止,而无法完成发送数据或者接收数据的操作。
所以,这里的STALL说明该端点已经错乱或者有问题了,所以需要主机通过CLEAR_FEATURE进行复位。请见参考2(需VIP权限,可选择开通VIP,也可单独QQ找我索要该内容(免费))
- 1.USB2.0 STALL握手包 https://www.usbzh.com/article/detail-698.html
- 2.USB设备的端点停止(ENDPOINT_HALT) https://www.usbzh.com/article/detail-715.html
- 3.USB 清除特性请求ClearFeature https://www.usbzh.com/article/detail-89.html