问题描述:按照CH375的控制打印机历程,进行CH376(使用的是CH376芯片)初始化,连接一个USB设备。进入枚举阶段,手动模拟事务处理,获取设备描述符,但始终返回0长度,且状态阶段的发送失败。
定义:unsigned char buffer[64]; 初始化函数中的init_print()里面就直接调用cmd1();
unsigned char cmd1(void) { unsigned char len,total_len = 0,status = 0xff; unsigned char *p; buffer[0]=0x80; buffer[1]=0x06; buffer[2]=0x00; buffer[3]=0x01; buffer[4]=0x00; buffer[5]=0x00; buffer[6]=0x12; buffer[7]=0x00;/*设备描述符*/ wr_usb_data( 8, buffer ); /* SETUP数据总是8字节 */ //toggle_send(0); if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_SETUP, 0x00 )==USB_INT_SUCCESS ) { /* SETUP阶段DATA0操作成功 */ //p = buffer; //toggle_recv(1); if( (status = issue_token_X( ( 0 << 4 ) | DEF_USB_PID_IN, 0x80 ))==USB_INT_SUCCESS ) { /* DATA阶段DATA1接收操作成功 */ len = rd_usb_data( buffer ); /* 读出接收到的数据 */ wr_usb_data( 0, buffer ); /* 发送0长度的数据DATA1说明控制传输成功 */ //toggle_send(1); if ( issue_token_X( ( 0 << 4 ) | DEF_USB_PID_OUT, 0x40 )==USB_INT_SUCCESS ) return( buffer[0] ); } } return 0xff;/*错误返回*/ }
void test_barcodescanner(void) { unsigned char xdata data_to_send[200]; /* 缓冲区 */ unsigned char str_to_print[]="OK, support text print\n"; unsigned char s; mDelaymS( 200 ); set_usb_mode( 6 ); /* 设置USB主机模式 */
s = CH376DiskConnect(); if(s != USB_INT_SUCCESS) return; /* 等待USB打印机连接上来 */
/* 如果设备端是CH341转打印口或者是CH37X,那么以下步骤是可选的,如果是其它USB芯片,那么可能需要执行以下步骤 */ #define USB_RESET_FIRST 1 /* USB规范中未要求在USB设备插入后必须复位该设备,但是计算机的WINDOWS总是这样做, 所以有些USB设备也要求在插入后必须先复位才能工作 */ #ifdef USB_RESET_FIRST set_usb_mode( 7 ); /* 复位USB设备,CH375向USB信号线的D+和D-输出低电平 */ /* 如果单片机对CH375的INT#引脚采用中断方式而不是查询方式,那么应该在复制USB设备期间禁止CH375中断,在USB设备 复位完成后清除CH375中断标志再允许中断 */ mDelaymS( 10 ); /* 复位时间不少于1mS,建议为10mS */ set_usb_mode( 6 ); /* 结束复位 */ mDelaymS( 100 ); while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待复位之后的设备端再次连接上来 */ #endif
mDelaymS( 200 ); /* 有些USB设备要等待数百毫秒才能正常工作 */ if ( init_print()!=USB_INT_SUCCESS ) ;//while(1); // 错误 // mDelaymS(200);//延时测试用 mDelaymS(200); mDelaymS(200); mDelaymS(200); mDelaymS(200); }