14154|6

1305

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【新版CH554评测】--5.2、USB host例程学习及验证--代码 [复制链接]

本帖最后由 yang_alex 于 2018-5-19 00:44 编辑

      沁恒针对USB HOST应用提供的代码文件如下两个:

1、USBHOST.C:  CH554 USB主机控制传输函数定义,主要是设备枚举部分,控制传输部分
2、USBHostHUB_KM.C: USB主机应用例子,初始化和枚举USB端口连接的设备,支持一级外部HUB,可以操作USB键鼠和HUB,打印机,包含HID类命令处理

      首先自己建立工程项目文件(过程参考我前面的评测帖子),编译烧录。嗯,一切正常。      
      先用一个无线鼠标的接收器测试,结果发现,评估板先上电后,结果如下图。
      
      再把无线鼠标的接收器接入CH554评估板的USB母座,一切都正常,结果如下图。
      
      在评估板上电状态下,把无线鼠标的接收器拔出来,会在调试串口输出“USB dev out”
      

      但如果先把无线鼠标的接收器接入CH554评估板的USB母座。结果发现,评估板还没有上电时,D1电源指示灯就亮了。再评估板上电,结果串口没有任何输出。即使复位或重新上电串口都没有任何输出。
      
      
      把无线鼠标的接收器拔出后,串口没有任何输出。但评估板复位或重新上电后,串口输出如下(与评估板不插无线鼠标的接收器上电一样)。
      
      试着插入一个小容量USB盘测试,评估板上电后,把小容量USB盘接入CH554评估板的USB母座,识别正常。结果如下图。
      
      换个USB键盘测试,评估板上电后,把USB键盘接入CH554评估板的USB母座,结果如下图。
      
     
      换个USB游戏遥控器测试,评估板上电后,把USB游戏遥控器接入CH554评估板的USB母座,结果如下图。
      

      分析串口打印出来的信息,最后在USBHOST.H中发现返回错误状态码:
  1. // 各子程序返回状态码
  2. #define ERR_SUCCESS         0x00    // 操作成功
  3. #define ERR_USB_CONNECT     0x15    /* 检测到USB设备连接事件,已经连接 */
  4. #define ERR_USB_DISCON      0x16    /* 检测到USB设备断开事件,已经断开 */
  5. #define ERR_USB_BUF_OVER    0x17    /* USB传输的数据有误或者数据太多缓冲区溢出 */
  6. #define ERR_USB_DISK_ERR    0x1F    /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */
  7. #define ERR_USB_TRANSFER    0x20    /* NAK/STALL等更多错误码在0x20~0x2F */
  8. #define ERR_USB_UNSUPPORT   0xFB    /*不支持的USB设备*/
  9. #define ERR_USB_UNKNOWN     0xFE    /*设备操作出错*/
复制代码

其中
#define ERR_USB_BUF_OVER    0x17    /* USB传输的数据有误或者数据太多缓冲区溢出 */
#define ERR_USB_TRANSFER    0x20    /* NAK/STALL等更多错误码在0x20~0x2F */


可以得知评估板在获得设备描述,初始化设备的过程中出现了问题,调试串口输出信息给出错误标号17。通过跟踪调试串口输出信息(多次放置打印信息,确定错误位置),问题定位到CtrlGetDeviceDescr()函数,中下面这一句:
    UsbDevEndp0Size = ( (PXUSB_DEV_DESCR)TxBuffer ) -> bMaxPacketSize0;          // 端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndp0Size再继续     
  1. /*******************************************************************************
  2. * Function Name  : CtrlGetDeviceDescr
  3. * Description    : 获取设备描述符,返回在TxBuffer中
  4. * Input          : None
  5. * Output         : None
  6. * Return         : ERR_USB_BUF_OVER 描述符长度错误
  7.                    ERR_SUCCESS      成功
  8.                    其他
  9. *******************************************************************************/
  10. UINT8   CtrlGetDeviceDescr( void )  
  11. {
  12.     UINT8   s;
  13.     UINT8   len;
  14.     UsbDevEndp0Size = DEFAULT_ENDP0_SIZE;
  15.     CopySetupReqPkg( SetupGetDevDescr );
  16.     s = HostCtrlTransfer( TxBuffer, (PUINT8)&len );                                      // 执行控制传输
  17.     if ( s != ERR_SUCCESS )
  18.     {
  19.         return( s );
  20.     }
  21.                
  22. #if DE_PRINTF               
  23.                 printf( "CtrlGetConfigDescr3\n" );
  24. #endif                        
  25.                
  26.                
  27.     UsbDevEndp0Size = ( (PXUSB_DEV_DESCR)TxBuffer ) -> bMaxPacketSize0;          // 端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndp0Size再继续
  28.     if ( len < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL )
  29.     {
  30.         return( ERR_USB_BUF_OVER );                                              // 描述符长度错误
  31.     }
  32. #if DE_PRINTF               
  33.                 printf( "CtrlGetConfigDescr4\n" );
  34. #endif                                
  35.                
  36.                
  37.     return( ERR_SUCCESS );
  38. }
