弱弱地问一下,因为CH374的INT#是低电平有效,但相应的单片机输入引脚空闲时就是低电平,怎么设置让374INT#输出是高电平呢?谢谢!
我们CH374芯片内置上拉电阻,所以低电平有效,不能设置成高电平有效。你可以不连接中断请求输出引INT#,单片机程序可以通过查询中断标志寄存器代替。
哦,那我通过查询中断寄存器了,但是还是有问题,就是我获取设备描述符时,SETUP阶段就不能成功。总是读到的USB状态寄存器为8C,这样,设备应答状态是1100,即设备应答错误或是超时无应答。。。这样可能的原因有哪些呢?谢谢!
在函数UINT8 HostTransact374( UINT8 endp_addr, UINT8 pid, BOOL tog )里,pid明明是等于DEF_USB_PID_SETUP(0x0D)的,为什么在 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 ); // 不是超时/出错,意外应答 break; case DEF_USB_PID_IN: if ( M_IS_HOST_IN_DATA( s ) ) { // DEF_USB_PID_DATA0 or DEF_USB_PID_DATA1 if ( s & BIT_STAT_TOG_MATCH ) 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 ); // 不是超时/出错,意外应答 break; default: return( ERR_USB_UNKNOWN ); // 不可能的情况 break; 会执行到case DEF_USB_PID_IN:,从而返回0x20呢,谢谢
上面是我单步执行注意到的,还有就是case DEF_USB_PID_SETUP:里什么都没有呀 ,必然会返回0x20呀。
Setup阶段处理在HostCtrlTransfer374()函数里面,你仔细看一下程序就知道了,你在执行到case DEF_USB_PID_IN:过不了设备没返回给主机数据,你CH374操作什么设备?首先保证你硬件连接没问题,Init374Host( )配置正确。
CH374做主与一个记录仪通信,硬件应该没问题呀,其实我程序还是有点不明白,是这样的,在SETUP阶段,是您说的那个函数HostCtrlTransfer374(),其中几句如下: Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Read374Block( RAM_HOST_TRAN,8,bbb); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP阶段,200mS超时 if ( s == USB_INT_SUCCESS ) { 。。。。。。 然后就是执行函数WaitHostTransact374(),此时的PID是DEF_USB_PID_SETUP,在该函数里会执行HostTransact374()函数,而函数HostCtrlTransfer374()里的s(操作状态代码)就是函数HostTransact374()的返回值,像我第三楼所说的,在这函数里的PID仍然是DEF_USB_PID_SETUP,但是case DEF_USB_PID_SETUP:里什么都没有,必然会返回0x20呀,怎么会有USB_INT_SUCCESS返回呢?万分感谢您的不吝赐教~
Init374Host( )配置是正确的呀(我的UEN是悬空的) void Init374Host( void ) // 初始化USB主机 { Write374Byte( REG_USB_SETUP, 0x00 );/*REG_USB_SETUP: USB配置 */ SetHostUsbAddr( 0x00 ); Write374Byte( REG_USB_H_CTRL, 0x00 ); Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); // 清所有中断标志 // Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER ); // 允许传输完成中断,因为本程序使用查询方式检测USB设备插拔,所以无需USB设备检测中断 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总线空闲 }
DEF_USB_PID_SETUP相当于case DEF_USB_PID_OUT,只有返回ACK也就是执行if ( r == DEF_USB_PID_ACK ) return( USB_INT_SUCCESS );才会有USB_INT_SUCCESS返回。
哦~是这样的,没注意break。。。囧。。。谢谢