打印

usb设备描述符错误,急!急!急!

[复制链接]
14644|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
epsmc|  楼主 | 2010-9-2 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB, SCR, des, ev, ST
各位大虾,我是USB开发菜鸟,在用CH375做host控制打印机时,获取打印机的设备描述符不正确,请帮助查找错误原因。
1、现象描述
用BUS HOUND捕获到的设备描述符为:
23.0  CTL    80 06 00 01  00 00 12 00  GET DESCRIPTOR           9.1.0        
23.0  DI     12 01 10 01   00 00 00 08  b8 04 05 00  00 01 01 02  03 01
但用我的CH375电路获取的描述符始终为:
12 01 00 00   00 00 00 00  00 00 00 00  00 00 00 00  00 00   
单片机使用MEGA169,电路使用 CHECK_EXIST命令测试通过  

2、程序相关部分如下:
void main()
{
   //相关初始化
   set_usb_mode( 6 );  // 设置USB主机模式
   while ( wait_interrupt()!=USB_INT_CONNECT );  // 等待USB打印机连接上来
  if ( init_print()!=USB_INT_SUCCESS )
  while(1);  // 错误
while ( 1 )
{
        wdt_reset();
}
}


// 初始化USB打印机,完成打印机枚举
unsigned char init_print()
{  
    //#define p_dev_descr  ((PUSB_DEV_DESCR)buffer)
    //#define p_cfg_descr  ((PUSB_CFG_DESCR_LONG)buffer)
    PUSB_DEV_DESCR p_dev_descr;
    PUSB_CFG_DESCR_LONG p_cfg_descr;
    p_dev_descr=(PUSB_DEV_DESCR)buffer;
    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地址

      return(status);
}

// 数据读写, 单片机读写CH375芯片中的数据缓冲区
unsigned char rd_usb_data( unsigned char *buf )
{  // 从CH37X读出数据块
unsigned char i, len;
CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  // 从CH375的端点缓冲区读取接收到的数据
len=CH375_RD_DAT_PORT();  // 后续数据长度
    *buf=len;
    buf++;
for ( i=0; i!=len; i++ )
    {
      *buf=CH375_RD_DAT_PORT();
      buf++;
    }
    return len;
}

相关帖子

沙发
epsmc|  楼主 | 2010-9-2 12:02 | 只看该作者
// 初始化USB打印机,完成打印机枚举
unsigned char init_print()
{  
    //#define p_dev_descr  ((PUSB_DEV_DESCR)buffer)
    //#define p_cfg_descr  ((PUSB_CFG_DESCR_LONG)buffer)
    PUSB_DEV_DESCR p_dev_descr;
    PUSB_CFG_DESCR_LONG p_cfg_descr;
    p_dev_descr=(PUSB_DEV_DESCR)buffer;
    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地址
  }
      return(status);
}

使用特权

评论回复
板凳
xfcjava2| | 2010-9-2 16:30 | 只看该作者
你的初始化usb打印机函数unsigned char init_print()中,缺少在设置完打印机的usb地址后重新获取usb打印机的全部配置描述符,就直接返回了,所以就无**常工作!!!
    .....
    ......
   status=set_addr(3);  // 设置打印机的USB地址
  if ( status==USB_INT_SUCCESS )
    {
         status=get_full_descr(); //获取设备的全部配置描述符       
         if ( status==USB_INT_SUCCESS )
          {
             ......
           }
    }

使用特权

评论回复
地板
epsmc|  楼主 | 2010-9-2 18:16 | 只看该作者
usb地址后重新获取usb打印机的全部配置描述符,就直接返回了,所以就无**常工作!!!
为了重点突出,我把那部分程序没有拷贝过来
问题是在获取设备描述符时就出错。
获取配置描述符同样错误:只有第一个描述符长度为0x20,其它都是0x00
0x20,0x00,0x00,x00......................

使用特权

评论回复
5
xfcjava2| | 2010-9-2 18:42 | 只看该作者
不知你的设备获取描述符的函数是怎么写的。下边的是我测试好用的部分代码,请你参考:

/****************************************************************************       
* 功    能:从设备端获取描述符
*---------------------------------------------------------------------------*
* 入口参数:type:        描述符类型
* 出口参数:nil
****************************************************************************/
INT8U get_descr( INT8U type )
{
        CH375_WR_CMD_PORT( CMD_GET_DESCR );
        CH375_WR_DAT_PORT( type );   //描述符类型, 只支持1(设备)或者2(配置)
        return( wait_interrupt() );  //等待CH375操作完成
}

/****************************************************************************       
* 功    能:向CH375的命令端口写入命令
*---------------------------------------------------------------------------*
* 说    明:周期不小于4uS,如果单片机较快则延时
* 入口参数:cmd: 命令
* 出口参数:nil
****************************************************************************/
void CH375_WR_CMD_PORT( INT8U cmd )
{  
        delay2us();

        CH375_ENABLE;

        CH375_CMD_PORT=cmd;

        delay2us();

        CH375_DISABLE;

}

/****************************************************************************       
* 功    能:向CH375的数据端口写入数据
*---------------------------------------------------------------------------*
* 说    明:周期不小于1.5uS,如果单片机较快则延时
* 入口参数:dat: 数据
* 出口参数:nil
****************************************************************************/

void CH375_WR_DAT_PORT( INT8U dat )
{
  CH375_ENABLE;

        CH375_DAT_PORT=dat;       

        delay1us();  

        CH375_DISABLE;

}

使用特权

评论回复
6
xfcjava2| | 2010-9-2 18:44 | 只看该作者
其中的定义如下,供你参考:
#define  CH375_ENABLE           CH375_CS=0
#define  CH375_DISABLE         CH375_CS=1

再有问题,请QQ联系我。  我的QQ:390350125

使用特权

评论回复
7
epsmc|  楼主 | 2010-9-2 19:08 | 只看该作者
谢谢,我先用你的调试看

使用特权

评论回复
8
lirunze| | 2010-9-4 09:48 | 只看该作者
路过看一下

使用特权

评论回复
9
share1999| | 2010-9-4 10:02 | 只看该作者
获取设备描述符时,会返回端点的最大包长度,考虑过么

使用特权

评论回复
10
l0p0c| | 2010-9-6 16:13 | 只看该作者
过来看下……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

74

帖子

1

粉丝