用CH375做主机操作USBCH372设备问题!

我用CH375做主机操作USBCH372设备,初始化设备成功,但从设备接收数据,执行USB事务时不能跳出中断!375的#INT为高!

下面是执行USB事务子程序,请问 endp_and_pid 一般设置为多少?! 大虾指点啊!

unsigned char issue_token( unsigned char endp_and_pid ) /* 执行USB事务 */ { unsigned char status;

/* 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功 */ xWriteCH375Cmd( CMD_ISSUE_TOKEN ); xWriteCH375Data( endp_and_pid ); /* 高4位目的端点号, 低4位令牌PID */

status = wait_interrupt(); /* 等待CH375操作完成 */ return( status ); }

如果是我们的372设备的话,那么endp_and_addr应该为0X82或者0X02(批量端点上传和下传)


我的程序中 #define DEF_USB_PID_IN 0x09 #define DEF_USB_PID_OUT 0x01 endp_and_pid=endp_in_addr << 4 ) | DEF_USB_PID_IN 那endp_and_pid怎么也不能为0X82或者0X02

设备初始化程序: unsigned char init_USB_device(void) { unsigned char address; unsigned char status; unsigned char length;

status = get_descr(1); /* 获取设备描述符 */ if( status == USB_INT_SUCCESS ) { length = rd_usb_data( RECV_BUFFER ); /* 将获取的描述符数据从CH375中读出到单片机的RAM缓冲区中,返回描述符长度 */ if( length<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE ); /* 意外错误:描述符长度错误或者类型错误 */

// if( p_dev_descr->bDeviceClass!=0 ) // return( UNKNOWN_USB_DEVICE ); /* 连接的USB设备不符合USB规范 */

status = set_addr(2); /* 设置USB设备的USB地址 */ if( status == USB_INT_SUCCESS ) { status = get_descr(2); /* 获取配置描述符 */ if( status == USB_INT_SUCCESS ) /* 操作成功则读出描述符并分析 */ { length = rd_usb_data( RECV_BUFFER ); /* 将获取的描述符数据从CH375中读出到单片机的RAM缓冲区中,返回描述符长度 */ // if( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) // return( UNKNOWN_USB_DEVICE ); /* 不符合USB规范 */

endp_out_addr=endp_in_addr=0; address = p_cfg_descr->endp_descr[0].bEndpointAddress; /* 第一个端点的地址 */ if( address&0x80 ) endp_in_addr = address&0x0f; /* IN端点的地址 */ else { /* OUT端点 */ endp_out_addr = address&0x0f; endp_out_size = p_cfg_descr->endp_descr[0].wMaxPacketSize; /* 数据接收端点的最大包长度 */ if( endp_out_size == 0 || endp_out_size > 64 ) endp_out_size = 64; } if( p_cfg_descr->itf_descr.bNumEndpoints>=2 ) /* 接口有两个以上的端点 */ { if( p_cfg_descr->endp_descr[1].bDescriptorType==5 ) /* 端点描述符 */ { address = p_cfg_descr->endp_descr[1].bEndpointAddress; /* 第二个端点的地址 */ if( address&0x80 ) endp_in_addr = address&0x0f; /* IN端点 */ else { /* OUT端点 */ endp_out_addr = address&0x0f; endp_out_size = p_cfg_descr->endp_descr[1].wMaxPacketSize; if( endp_out_size == 0 || endp_out_size > 64 ) endp_out_size = 64; } } } if( p_cfg_descr->itf_descr.bInterfaceProtocol==1 ) endp_in_addr=0; /* 单向接口不需要IN端点 */

if( endp_out_addr==0 ) return( UNKNOWN_USB_DEVICE ); /* 不符合USB规范 */

status = set_config( p_cfg_descr->cfg_descr.bConfigurationvalue ); /* 加载USB配置值 */ if( status == USB_INT_SUCCESS ) { /* 如果单片机在USB设备忙时并无事可做,建议设置位7为1,使CH375在收到NAK时自动重试直到操作成功或者失败 */ /* 如果希望单片机在USB设备忙时能够做其它事,那么应该设置位7为0,使CH375在收到NAK时不重试, 所以在下面的USB通讯过程中,如果USB设备正忙,issue_token等子程序将得到状态码USB_INT_RET_NAK */ xWriteCH375Cmd( CMD_SET_RETRY ); // 设置USB事务操作的重试次数 xWriteCH375Data( 0x25 ); xWriteCH375Data( 0x85 ); // 位7为1则收到NAK时无限重试, 位3~位0为超时后的重试次数

} } } }


我们不是有提供375操作372的例子程序吗?你按照那个例子就可以实现375对372的操作了。按照上面发送令牌命令的数据来说,高四位为端点号,低四位为你发送的令牌包,也就是上面定义的#define DEF_USB_PID_IN 0x09 #define DEF_USB_PID_OUT 0x01,这样才可以正常的操作,否则会出现问题的,往下面发送数据,写进去的数据就是端点号加上0X01,从设备读取数据的话就是端点号加上0X09就可以了。


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