复制代码



可以看出,沁恒的代码做了简化,不是按USB规范处理。所以有些没想到的情况下就出错了。
正确的应该是像上篇帖子提到的:注意(6)(7)(8)步骤,主机先通过地址0获取部分从设备的设备描述符,获取最大数据包长度 ,然后复位总线,通知从设备切换通讯地址,接下来使用新地址获取从设备的完整的设备描述符。

具体的代码请沁恒的技术支持帮忙改改吧。





此内容由EEWORLD论坛网友yang_alex原创,如需转载或用于商业用途需征得作者同意并注明出处
分析串口打印出来的信息,最后在USBHOST.H中发现返回错误状态码:






此帖出自单片机论坛

最新回复

设备描述符固定18字节,你说的规范也不是标准规范,正常PC也会取固定数据。真正有用的是取配置描述符,先获取长度,然后取完整的,你看看这个函数就知道了,所以只能说你看的很细但是不够细致。 先插不识别的问题,如果完全不打印,说明很有可能是你的设备不太规范,上电时D+ 上被检测到高电平进入BOOT了。 例子毕竟是例子,不可能在例子里面识别所有的设备,但是枚举的问题应该是可以解决的。 先插如果只要打印开始信息,检测不到设备连接,可以加另外一种检测方法,检测D+ 或者D-有没有高电平,说明设备是否接入。  详情 回复 发表于 2018-5-29 09:54
点赞 关注(1)
 

回复
举报

1305

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
@沁恒USB单片机   @SuiBianLiuLiu 请帮忙看看。谢谢!

另外沁恒USB分析仪能否查看单片机做主机和从机(比如USB鼠标)的通讯?PC做主机和从机的通讯实际上有许多软件可以实现监控,但单片机做主机就没办法了,也许这就是沁恒USB分析仪和网络分析仪的价值所在吧。
此帖出自单片机论坛
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
本帖最后由 yang_alex 于 2018-5-18 23:31 编辑

另外还有个问题是:我的USB无线鼠标的接收器好像并没有被识别成鼠标设备或者HID设备,例子程序中后面的的代码也没法执行。
————————————
这个问题解决了,USB无线鼠标的接收器被识别成复合设备。但是数据还是有问题。感觉和帖子里的问题是同一个。

此帖出自单片机论坛
 
 
 

回复

305

帖子

0

TA的资源

一粒金砂(高级)

4
 
本帖最后由 沁恒USB单片机 于 2018-5-29 09:56 编辑

1、提供的那个例子是操作键鼠的,其他的设备需要针对性调试的。包括如复合设备、手柄等等都是需要针对性调试的。如需协助可以直接联系沁恒的技术支持025-89692393。
2、沁恒的USB分析仪可以获取USB主机和设备之间的USB通讯数据,并不限定主机或设备是何种设备,不管是windows,linux,mac还是单片机都可以。3、
     上图这个,P1和P2两个USB口的VCC和GND是连通的,所以P1插上USB后P2口也会有电压。
此帖出自单片机论坛

点评

可我把鼠标或键盘接入时,都会出错。所以,目前的代码还是不够健壮。  详情 回复 发表于 2018-5-29 09:54
 
个人签名单价1元含税的USB和Touchkey单片机CH551G已大批量出货,试样QQ:1258305301
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

5
 
沁恒USB单片机 发表于 2018-5-29 09:17
1、提供的那个例子是操作键鼠的,其他的设备需要针对性调试的。包括如复合设备、手柄等等都是需要针对性调 ...

可我把鼠标或键盘接入时,都会出错。所以,目前的代码还是不够健壮。
此帖出自单片机论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(中级)

6
 
设备描述符固定18字节,你说的规范也不是标准规范,正常PC也会取固定数据。真正有用的是取配置描述符,先获取长度,然后取完整的,你看看这个函数就知道了,所以只能说你看的很细但是不够细致。
先插不识别的问题,如果完全不打印,说明很有可能是你的设备不太规范,上电时D+ 上被检测到高电平进入BOOT了。
例子毕竟是例子,不可能在例子里面识别所有的设备,但是枚举的问题应该是可以解决的。
先插如果只要打印开始信息,检测不到设备连接,可以加另外一种检测方法,检测D+ 或者D-有没有高电平,说明设备是否接入。
此帖出自单片机论坛

点评

我换了有线USB鼠标和有线USB键盘插入,也会报错。跟踪分析代码,感觉是在获取设备描述符的过程中出错了。你可以多用几种有线鼠标和键盘试试这个程序。  详情 回复 发表于 2018-5-29 10:46
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

7
 
SuiBianLiuLiu 发表于 2018-5-29 09:54
设备描述符固定18字节,你说的规范也不是标准规范,正常PC也会取固定数据。真正有用的是取配置描述符,先获 ...

我换了有线USB鼠标和有线USB键盘插入,也会报错。跟踪分析代码,感觉是在获取设备描述符的过程中出错了。你可以多用几种有线鼠标和键盘试试这个程序。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表