老是无法正常查询打印机端口状态。在INIT_PRINT函数中调用SET_COFIG函数中已复位TOG_RECV为0,在GET_PORT_STATUS函数中,toggle_recv(TOG_RECV),然后调用ISSUE_TOKEN,标志去反,读出接受的数据。总是无法返回长度为1的正确字节
打印机初始化是否正常通过?在查询端口状态函数中,在数据阶段的同步标志要从DATA1开始, toggle_recv(1)
初始化是通过的,但是SET_COFIG函数中已复位TOG_RECV为0,那么GET_PORT_STATUS函数中,toggle_recv(TOG_RECV),就应该相当于是是toggle_recv(0)啊。
控制传输的事务中,数据阶段的同步标志是从DATA1开始的.也就是GET_PORT_STATUS函数中,必须是toggle_recv(1)
SET_COFIG函数中并是是复位了TOG_RECV,TOG_RECV是数据传输中中用的,并不是控制传输中用的,标志不是一回事参考程序中并没有调用GET_PORT_STATUS函数.你现在要用GET_PORT_STATUS函数,一定要按照USB协议来处理,如果您对USB协议不怎么了解,建议您不要修改这些标志位,这都符合USB协议的,如果修改了很可能导致是数据不对.
我有点糊涂了:参考程序中有调用GET_PORT_STATUS函数的, 函数开始判断ENDP_IN_ADDR是否为0,我的程序前面初始化后ENDP_IN_ADDR并不为0,所以执行 toggle_recv(TOG_RECV) ;疑问:此时TOG_RECV在set_config中已经复位为0了吧? IF(ISSUE_TOKEN((ENDP_IN_ADDR<<4)|DEF_USB_PID_IN)==USB_INT_SUCCES) { TOG_RECV=~TOG_RECV ;此时取反 RD_USB_DATA(BUFFER) RETURN(CHBUFFER[0]) 这段程序因属于数据传输而非控制传输吧?执行toggle_recv(TOG_RECV)时TOG_RECV在set_config中已经复位为0了吧?
哦,好象这个程序不对吧?不知道您是从那里得到这个程序的. unsigned char get_port_status( ) { /* 查询打印机端口状态,返回状态码,如果为0FFH则说明操作失败 */ /* 返回状态码中: 位5(Paper Empty)为1说明无纸, 位4(Select)为1说明打印机联机, 位3(Not Error)为0说明打印机出错 */ toggle_send( 0 ); /* 下面通过控制传输获取打印机的状态, SETUP阶段为DATA0 */ buffer[0]=0xA1; buffer[1]=1; buffer[2]=buffer[3]=buffer[4]=buffer[5]=0; buffer[6]=1; buffer[7]=0; /* SETUP数据,GET_PORT_STATUS */ wr_usb_data( 8, buffer ); /* SETUP数据总是8字节 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) { /* SETUP阶段操作成功 */ toggle_recv( 1 ); /* DATA阶段,准备接收DATA1 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) { /* DATA阶段操作成功 */ rd_usb_data( buffer ); /* 读出接收到的数据,通常只有1个字节 */ toggle_send( 1 ); /* STATUS阶段为DATA1 */ wr_usb_data( 0, buffer ); /* 发送0长度的数据说明控制传输成功 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_OUT )==USB_INT_SUCCESS ) return( buffer[0] ); /* 返回状态码 */ } } return( 0xFF ); /* 返回操作失败 */ } 这个才是函数的原型.您到在线下载里搜索CH375HST.ZIP,里面有USBPRINT的文件夹,请参考这个程序.
没有开始的判断ENDP_IN_ADDR是否为0吗?我是在人民邮电出版社的《USB开发实例详解》上看见的。 和CH375HST.ZIP不一样?
还有个问题: CH375HST.ZIP里面有get_port_status函数(调用issue_token函数),还有get_port_status_X函数(调用issue_token_X函数,并声明适用于CH375A)。 问题:那么我用的是CH375B芯片,具体改调用哪个函数
您看到的资料就是从我们网站上拷贝的程序,应该是一样的. 不需要判断endp_in_addr是否0; 在init_print函数中初始化了endp_out_addr=endp_in_addr=0;
谢谢,唉我再试试吧