你好,ch375评估板打印机初始化疑问

unsigned char wait_interrupt() { /* 主机端等待操作完成, 返回操作状态 */ unsigned short i;

// while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */ for ( i = 0; CH375_INT_WIRE != 0; i ++ ) { /* 如果CH375的中断引脚输出高电平则等待,通过计数防止超时 */ delay1us(); if ( i == 0xF000 ) CH375_WR_CMD_PORT( CMD_ABORT_NAK ); /* 如果超时达61mS以上则强行终止NAK重试,中断返回USB_INT_RET_NAK */ }

CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ return( CH375_RD_DAT_PORT() ); } 这个是打印机的初始化代码,我这里看不出连接的是打印机设备啊,如果换作是其他的usb设备呢?请问host是怎么识别设备的呢,新学者疑惑,谢谢。。

上面是等中断的程序,打印机初始化代码如下: unsigned char init_print() { /* 初始化USB打印机,完成打印机枚举 */ #define p_dev_descr ((PUSB_DEV_DESCR)buffer) #define p_cfg_descr ((PUSB_CFG_DESCR_LONG)buffer) unsigned char status, len, c; status=get_descr(1); /* 获取设备描述符 */ if ( status==USB_INT_SUCCESS ) { len=rd_usb_data( buffer ); /* 将获取的描述符数据从CH375中读出到单片机的RAM缓冲区中,返回描述符长度 */ if ( len<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE ); /* 意外错误:描述符长度错误或者类型错误 */ if ( p_dev_descr->bDeviceClass!=0 ) return( UNKNOWN_USB_DEVICE ); /* 连接的USB设备不是USB打印机,或者不符合USB规范 */ status=set_addr(3); /* 设置打印机的USB地址 */ if ( status==USB_INT_SUCCESS ) { status=get_descr(2); /* 获取配置描述符 */ if ( status==USB_INT_SUCCESS ) { /* 操作成功则读出描述符并分析 */ len=rd_usb_data( buffer ); /* 将获取的描述符数据从CH375中读出到单片机的RAM缓冲区中,返回描述符长度 */ if ( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) return( UNKNOWN_USB_PRINT ); /* 不是USB打印机或者不符合USB规范 */ endp_out_addr=endp_in_addr=0; c=p_cfg_descr->endp_descr[0].bEndpointAddress; /* 第一个端点的地址 */ if ( c&0x80 ) endp_in_addr=c&0x0f; /* IN端点的地址 */ else { /* OUT端点 */ endp_out_addr=c&0x0f; endp_out_size=p_cfg_descr->endp_descr[0].wMaxPacketSize; /* 数据接收端点的最大包长度 */ } if ( p_cfg_descr->itf_descr.bNumEndpoints>=2 ) { /* 接口有两个以上的端点 */ if ( p_cfg_descr->endp_descr[1].bDescriptorType==5 ) { /* 端点描述符 */ c=p_cfg_descr->endp_descr[1].bEndpointAddress; /* 第二个端点的地址 */ if ( c&0x80 ) endp_in_addr=c&0x0f; /* IN端点 */ else { /* OUT端点 */ endp_out_addr=c&0x0f; endp_out_size=p_cfg_descr->endp_descr[1].wMaxPacketSize; } } } if ( p_cfg_descr->itf_descr.bInterfaceProtocol<=1 ) endp_in_addr=0; /* 单向接口不需要IN端点 */ if ( endp_out_addr==0 ) return( UNKNOWN_USB_PRINT ); /* 不是USB打印机或者不符合USB规范 */ status=set_config( p_cfg_descr->cfg_descr.bConfigurationValue ); /* 加载USB配置值 */ if ( status==USB_INT_SUCCESS ) { CH375_WR_CMD_PORT( CMD_SET_RETRY ); /* 设置USB事务操作的重试次数 */ CH375_WR_DAT_PORT( 0x25 ); CH375_WR_DAT_PORT( 0x89 ); /* 位7为1则收到NAK时无限重试, 位3~位0为超时后的重试次数 */ /* 如果单片机在打印机忙时并无事可做,建议设置位7为1,使CH375在收到NAK时自动重试直到操作成功或者失败 */ /* 如果希望单片机在打印机忙时能够做其它事,那么应该设置位7为0,使CH375在收到NAK时不重试, 所以在下面的USB通讯过程中,如果USB打印机正忙,issue_token等子程序将得到状态码USB_INT_RET_NAK */ } } } } return(status); } 主机枚举设备的过程你可以参考USB协议.


这个我有看到,但是如果我连的不是打印机,而是其他设备,运行到那个等中断的地方就停住了,我就想知道,再枚举打印机之前,host是不是已经知道打印机的什么信息?如果我要操作其他的设备,区别在哪里呢?


不同的设备描述符是不一样的,需要主机来判断。比如说接口使用的类bInterfaceClass,HID是0x03,打印机是0x07,U盘是0x08。USB枚举的过程就是识别该设备是什么设备,获取设备信息的过程。


嗯 ,我明白了,等中断那地方还是有点不明白,例子上说等待int#变低电平,它是怎么判断的呢?假如我接的是其他的设备,int#也会变低吗?还是需要什么额外的操作,谢谢。。


你好,能回答一下我这个问题吗


如果是检测设备连接的话那么任何USB设备插入之后INT#引脚都会拉低。前提是你要初始化好我我们的芯片即可。


INT#是当检测到USB设备插拔事件以及执行完USB传输事务后,芯片将以中断方式通知单片机,INT#引脚输出低电平,直到单片机清除中断标志才恢复高电平。这跟你连接什么设备没有关系。


好的,那为什么打印机这个例子没有看到初始化的代码呢? main() { unsigned char xdata data_to_send[200]; /* 缓冲区 */ unsigned char str_to_print[]="OK, support text print\n"; unsigned char s;

unsigned char flag=100;

mDelaymS( 200 );

// while (flag--) // { // printf("start\n"); // mDelaymS( 1000 ); // } set_usb_mode( 6 ); /* 设置USB主机模式 */

while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待USB打印机连接上来 */ 这里就直接等中断了,请问是什么时候初始化呢,谢谢


我看到读写U盘的例子里面有初始化芯片的代码, i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ 而在ch375做host的打印机以及和ch372相连的例子里面却没有看到,请问是怎么一回事呢??


在主函数里while ( wait_interrupt()!=USB_INT_CONNECT ); 等待USB打印机连接上来以后执行初始化if ( init_print()!=USB_INT_SUCCESS ) while(1); 初始化函数在1楼。


我的问题是while ( wait_interrupt()!=USB_INT_CONNECT );他是怎么判断中断的呢?因为我接了一个不是打印机的usb外设,程序就在这里停住了。这个中断判断是硬件判断还是软件实现?能否讲明白一点呢?多谢。


你所说的“如果是检测设备连接的话那么任何USB设备插入之后INT#引脚都会拉低。前提是你要初始化好我我们的芯片即可。”初始化芯片是指这个i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */吗,但是打印机例子里面并没有体现出来,我就是这个问题。。


在打印机这个函数里初始化我们芯片是指设置USB工作模式使其工作在主机模式,至于那个中断只要是USB设备插入都可以检测出来,#INT拉低,软件检测。


哦 ,我明白了,多谢你啊


楼主,你好,关于这个问题我还有点疑问,是这样我试着用ch375做host连接另外一块单片机(cy7c38013)来做数据传输。我是根据贵公司提供的ch375和ch375相连的例子来改,我调试的时候程序运行到 while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待设备端连接上来 */ 这里就停住了,按照你上面所说,“那个中断只要是USB设备插入都可以检测出来,#INT拉低,软件检测。”,这里应该只要有usb设备插入都可以通过的,我不知道是什么原因呢,请求解答。


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