ST官方USB例程中返回STALL的问题

箫尘、埃 2022-10-31 15:42:59 编辑

群主有研究过ST官方USB例程吗,有个问题不太明白,想请教一下:
最近在看ST官方USB例程(芯片:stm32f103,USB虚拟串口实验),发现官方例程在处理控制读传输的状态过程时,如果数据过程的数据长度不是整数个数据包时,总是在状态过程挂起端点0,即返回STALL;不明白为什么要返回STALL,返回STALL不是代表设备不支持这个请求吗。
主要代码:
1、在控制读传输的数据过程(DataStageIn函数),会进入到第二个红框中(标记ControlState状态为WAIT_STATUS_OUT),这时数据过程的最后一个数据包已经发送完成,然后会进入到控制读传输的状态过程
151949624627

2、控制读传输的状态过程(在 Out0_Process 函数中),进入到 ControlState == WAIT_STATUS_OUT,标记ControlState为STALLED,然后在Post0_Process()函数中就设置了端点为STALL

153504573308

3、Post0_Process()函数内容
154226764214

USB中文网 2022-10-31 16:33:55 编辑

STALL 握手包一般由 USB 功能设备发送,表示该 USB 功能设备不支持这个请求,或者无法发送和接收数据。 STALL 握手包分为以下两种情况。

  • 协议 STALL 握手包:在控制传输中使用。协议 STALL 握手包表明了该 USB 功能设备不支持这个请求协议(如设备限定描述符的获取)。
  • 功能 STALL 握手包:表明该 USB 功能设备的相应端点已经停止,而无法完成发送数据或者接收数据的操作。

所以,这里的STALL说明该端点已经错乱或者有问题了,所以需要主机通过CLEAR_FEATURE进行复位。请见参考2(需VIP权限,可选择开通VIP,也可单独QQ找我索要该内容(免费))