[单片机芯片] 【CH32X035评估板测评】usb输入字符

[复制链接]
5331|8
 楼主| 新曲难觅旧知音 发表于 2023-9-10 19:23 | 显示全部楼层 |阅读模式
本帖最后由 新曲难觅旧知音 于 2023-9-10 19:24 编辑

一.新建工程
在官方例程里提供了CompositeKM的例程,解压用MounRiver Studio打开后,直接编译会报错
Snipaste_2023-09-10_18-41-32.png
原因是例程的工程文件链接了部分公共文件,会找不到文件路径。
解决方法就是新建一个空工程,然后把例程user里的文件复制进新建工程的user目录下。
这样再编译就不会报错了。
2.png
二.usb配置相关描述符
设备描述符
  1. const UINT8  MyDevDescr[] =
  2. {
  3.         0x12,              //设备描述符长度,18字节
  4.         0x01,              //描述符类型,0x01为设备描述符
  5.         0x10, 0x01,        //本设备所使用USB版本协议,因为是小端结构,所以低字节在前,即USB1.1版本为0x10,0x01,USB2.0为0x00,0x02
  6.         0x00,              //类代码,此处不在设备描述符中定义设备类,而在接口描述符中定义设备类。对于大多数标准的USB设备类,该字段通常设置为0,而在接口描述符中的bInterfaceClass中指定接口所实现的功能
  7.         0x00,              //子类代码,当类代码bDeviceClass为0时,下面的子类代码bDeviceSubClass也必须为0。
  8.         0x00,              //设备所使用的协议,协议代码由USB协会规定。当该字段为0时,表示设备不使用类所定义的协议。
  9.         DevEP0SIZE,        //端点0的最大包长,可以取值8、16、32、64,此处为64字节
  10.         0x86, 0x1A,        //厂商ID
  11.         0xe1, 0xe6,        //产品设备ID
  12.         0x00, 0x01,        //设备版本号
  13.         0x01,              //描述厂商的字符串索引值。当该值为0时,表示没有厂商字符串
  14.         0x02,              //描述产品的字符串索引值。当该值为0时,表示没有产品字符串
  15.         0x03,              //描述设备的序列号字符串索引值。当该值为0时,表示没有序列号字符串
  16.         0x01,              //可能的配置数,通常为1
  17. };

