STM32
直播中

安立路

8年用户 811经验值
私信 关注
[问答]

STM32_USB-FS-Device_Lib_V4.1.0为何不在端点恢复后将发送端点设置为NAK?

STM32_USB-FS-Device_Lib_V4.1.0

file                  :usb_core.c

funciton name:  RESULT Standard_ClearFeature(void)

code               :

  if (wIndex0   0x80)
{
/* IN endpoint */
if (_GetTxStallStatus(Related_Endpoint ))
{
ClearDTOG_TX(Related_Endpoint);
SetEPTxStatus(Related_Endpoint, EP_TX_VALID);
}
}
else
{
/* OUT endpoint */
if (_GetRxStallStatus(Related_Endpoint))
{
if (Related_Endpoint == ENDP0)
{
/* After clear the STALL, enable the default endpoint receiver */
SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize);
_SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
}
else
{
ClearDTOG_RX(Related_Endpoint);
_SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
}
}
}

question: i saw that status of IN endpint was set to VALID(EP_TX_VALID) after recover from HALT;

                i wonder why we don't set the status to NAK;

                The USB spec doesn't specify how to leave the endpoints after a halt is cleared.

                but for an interrupt IN endpoint such as a HID device,at that point when the endpoint recover from halt status,the device will send an  packet with uncertain data to the host,since the host automatically query the device  by IN token in a determined interval constantly,and it can be quite possible for the packet buffer contains uncertain data at that point;

                possible advice: just set the status to NAK,firmware could set it to VALID if necessary data get ready to transfer to host later.


主要意思是在一个端点从HALT状态恢复后,发送是有效的,那样的话,比如对于一个中断型的IN端点,会自动发给主机一个数据包,这个数据包的内容是不定的,很可能包含未知的数据;

疑问就是为何不在端点恢复后将发送端点设置为NAK,在固件准备好数据后在由固件设为VALID。

回帖(1)

麻酱

2024-5-6 17:01:22
STM32_USB-FS-Device_Lib_V4.1.0 是 STMicroelectronics 提供的一个用于 STM32 微控制器的 USB 设备固件库。在您提到的代码段中,`Standard_ClearFeature` 函数的作用是清除 USB 端点的特征。这个函数是 USB 标准设备请求的一部分,用于处理 SET_FEATURE 请求。

在 USB 协议中,SET_FEATURE 请求用于设置或清除特定的 USB 特征,例如STALL(阻塞)特征。当收到 SET_FEATURE 请求并指定 ENDPOINT_HALT 特征时,设备需要清除指定端点的 STALL 状态。

在您提供的代码段中,`Standard_ClearFeature` 函数首先检查 wIndex0 参数(一个 16 位的参数,用于指定要操作的端点)以确定是输入端点还是输出端点。如果 wIndex0 的低 7 位(0x80)为 1,表示是输入端点。

接下来,代码检查指定端点的传输状态是否为 STALL。如果是,它将清除数据令牌翻转位(DTOG_TX),然后设置端点传输状态。这里的关键是,代码并没有将发送端点设置为 NAK(不应答),而是根据 USB 协议的要求,清除 STALL 状态并恢复正常的端点传输。

USB 协议规定,在清除 STALL 状态后,设备应该准备好接收或发送数据,而不是进入 NAK 状态。NAK 状态通常用于设备忙或无法立即处理请求时。在这种情况下,清除 STALL 状态后,设备应该准备好继续处理数据传输。

总之,STM32_USB-FS-Device_Lib_V4.1.0 在端点恢复后不将发送端点设置为 NAK,是因为 USB 协议要求在清除 STALL 状态后,设备应该恢复正常的端点传输状态,而不是进入 NAK 状态。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分