找回密码
 立即注册
查看: 66|回复: 6

请教一下实验板 usb键盘例程的问题

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:197
  • 最近打卡:2025-05-01 01:59:22

3

主题

5

回帖

447

积分

中级会员

积分
447
发表于 2025-4-11 17:02:23 | 显示全部楼层 |阅读模式
最近把开发板的老STC单片机换成了带USB的型号想玩玩键盘,下载了例程研究。
“开天斧实验板演示程序中:21-基于HID协议的USB键盘范例”
请教一下两个问题:


1:usb文件里的缓存数组 BYTE xdata UsbBuffer[256] 的空间值[256] 能不能修改?
端点0使用64字节收发数据;端点1使用64字节接收、16字节发送数据,数组空间该开多大合适?

2:usb_desc文件里的char code PACKET0[2]和char code PACKET1[2]这两个数组是干什么用的?

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-11 17:03:00 | 显示全部楼层
针对您提出的关于“开天斧实验板演示程序中:21-基于HID协议的USB键盘范例”的问题,以下是对两个问题的详细解答:

1. USB缓存数组 BYTE xdata UsbBuffer 的空间值能否修改?以及端点0和端点1的数组空间大小如何确定?

BYTE xdata UsbBuffer 是用于存储USB通信数据的缓存数组。其空间值可以根据实际需求进行修改,但需要遵循USB协议和硬件端点的配置要求。
端点0:通常用于控制传输(Control Transfer),默认配置为64字节的收发缓冲区。这是因为USB协议规定控制传输的最大数据包大小为64字节。因此,端点0的缓存空间应至少为64字节。
端点1:通常用于中断传输(Interrupt Transfer),在您的例程中配置为64字节接收和16字节发送。这是因为HID协议中,键盘的输入报告通常较小(例如8字节),而输出报告(如LED状态)更小(例如1字节)。因此,端点1的接收缓存可以设置为64字节,发送缓存可以设置为16字节。

建议:  
如果您不修改USB协议或硬件端点的配置,建议保持 UsbBuffer 的默认大小,即至少为64字节(端点0) + 64字节(端点1接收) + 16字节(端点1发送) = 144字节。  
如果您需要优化内存使用,可以根据实际数据传输量调整缓存大小,但需确保满足USB协议和硬件端点的要求。

2. usbdesc 文件中的 char code PACKET0 和 char code PACKET1 数组的作用是什么?

PACKET0 和 PACKET1 是用于描述USB设备配置的描述符数组。它们是USB协议中定义的数据结构,用于向主机报告设备的属性和功能。
PACKET0:通常包含设备描述符(Device Descriptor),用于描述设备的基本信息,如厂商ID(VID)、产品ID(PID)、设备版本号、设备类(Class)等。  
  示例:  
  1. c
  2.   char code PACKET0[] = {
  3.       0x12,       // 描述符长度
  4.       0x01,       // 设备描述符类型
  5.       0x0110,     // USB规范版本(BCD格式)
  6.       0x00,       // 设备类
  7.       0x00,       // 设备子类
  8.       0x00,       // 设备协议
  9.       0x40,       // 最大数据包大小(端点0)
  10.       0x1234,     // 厂商ID
  11.       0x5678,     // 产品ID
  12.       0x0100,     // 设备版本号
  13.       0x01,       // 厂商字符串索引
  14.       0x02,       // 产品字符串索引
  15.       0x00,       // 序列号字符串索引
  16.       0x01        // 配置数量
  17.   };
复制代码
PACKET1:通常包含配置描述符(Configuration Descriptor),用于描述设备的配置信息,如接口数量、端点数量、电源管理等。  
  示例:  
  1. c
  2.   char code PACKET1[] = {
  3.       0x09,       // 描述符长度
  4.       0x02,       // 配置描述符类型
  5.       0x0022,     // 配置总长度
  6.       0x01,       // 接口数量
  7.       0x01,       // 配置值
  8.       0x00,       // 配置字符串索引
  9.       0x80,       // 属性(总线供电)
  10.       0x32        // 最大电流(100mA)
  11.   };
复制代码

作用:  
这些描述符数组在设备枚举阶段被发送到主机,用于告知主机设备的属性和功能。  
主机根据这些描述符加载相应的驱动程序并配置设备。

注意事项:  
描述符的内容和格式必须符合USB协议规范,否则设备可能无法被正确识别。  
如果您修改了设备的属性或功能(如增加端点或更改设备类),需要同步更新这些描述符。

总结

1. UsbBuffer 的空间值可以根据实际需求修改,但需满足USB协议和硬件端点的要求。建议保持默认大小或根据数据传输量优化。  
2. PACKET0 和 PACKET1 是USB设备描述符数组,用于向主机报告设备的属性和功能。其内容和格式必须符合USB协议规范。

希望以上解答能帮助您更好地理解和使用USB键盘例程。如有进一步问题,欢迎继续交流!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-11 17:27:07 | 显示全部楼层
UsbBuffer可修改,如64

PACKET0和PACKET1用于实现USB协议中的一种错误检测机制,用于确保数据的完整性和同步性。
每当一个端点成功发送或接收一个数据包后,它会切换使用的数据包类型。
例如,如果上一次传输使用的是PACKET0,那么下一次传输将使用PACKET1,反之亦然。
这种切换机制帮助接收方识别出是否丢失了数据包。
如果接收方接收到的数据包类型与预期不符,它就知道可能发生了数据丢失或损坏,并可以请求重新传输。
USB有4种传输机制:控制、中断、批量、同步,其中前三种要求PACKET0和PACKET1交替,同步传输只有PACKET0。
如需要唤醒上位机,还需要PACKET2。
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-11 17:27:21 | 显示全部楼层
1:缓冲区大小一般不用改,为了节省空间可以根据业务改小点,比如你这个需求改到64.

2:常量保持不动,数据传输标识:DATA0 和 DATA1 是 USB 数据包的两种类型,属于数据包(Data Packets)类别。在 USB 全速设备中,数据包以 DATA0、DATA1 的 PID(包标识符)交替发送
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:197
  • 最近打卡:2025-05-01 01:59:22

3

主题

5

回帖

447

积分

中级会员

积分
447
发表于 2025-4-15 10:46:58 | 显示全部楼层
Debu*** 发表于 2025-4-11 17:27
UsbBuffer可修改,如64

PACKET0和PACKET1用于实现USB协议中的一种错误检测机制,用于确保数据的完整性和同 ...

感谢,输入和输出是共用UsbBuffer[128];还是分开定义数组UsbBuffer_IN[64];UsbBuffer_OUT[64]呢

点评

建议分开使用。 [attachimg]93212[/attachimg]  详情 回复 发表于 2025-4-15 11:15
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:197
  • 最近打卡:2025-05-01 01:59:22

3

主题

5

回帖

447

积分

中级会员

积分
447
发表于 2025-4-15 10:49:16 | 显示全部楼层
erci*** 发表于 2025-4-11 17:27
1:缓冲区大小一般不用改,为了节省空间可以根据业务改小点,比如你这个需求改到64.

2:常量保持不动,数 ...

感谢,我看数组放在描述符文件里还以为PACKET0和PACKET1数组内容需要修改呢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-15 11:15:08 | 显示全部楼层
STC单片*** 发表于 2025-4-15 10:46
感谢,输入和输出是共用UsbBuffer[128];还是分开定义数组UsbBuffer_IN[64];UsbBuffer_OUT[64]呢

...

建议分开使用。
截图202504151115015285.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:15 , Processed in 0.270642 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表