配置描述符
  1. const UINT8  MyCfgDescr[] =
  2. {
  3.         //配置描述符
  4.         0x09,              //配置描述符长度,标准USB配置描述符长度为9字节
  5.         0x02,              //描述符类型,配置描述符为0x02
  6.         0x3b, 0x00,        //配置描述符集合总长度,59字节
  7.         0x02,              //该配置所支持的接口数,2个接口
  8.         0x01,              //表示该配置的值
  9.         0x00,              //描述该配置的字符串的索引值,0x00表示没有字符串
  10.         0xA0,              //描述设备的一些属性,如供电方式和唤醒等,0xA0表示设备总线供电且支持远程唤醒
  11.         0x32,              //设备需要从总线获取的最大电流量,0x32表示最大电流100ma

  12.         //键盘
  13.         //接口描述符,接口描述符不能单独返回,必须附着在配置描述符后一并返回
  14.         0x09,              //接口描述符长度,标准的USB接口描述符长度为9字节
  15.         0x04,              //描述符类型,接口描述符为0x04
  16.         0x00,              //该接口的编号,从0开始,此处为0x00
  17.         0x00,              //该接口的备用编号,通常设置为0
  18.         0x01,              //该接口所使用的端点数,0x01表示使用1个端点。如果该字段为0,则表示没有非0端点,只使用默认的控制端点
  19.         0x03,              //该接口所使用的类,0x03为HID类
  20.         0x01,              //该接口所使用的子类
  21.         0x01,              //该接口所使用的协议
  22.         0x00,              //该接口的字符串的索引值,0x00表示没有字符串

  23.         //HID类描述符,它是一个类描述符,应该跟在接口描述符后面
  24.         0x09,              //该描述符长度,它的大小与该描述符中下级描述符的个数有关。例如只有一个下级描述符时,总长度为9
  25.         0x21,              //描述符类型,HID描述符为0x21
  26.         0x10,0x01,         //HID协议的版本号,这里参看的HID协议是USB HID1.1协议,因此这里为0x0110
  27.         0x00,              //国家代码,是设备所适用的国家。通常我们的键盘是美式键盘,代码为33,即0x21,但此处设置为0x00
  28.         0x01,              //下级描述符的数量,该值至少为1,即至少要有一个报告描述符。下级描述符可以是报告描述符或物理描述符
  29.         0x22,              //下级描述符的类型,报告描述符的编号为0x22,物理描述符编号为0x23
  30.         sizeof(KeyRepDesc)&0xFF, 0x00, //下级描述符的长度

  31.         //端点描述符,端点描述符不能单独返回,必须附着在配置描述符后一并返回
  32.         0x07,              //端点描述符长度,标准的USB端点描述符长度为7字节
  33.         0x05,              //描述符类型,端点描述符为0x05
  34.         0x81,              //该端点的地址,0x81表示端点1作为输入,最高位D7为该端点的传输方向,1为输入,0为输出。D3-D0为端点号,可设置为0-7,D6-4保留,设为0.
  35.         //关于端点属性,最低两位D1-0表示该端点的传输类型,0为控制传输,1为等时传输,2为批量传输,3为中断传输。
  36.         0x03,              //该端点的属性,此处为中断传输方式
  37.         DevEP0SIZE, 0x00,  //该端点支持的最大包长度,此处设置为64字节
  38.         0x0a,              //端点的查询时间。对于中断端点,表示查询的帧间隔数

  39.         //鼠标
  40.         //接口描述符
  41.         0x09,              //接口描述符长度,9字节
  42.         0x04,              //描述符类型,接口描述符为0x04
  43.         0x01,              //该接口的编号,从0开始,此处为0x01
  44.         0x00,              //该接口的备用编号
  45.         0x01,              //该接口所使用的端点数,0x01表示使用1个端点
  46.         0x03,              //该接口所使用的类,0x03为HID类
  47.         0x01,              //该接口所使用的子类
  48.         0x02,              //该接口所使用的协议
  49.         0x00,              //该接口的字符串的索引值,0x00表示没有字符串

  50.         //HID类描述符
  51.         0x09,              //该描述符长度,它的大小与该描述符中下级描述符的个数有关。例如只有一个下级描述符时,总长度为9
  52.         0x21,              //描述符类型,HID描述符为0x21
  53.         0x10,0x01,         //HID协议的版本号,这里参看的HID协议是USB HID1.1协议,因此这里为0x0110
  54.         0x00,              //国家代码,是设备所适用的国家。通常我们的键盘是美式键盘,代码为33,即0x21,但此处设置为0x00
  55.         0x01,              //下级描述符的数量,该值至少为1,即至少要有一个报告描述符。下级描述符可以是报告描述符或物理描述符
  56.         0x22,              //下级描述符的类型,报告描述符的编号为0x22,物理描述符编号为0x23
  57.         sizeof(MouseRepDesc)&0xFF,0x00,  //下级描述符的长度

  58.         //端点描述符
  59.         0x07,              //端点描述符长度,7字节
  60.         0x05,              //描述符类型,端点描述符为0x05
  61.         0x82,              //该端点的地址,0x82表示端点2作为输入
  62.         0x03,              //该端点的属性
  63.         DevEP0SIZE, 0x00,  //该端点支持的最大包长度,64字节
  64.         0x0a,              //端点的查询时间
  65. };


这些鼠标和键盘的配置描述符可以直接用HID Descriptor Tool生成 3.png
三.程序现象
下载完成后,将串口三的TX端,也就是PA3接到chlink的RX端,C to C线连接开发板跟电脑
打开串口助手
4.png
波特率设置与程序相同
用杜邦线短接一下PB13引脚
5.png
可以看到串口日志打印出了a被按下,同时文本框也输出a

forgot 发表于 2023-9-14 08:48 | 显示全部楼层
赞一下,非常好的测评,我的板子也收到了,先来学习一下
tpgf 发表于 2023-10-10 19:26 | 显示全部楼层
为什么我们常使用的u盘容易损坏呢
nawu 发表于 2023-10-10 19:45 | 显示全部楼层
我们在做硬件的时候是不是需要对usb 的接口进行电气隔离呢
aoyi 发表于 2023-10-10 20:06 | 显示全部楼层
nawu 发表于 2023-10-10 19:45
我们在做硬件的时候是不是需要对usb 的接口进行电气隔离呢

最好还是使用一下 这样能延长usb的使用寿命
zljiu 发表于 2023-10-11 10:47 | 显示全部楼层
什么样的文件是公共文件呢 我们如何进行区分呢
gwsan 发表于 2023-10-11 11:08 | 显示全部楼层
usb有哪些描述符是必须要进行配置的呢
tfqi 发表于 2023-10-11 11:31 | 显示全部楼层
如果所有的头文件放在一个地方 所有工程的头文件都是用绝对路径这样是不是节省空间呢
linhuikui 发表于 2024-3-19 16:16 | 显示全部楼层
我也用官方例子,发送一个字符会一直发
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

144

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部