CH374G芯片使用USB主机模式 下接USB 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 和传输时候叠加在一起的冲突导致的,但是目前还没找到好的解决办法


只有登录才能回复,可以选择微信账号登录