CH374復(fù)位后再讀數(shù)據(jù)出錯(cuò)

求大神解救!?。?! CH374做主設(shè)備,按官方例程寫的: CH374_PORT_INIT( ); /* CH374接口初始化 */// Write374Byte(0x05, 0x08); /*--CH374復(fù)位--*/ mDelaymS( 1 ); Write374Byte(0x05, 0x04); /*--CH374停止復(fù)位--*/ mDelaymS( 50 ); // 等待CH374復(fù)位完成 Init374Host( ); // 初始化USB主機(jī); HostSetBusFree( ); // 設(shè)定USB主機(jī)空閑 CP2102R_count=10;/*---等待30秒,無設(shè)備則退出--*/ if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主機(jī)中斷則處理 if ( Query374DeviceIn( ) ) nop(); // 有USB設(shè)備 else {Btimeout=1;return;} /*--無USB設(shè)備,退出--*/ 。。。。。。

/*****后面還有一堆設(shè)置波特率之類的。 然后與下面的設(shè)備通信,此時(shí)是正常的。通信完后(實(shí)際上,下面兩句加不加,錯(cuò)誤都不變), s=CP2102_Start_stop(0x0000);//Uart_Stop Write374Byte(0x05, 0x05); /*--CH374停振*/

然后下一次連上設(shè)備再通信,重復(fù)上面CH374、USB初始化的代碼,發(fā)現(xiàn)無法通信了。具體是 執(zhí)行s=CP2102_Res_Data(BUF_RX1)函數(shù)中子函數(shù) UINT8 WaitHostTransact374( UINT8 endp_addr, UINT8 pid, BOOL tog, UINT16 timeout ) { UINT8 i, s; while ( 1 ) { for ( i = 0; i < 40; i ++ ) { s = HostTransact374( endp_addr, pid, tog );

if ( s != ( DEF_USB_PID_NAK | 0x20 ) || timeout == 0 ) return( s ); mDelayuS( 20 ); } if ( timeout < 0xFFFF ) timeout --; /*if (Btimeout) return(s); */ /*--后加,20091125--*/ } } 出現(xiàn)超時(shí)錯(cuò)誤。 我猜想是不是CH374復(fù)位有問題??望哪位大神不吝賜教?。。。。∪f分感謝?。?!

注意結(jié)束復(fù)位0x05寄存器清零參考下面函數(shù),復(fù)位后需調(diào)用CH374Init或者CH374LibInit重新初始化。 void CH374Reset( ) { Write374Byte( REG_SYS_CTRL, 0 ); /* 清控制寄存器 */ Write374Byte( REG_SYS_CTRL, BIT_CTRL_RESET_NOW ); /* 芯片軟件復(fù)位控制 */ mDelaymS( 5 ); /* 延時(shí)至少5毫秒 */ Write374Byte( REG_SYS_CTRL, 0 ); /* 結(jié)束復(fù)位 */ mDelaymS( 5 ); /* 延時(shí)至少5毫秒 */ }


非常感謝!但換成這個(gè)復(fù)位后還是不行,估計(jì)是沒有CH374Init或者CH374LibInit?可是我到處都沒找到這個(gè)函數(shù)的具體內(nèi)容呢,能提供一下么,再次非常非常感謝?。?/p>


Write374Byte( REG_SYS_CTRL, Read374Byte(REG_SYS_CTRL)|0x08 ); //芯片復(fù)位 delayms( 1 ); Write374Byte( REG_SYS_CTRL, Read374Byte(REG_SYS_CTRL)&0xf7 ); //完成芯片復(fù)位 delayms( 200 ); Init374Host( ); // 初始化USB主機(jī)

后面在進(jìn)行操作即可。


CH374Init和CH374_PORT_INIT( )不一樣么,就是初始化SPI之類的,哎,明明上電第一次執(zhí)行都沒有問題的哎,CH374Reset( )后不是回到上電最開始的狀態(tài)么?


謝謝樓上各位了,8過還是沒有解決哎,關(guān)鍵是如果不進(jìn)行具體的通信多少次復(fù)位初始化都沒問題,一旦有過和從設(shè)備的通信后374再復(fù)位初始化就不對(duì)了,會(huì)不會(huì)是硬件的問題呀?


你的現(xiàn)象,不像是復(fù)位的問題,而是復(fù)位完成之后初始化Init374Host( ),你是怎樣寫的?通訊的話只會(huì)改變一些寄存器的狀態(tài)。你可以復(fù)位之后看一下讀寫寄存器的函數(shù)有無問題。


讀寫寄存器都正常,后面檢測(cè)USB設(shè)備,獲取描述符都沒錯(cuò),就是不能通信。 void Init374Host( void ) // 初始化USB主機(jī) { Write374Byte( REG_USB_SETUP, 0x00 );/*REG_USB_SETUP: USB配置 */ aa=Read374Byte(REG_USB_SETUP); SetHostUsbAddr( 0x00 ); Write374Byte( REG_USB_H_CTRL, 0x00 ); aa=Read374Byte(REG_USB_H_CTRL); Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); // 清所有中斷標(biāo)志 aa=Read374Byte(REG_INTER_FLAG); Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER | BIT_IE_DEV_DETECT ); // 允許傳輸完成中斷和USB設(shè)備檢測(cè)中斷 Write374Byte( REG_SYS_CTRL, BIT_CTRL_OE_POLAR ); // 對(duì)于CH374T或者UEN引腳懸空的CH374S必須置BIT_CTRL_OE_POLAR為1 HostSetBusFree( ); // USB總線空閑 }


終于查出來為什么了?。。?! mSaveDevEndpTog和mSaveDevEndpTog1這兩個(gè)同步標(biāo)志位的問題,因?yàn)樵跀?shù)據(jù)發(fā)送和接收后會(huì)發(fā)生值的翻轉(zhuǎn),如果復(fù)位后這兩個(gè)值還是翻轉(zhuǎn)后的值,在接收時(shí)會(huì)發(fā)生不同步則丟棄后的錯(cuò)誤,所以要在復(fù)位后將這兩個(gè)標(biāo)志位置0。困擾了一天多,還是得一個(gè)函數(shù)一個(gè)寄存器慢慢查啊。謝謝幫忙解答的各位了!


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

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