CH374复位后再读数据出错

求大神解救!!!! CH374做主设备,按官方例程写的: CH374_PORT_INIT( ); /* CH374接口初始化 */// Write374Byte(0x05, 0x08); /*--CH374复位--*/ mDelaymS( 1 ); Write374Byte(0x05, 0x04); /*--CH374停止复位--*/ mDelaymS( 50 ); // 等待CH374复位完成 Init374Host( ); // 初始化USB主机; HostSetBusFree( ); // 设定USB主机空闲 CP2102R_count=10;/*---等待30秒,无设备则退出--*/ if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) ) nop(); // 有USB设备 else {Btimeout=1;return;} /*--无USB设备,退出--*/ 。。。。。。

/*****后面还有一堆设置波特率之类的。 然后与下面的设备通信,此时是正常的。通信完后(实际上,下面两句加不加,错误都不变), s=CP2102_Start_stop(0x0000);//Uart_Stop Write374Byte(0x05, 0x05); /*--CH374停振*/

然后下一次连上设备再通信,重复上面CH374、USB初始化的代码,发现无法通信了。具体是 执行s=CP2102_Res_Data(BUF_RX1)函数中子函数 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--*/ } } 出现超时错误。 我猜想是不是CH374复位有问题??望哪位大神不吝赐教啊!!!!万分感谢!!!

注意结束复位0x05寄存器清零参考下面函数,复位后需调用CH374Init或者CH374LibInit重新初始化。 void CH374Reset( ) { Write374Byte( REG_SYS_CTRL, 0 ); /* 清控制寄存器 */ Write374Byte( REG_SYS_CTRL, BIT_CTRL_RESET_NOW ); /* 芯片软件复位控制 */ mDelaymS( 5 ); /* 延时至少5毫秒 */ Write374Byte( REG_SYS_CTRL, 0 ); /* 结束复位 */ mDelaymS( 5 ); /* 延时至少5毫秒 */ }


非常感谢!但换成这个复位后还是不行,估计是没有CH374Init或者CH374LibInit?可是我到处都没找到这个函数的具体内容呢,能提供一下么,再次非常非常感谢啊!


Write374Byte( REG_SYS_CTRL, Read374Byte(REG_SYS_CTRL)|0x08 ); //芯片复位 delayms( 1 ); Write374Byte( REG_SYS_CTRL, Read374Byte(REG_SYS_CTRL)&0xf7 ); //完成芯片复位 delayms( 200 ); Init374Host( ); // 初始化USB主机

后面在进行操作即可。


CH374Init和CH374_PORT_INIT( )不一样么,就是初始化SPI之类的,哎,明明上电第一次执行都没有问题的哎,CH374Reset( )后不是回到上电最开始的状态么?


谢谢楼上各位了,8过还是没有解决哎,关键是如果不进行具体的通信多少次复位初始化都没问题,一旦有过和从设备的通信后374再复位初始化就不对了,会不会是硬件的问题呀?


你的现象,不像是复位的问题,而是复位完成之后初始化Init374Host( ),你是怎样写的?通讯的话只会改变一些寄存器的状态。你可以复位之后看一下读写寄存器的函数有无问题。


读写寄存器都正常,后面检测USB设备,获取描述符都没错,就是不能通信。 void Init374Host( void ) // 初始化USB主机 { 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 ); // 清所有中断标志 aa=Read374Byte(REG_INTER_FLAG); Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER | BIT_IE_DEV_DETECT ); // 允许传输完成中断和USB设备检测中断 Write374Byte( REG_SYS_CTRL, BIT_CTRL_OE_POLAR ); // 对于CH374T或者UEN引脚悬空的CH374S必须置BIT_CTRL_OE_POLAR为1 HostSetBusFree( ); // USB总线空闲 }


终于查出来为什么了!!!! mSaveDevEndpTog和mSaveDevEndpTog1这两个同步标志位的问题,因为在数据发送和接收后会发生值的翻转,如果复位后这两个值还是翻转后的值,在接收时会发生不同步则丢弃后的错误,所以要在复位后将这两个标志位置0。困扰了一天多,还是得一个函数一个寄存器慢慢查啊。谢谢帮忙解答的各位了!


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