CH374G芯片使用USB主机模式 下接USB HUB 时 对HUB 设备枚举正常 外部端口读取状态也正常
但是在切换 0地址通过操作外部HUB端口下的设备时 怎么也读取不到设备的描述符?
求那位大神发发善心指导一下,非常感谢
CH374G芯片使用USB主机模式 下接USB HUB 时 对HUB 设备枚举正常 外部端口读取状态也正常
但是在切换 0地址通过操作外部HUB端口下的设备时 怎么也读取不到设备的描述符?
求那位大神发发善心指导一下,非常感谢
CH374G芯片使用USB主机模式 下接USB HUB 时 对HUB 设备枚举正常 外部端口读取状态也正常
但是在切换 0地址通过操作外部HUB端口下的设备时 怎么也读取不到设备的描述符?
求那位大神发发善心指导一下,非常感谢
CH374G芯片使用USB主机模式 下接USB HUB 时 对HUB 设备枚举正常 外部端口读取状态也正常
但是在切换 0地址通过操作外部HUB端口下的设备时 怎么也读取不到设备的描述符?
求那位大神发发善心指导一下,非常感谢
CH374G芯片使用USB主机模式 下接USB HUB 时 对HUB 设备枚举正常 外部端口读取状态也正常
但是在切换 0地址通过操作外部HUB端口下的设备时 怎么也读取不到设备的描述符?
求那位大神发发善心指导一下,非常感谢
设备速度检测了吗,对于低速设备是否开启前置包。详细参考CH374EVT/EXAM/EMB_HUB例程。
设备速度检测了的
这部分代码如下,劳烦帮忙检查一下
else if( Infor_DEV[hub_num].Itfac_Class==0x09) //对USB Hub设备进行处理
{
//这里需要保存Hub上的端口数目
#ifdef DebugPrint
printf("Hub port\n");
#endif
//给 Hub的 外部端口上电
for(i=1;i<5;i++)
{
s = SetPortFeature( i, 8 );
}
//这里hub设备枚举 结束
if ( s != USB_INT_SUCCESS )
{
#ifdef DebugPrint
printf("Ext-HUB Port%01d# power on error\n",(UINT16)i ); // 外部hub端口上电失败
#endif
FailEnumDevice( hub_num );
return FALSE;
} // HUB枚举成功
else
{
#ifdef DebugPrint
printf("Hub port power up ok\n");
#endif
}
// 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址
// SetHostUsbAddr(hub_num + 2 );
// //SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );
// Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );
mDelaymS( 100 );
// 做点什么? 给HUB各端口上电,查询各端口状态,初始化有设备连接的HUB端口,初始化设备
for(i=1;i<5;i++)
{
//设置索引到相应的端口 ,及USB总线默认操作速度
// SetHostUsbAddr(hub_num + 2 );
// //SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );
// Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );
s = GetPortStatus( i ); //获取端口状态
if ( s != USB_INT_SUCCESS )
{
#ifdef DebugPrint
printf("Get port state err\n");
#endif
return( s ); //可能是HUB断开了
}
if ( (buf[0]&0x01) && (buf[2]&0x01) ) //有设备连接
{
s = GetPortStatus( i ); //获取端口状态
if ( s != USB_INT_SUCCESS ) return( s ); //可能是HUB断开了
if(buf[1] & 0x02 ? 0 : 1) //低速还是全速
{
//
#ifdef DebugPrint
printf("Hub port low speed device\n");
#endif
}
else
{
#ifdef DebugPrint
printf("Hub port full speed device\n");
#endif
}
//---------------------对hub下的该设备进行枚举操作------------------------------
mDelaymS( 100 ); //等待Hub下的USB设备稳定
s = SetPortFeature( i, PORT_RESET ); // 对有设备连接的端口复位
if ( s != USB_INT_SUCCESS ) return( s ); //可能是HUB断开了
#if 0
printf( "Reset port and then wait in\n" );
#endif
do { // 查询复位的USB端口直到复位状态完成
mDelaymS( 1 );
s = GetPortStatus( i );
if ( s != USB_INT_SUCCESS ) return( s ); //可能是HUB断开了
} while ( buf[0] & 0x10 );
mDelaymS( 100 );
//清除连接或移除变化标志
s = ClearPortFeature( i, C_PORT_CONNECTION );
if ( s != USB_INT_SUCCESS ) return( s );
s = GetPortStatus( i ); //再次读取状态 ,复位设备是否还在
if ( s != USB_INT_SUCCESS ) return( s );
if ( (buf[0]&0x01) == 0 )
{
#ifdef DebugPrint
printf("Hub port no device\n");
#endif
return( s );
}
else
{
// -----------------------------对外部hub下的USB设备进行枚举-----------------
#ifdef DebugPrint
printf("enum hub port device\n");
#endif
// --选择指定的Hub端口 ----设置USB设备的地址 为 0 进行 一系列枚举的操作-----
// 这里Hub的操作端口已经选择好,只需要设备USB的地址为零即可和Hub下面的设备通讯
//SwitchHUBPort( 1 );
SetHostUsbAddr(0);//SetHostUsbAddr(0);
Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );
//Write374Byte( REG_USB_SETUP, Read374Byte( REG_USB_SETUP ) | BIT_SETP_LOW_SPEED | BIT_SETP_AUTO_SOF );
mDelaymS( 10 );
//-----------------------------获取设备描述符----------------
目前就卡在切换0地址获取Hub下面的描述符这一步骤上,
发完SetHostUsbAddr(0)之后,需要根据上面检测到的HUB下设备速度进行配置。
void SelectHubPort( UINT8 HubIndex, UINT8 PortIndex ) // PortIndex=0选择操作指定的ROOT-HUB端口,否则选择操作指定的ROOT-HUB端口的外部HUB的指定端口
{
if ( PortIndex ) { // 选择操作指定的ROOT-HUB端口的外部HUB的指定端口
SetHostUsbAddr( DevOnHubPort[HubIndex][PortIndex-1].DeviceAddress ); // 设置USB主机当前操作的USB设备地址
if ( DevOnHubPort[HubIndex][PortIndex-1].DeviceSpeed == 0 ) // 通过外部HUB与低速USB设备通讯需要前置ID
Write374Byte( REG_HUB_SETUP, Read374Byte( REG_HUB_SETUP ) | BIT_HUB_PRE_PID ); // 启用PRE PID
SetUsbSpeed( DevOnHubPort[HubIndex][PortIndex-1].DeviceSpeed ); // 设置当前USB速度
}
else { // 选择操作指定的ROOT-HUB端口
SetHostUsbAddr( RootHubDev[HubIndex].DeviceAddress ); // 设置USB主机当前操作的USB设备地址
SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed ); // 设置当前USB速度
}
}
谢谢指导,目前已经顺利枚举hub下面的设备了,顺利读取数据了,但是目前hub下的设备如果传输数据过多设备就掉了,就是鼠标我晃一下设备就直接掉了,目前还是无法找到很好的解决方法
数据包的翻转是否正确?此外对于键盘鼠标等低速设备操作之前需要先选择设备地址、开PRE PID、设置低速然后发包。结束后,仍需切换到全速。
数据包的翻转不会有问题,设备地址,PRE PID 设置低速都做了,
出现的现象就是通过hub传输大量数据,直接设备就掉了(鼠标晃一下,键盘连着不停按),
而且还有一个现象,就是我的Hub是full speed的设备 键盘鼠标也是但是在枚举时候必须设置为低速设备才能正常枚举
对于键盘鼠标数据量并不算大。键盘鼠标一般为低速设备,速度检测对不对?BIT_HUBx_DX_IN判断极性是否匹配,BIT_HUBx_POLAR代表当前极性,由这两个位来检测和配置自身极性的。
谢谢答复, 问题原因找到了
是CH374发的硬件SOF 和传输时候叠加在一起的冲突导致的,但是目前还没找到好的解决办法