CH374G芯片使用USB主機(jī)模式 下接USB HUB 時

CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常

但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?


求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝

CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常

但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?


求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝



CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常

但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?


求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝



CH374G芯片使用USB主機(jī)模式 下接USB HUB 時 對HUB 設(shè)備枚舉正常 外部端口讀取狀態(tài)也正常

但是在切換 0地址通過操作外部HUB端口下的設(shè)備時 怎么也讀取不到設(shè)備的描述符?


求那位大神發(fā)發(fā)善心指導(dǎo)一下,非常感謝



設(shè)備速度檢測了嗎,對于低速設(shè)備是否開啟前置包。詳細(xì)參考CH374EVT/EXAM/EMB_HUB例程。


設(shè)備速度檢測了的

這部分代碼如下,勞煩幫忙檢查一下


else if( Infor_DEV[hub_num].Itfac_Class==0x09) ?//對USB Hub設(shè)備進(jìn)行處理

{

//這里需要保存Hub上的端口數(shù)目

#ifdef DebugPrint

printf("Hub port\n");

#endif

//給 Hub的 外部端口上電

for(i=1;i<5;i++)

{

s = SetPortFeature( i, 8 );

}

//這里hub設(shè)備枚舉 結(jié)束

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端口,設(shè)置當(dāng)前USB速度以及被操作設(shè)備的USB地址

// SetHostUsbAddr(hub_num + 2 );

// //SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );?

// Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );

? ? mDelaymS( 100 );

// 做點(diǎn)什么? ?給HUB各端口上電,查詢各端口狀態(tài),初始化有設(shè)備連接的HUB端口,初始化設(shè)備

for(i=1;i<5;i++)

{

//設(shè)置索引到相應(yīng)的端口 ,及USB總線默認(rèn)操作速度

// SetHostUsbAddr(hub_num + 2 );

// //SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );?

// Write374Byte( REG_USB_SETUP, BIT_SETP_HOST_MODE | BIT_SETP_AUTO_SOF );

s = GetPortStatus( i ); ?//獲取端口狀態(tà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) ) ? ?//有設(shè)備連接

{

s = GetPortStatus( i ); ?//獲取端口狀態(tà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下的該設(shè)備進(jìn)行枚舉操作------------------------------

mDelaymS( 100 ); ?//等待Hub下的USB設(shè)備穩(wěn)定

s = SetPortFeature( i, PORT_RESET ); ?// 對有設(shè)備連接的端口復(fù)位 ?

if ( s != USB_INT_SUCCESS ) return( s ); //可能是HUB斷開了

#if 0

printf( "Reset port and then wait in\n" );

#endif

do { ?// 查詢復(fù)位的USB端口直到復(fù)位狀態(tài)完成

mDelaymS( 1 );

s = GetPortStatus( i );

if ( s != USB_INT_SUCCESS ) return( s ); ?//可能是HUB斷開了

} while ( buf[0] & 0x10 );?

? ? ? mDelaymS( 100 );

//清除連接或移除變化標(biāo)志

? ? ? s = ClearPortFeature( i, C_PORT_CONNECTION );

? ? ? if ( s != USB_INT_SUCCESS ) return( s );


s = GetPortStatus( i ); ?//再次讀取狀態(tài) ,復(fù)位設(shè)備是否還在

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設(shè)備進(jìn)行枚舉-----------------

#ifdef DebugPrint

printf("enum hub port device\n");

#endif

? ? ? ??

// --選擇指定的Hub端口 ----設(shè)置USB設(shè)備的地址 為 0 ?進(jìn)行 一系列枚舉的操作-----

? ? ? ? // 這里Hub的操作端口已經(jīng)選擇好,只需要設(shè)備USB的地址為零即可和Hub下面的設(shè)備通訊

//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 );

//-----------------------------獲取設(shè)備描述符----------------



目前就卡在切換0地址獲取Hub下面的描述符這一步驟上,


發(fā)完SetHostUsbAddr(0)之后,需要根據(jù)上面檢測到的HUB下設(shè)備速度進(jìn)行配置。

void?SelectHubPort( UINT8 HubIndex, UINT8 PortIndex )? // PortIndex=0選擇操作指定的ROOT-HUB端口,否則選擇操作指定的ROOT-HUB端口的外部HUB的指定端口
{
?if ( PortIndex ) {? // 選擇操作指定的ROOT-HUB端口的外部HUB的指定端口
??SetHostUsbAddr( DevOnHubPort[HubIndex][PortIndex-1].DeviceAddress );? // 設(shè)置USB主機(jī)當(dāng)前操作的USB設(shè)備地址
??if ( DevOnHubPort[HubIndex][PortIndex-1].DeviceSpeed == 0 )? // 通過外部HUB與低速USB設(shè)備通訊需要前置ID
???Write374Byte( REG_HUB_SETUP, Read374Byte( REG_HUB_SETUP ) | BIT_HUB_PRE_PID );? // 啟用PRE PID
??SetUsbSpeed( DevOnHubPort[HubIndex][PortIndex-1].DeviceSpeed );? // 設(shè)置當(dāng)前USB速度
?}
?else {? // 選擇操作指定的ROOT-HUB端口
??SetHostUsbAddr( RootHubDev[HubIndex].DeviceAddress );? // 設(shè)置USB主機(jī)當(dāng)前操作的USB設(shè)備地址
??SetUsbSpeed( RootHubDev[HubIndex].DeviceSpeed );? // 設(shè)置當(dāng)前USB速度
?}
}


謝謝指導(dǎo),目前已經(jīng)順利枚舉hub下面的設(shè)備了,順利讀取數(shù)據(jù)了,但是目前hub下的設(shè)備如果傳輸數(shù)據(jù)過多設(shè)備就掉了,就是鼠標(biāo)我晃一下設(shè)備就直接掉了,目前還是無法找到很好的解決方法


數(shù)據(jù)包的翻轉(zhuǎn)是否正確?此外對于鍵盤鼠標(biāo)等低速設(shè)備操作之前需要先選擇設(shè)備地址、開PRE PID、設(shè)置低速然后發(fā)包。結(jié)束后,仍需切換到全速。


數(shù)據(jù)包的翻轉(zhuǎn)不會有問題,設(shè)備地址,PRE PID 設(shè)置低速都做了,

出現(xiàn)的現(xiàn)象就是通過hub傳輸大量數(shù)據(jù),直接設(shè)備就掉了(鼠標(biāo)晃一下,鍵盤連著不停按),

而且還有一個現(xiàn)象,就是我的Hub是full speed的設(shè)備 鍵盤鼠標(biāo)也是但是在枚舉時候必須設(shè)置為低速設(shè)備才能正常枚舉


對于鍵盤鼠標(biāo)數(shù)據(jù)量并不算大。鍵盤鼠標(biāo)一般為低速設(shè)備,速度檢測對不對?BIT_HUBx_DX_IN判斷極性是否匹配,BIT_HUBx_POLAR代表當(dāng)前極性,由這兩個位來檢測和配置自身極性的。


謝謝答復(fù), 問題原因找到了?

是CH374發(fā)的硬件SOF 和傳輸時候疊加在一起的沖突導(dǎo)致的,但是目前還沒找到好的解決辦法


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频