USB传输 SetAddress传输
2025-03-28
18
0
SetAddress传输包含两个事务,分别为Setup事务和IN事务。
- Setup事务
- Setup翎牌
- Data0
- Ack
- In事务
- In令牌包
- Data1
- Ack
通过总线分析仪抓包可见:
其中
- Setup事务用于从主机接收地址值。
- IN事务用于设备设置新的地址完成。
如对于WCH569芯片,其源代码如下:
在其Setup事务中断中,保存数据到全局变量中
switch( SetupReq )
{
case USB_SET_ADDRESS:
g_devInfo.dev_addr = UsbSetupBuf->wValueL;
break;
}
而在IN事务中设置地址到设备寄存器:
UINT16 U20_Endp0_IN_Callback(void)
{
UINT16 len = 0;
//setup是全局变量,记录着setup事务的请求类型
switch(SetupReq)
{
//SetupLen是全局变量,在SETU事务中设置描述符的长度,然后通过IN返回数据,可能有多次的IN
case USB_GET_DESCRIPTOR:
len = SetupLen >= U20_UEP0_MAXSIZE ? U20_UEP0_MAXSIZE : SetupLen;
memcpy(endp0RTbuff, pDescr, len);
SetupLen -= len;
pDescr += len;
break;
case USB_SET_ADDRESS:
USB20_Device_Setaddress(g_devInfo.dev_addr);
break;
default:
break;
}
//返回IN的事务长度
return len;
}
void USB20_Device_Setaddress( UINT32 address )
{
R8_USB_DEV_AD = address; // SET ADDRESS
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936