我用的ch374作主机,操作之前用ch372作的设备能正常传送数据, 现在想要控制usb转并口线(是PL2305芯片的)写并口数据时返回0x20,发现是在函数HostTransact374()中出错的!写数据前都正常,包括get port status也能正常返回并口的PE SEL Err等信号,下面是程序出错的地方: else if ( s & BIT_IF_TRANSFER ) { // 传输完成 Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER );// 清中断标志 s = Read374Byte( REG_USB_STATUS ); // USB状态 r = s & BIT_STAT_DEV_RESP; // USB设备应答状态 switch ( pid ) { case DEF_USB_PID_SETUP: case DEF_USB_PID_OUT: if ( r == DEF_USB_PID_ACK ) return( USB_INT_SUCCESS ); else if ( r == DEF_USB_PID_STALL || r == DEF_USB_PID_NAK ) return( r | 0x20 ); else if ( ! M_IS_HOST_TIMEOUT( s ) ) return( r | 0x20 ); // 不是超时/出错,意外应答 [Emot]25[/Emot]【发现执行到此处,s=0x80,】[Emot]25[/Emot] break; case DEF_USB_PID_IN:
那你有没有按照计算机一样在初始化PL2305的时候拿我们的CH374来对其初始化,一般情况下这种芯片都有自己的厂商请求的,需要你按照计算机的初始化步骤来进行初始化.
Device Phase Data Description ------ ----- -------------------------------------------------------------- 9.1 DI 04 . 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 01 01 01 00 .... 9.0 CTL 23 01 10 00 02 00 00 00 CLEAR FEATURE 9.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.0 DI 00 01 00 00 .... 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 01 01 00 00 .... 9.0 CTL 23 03 04 00 02 00 00 00 SET FEATURE 9.1 DI 04 . 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 03 01 10 00 .... 9.0 CTL 23 01 14 00 02 00 00 00 CLEAR FEATURE 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 03 01 00 00 .... 9.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 9.0 DI 12 01 00 01 00 00 00 08 ........ 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 03 01 00 00 .... 9.0 CTL 23 03 04 00 02 00 00 00 SET FEATURE 9.1 DI 04 . 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 03 01 10 00 .... 9.0 CTL 23 01 14 00 02 00 00 00 CLEAR FEATURE 9.0 CTL 00 05 02 00 00 00 00 00 SET ADDRESS 9.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 9.0 DI 12 01 00 01 00 00 00 08 7b 06 05 23 02 02 01 02 00 01 9.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 9.0 DI 09 02 4e 00 01 01 00 a0 32 ..N.....2 17.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 17.0 DI 12 01 00 01 00 00 00 08 7b 06 05 23 02 02 01 02 00 01 17.0 CTL 80 06 00 02 00 00 09 01 GET DESCRIPTOR 17.0 DI 09 02 4e 00 01 01 00 a0 32 09 04 00 00 01 07 01 01 00 07 05 01 02 40 00 00 09 04 00 01 02 07 01 02 00 07 05 01 02 40 00 00 07 05 82 02 40 00 00 09 04 00 02 03 ff 00 ff 00 07 05 01 02 40 00 00 07 05 82 02 40 00 00 07 05 83 03 04 00 01 17.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 17.0 CTL a1 00 00 00 00 00 f1 03 GET DEVICE ID //上面是设备接入的枚举,此时PC就可以打印了, //我用374在SET CONFIG后get port status也能正常返回并口的PE SEL Err信号,之后发送打印数据 //就出现了之前说的问题了,感觉示例程序的枚举没有问题啊,怎么发送数据不行呢,同样的程序发给 //我做的372设备没有问题。 //下面是设备拔下。 9.1 DI 04 . 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 00 01 03 00 .... 9.0 CTL 23 01 11 00 02 00 00 00 CLEAR FEATURE 9.1 DI 04 . 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 00 01 01 00 .... 9.0 CTL 23 01 10 00 02 00 00 00 CLEAR FEATURE 9.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.0 DI 00 01 00 00 .... 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 00 01 00 00 .... 9.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.0 DI 00 01 00 00 .... 9.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 9.0 DI 00 01 00 00 .... //谢谢您的回复,希望能快找到问题所在。
建议您去按照PC的流程去枚举,我们示例程序只做了标准的枚举,由于设备的不同自己加入厂商命令和类命令.如果上面的流程正确的话你检查DATA0,DATA1的标志是否正确.
请问“按照PC的流程去枚举”发送命令是什么顺序呢?SET ADDRESS->GET DESCRIPTOR->GET DESCRIPTOR-> SET CONFIG,行吗?我这样枚举也不行啊。 另外 “检查DATA0,DATA1的标志” 我在楼底写过了 【发现执行到此处,s=0x80,】不知道是不是说“XX00=设备应答错误或者超时无应答;”呢?
补充一下,枚举时没有错误,在我写打印数据时才出错的, 我写的是EP1,64字节!