本帖最后由 Lana636 于 2024-8-27 15:42 编辑
#申请原创# GW3323-USB分析GW3323的PB3\PB4作为USB引脚时,内部有接有上拉电阻。DP(PB3)上拉1.5k欧姆内阻,DM(PB4)上拉200欧姆内阻。输出阻抗是36ohm;差分阻抗是90ohm。
GW3323的USB既可以作为主机,也可以作为从机;但是未开放作为USB主机的任何资料和例程。
GW3323的USB从机可以做耳机、键盘、鼠标、打印机、U盘等设备。config_desc_usb_device配置此芯片充当的设备描述符。
Device Descriptor:------------------------------
bLength 18 (大小:18字节)
bDescriptorType 1 (描述符类型:设备)
bcdUSB 2.00 (USB版本:2.00)
bDeviceClass 0 (设备类代码)
bDeviceSubClass 0 (设备子类代码)
bDeviceProtocol 0 (设备协议代码)
bMaxPacketSize0 64 (端点0的最大包大小:64字节)
idVendor 0x1234 (厂商ID)
idProduct 0x5678 (产品ID)
bcdDevice 1.00 (设备版本:1.00)
iManufacturer 1 (厂商字符串索引)
iProduct 2 (产品字符串索引)
iSerialNumber 3 (序列号字符串索引)
bNumConfigurations 1 (配置数量)
Interface Descriptor:
---------------------------------
0x09,/* 描述符的长度:9字节 */
4,/* 描述符的类型:0x04接口描述符(Interface) */
0x00,/* 选择此接口的索引号,从0开始计算:0 */
0x00,/* 用于选择此设置的索引号:0 */
0x01,/* 实现此接口需要使用的端点数目:1 */
0x03,/* 此接口所遵循的类:HID Class */
0x01,/* 此接口所遵循的子类:1=BOOT, 0=no boot */
0x02,/* 此接口所支持的协议:0自定义、1键盘、2鼠标 */
0,/* 用于描述此接口的字符描述符的索引号 */
设备类型 | 类代码(Class Code) | 子类代码(Subclass Code) | 接口协议代码(Protocol Code) | 描述 | HID(人机接口设备) | 0x03 | 0x01 | 0x01 | 键盘(Keyboard) |
| | 0x01 | 0x02 | 鼠标(Mouse) | 打印机 | 0x07 | 0x01 | 0x01 | 打印机(Printer) | CDC(通信设备类) | 0x02 | 0x02 | 0x00
0x01 | ACM(Abstract Control Model)
ACM(Abstract Control Model,虚拟串口设备) |
| | 0x06 | 0x00 | ECM(Ethernet Control Model) | 音频 | 0x01 | 0x01 | 0x00 | 音频控制(Audio Control) |
| | 0x02 | 0x00 | 音频流(Audio Streaming) |
| | 0x03 | 0x00 | MIDI(MIDI Streaming) | 图片 | 0x06 | 0x01 | 0x01 | 静止图像捕获(Still Image Capture) | 存储设备 | 0x08 | 0x06 | 0x50 | SCSI传输(SCSI Transparent Command Set) | 视频 | 0x0E | 0x01 | 0x00 | 视频控制(Video Control) |
| | 0x02 | 0x00 | 视频流(Video Streaming) | 无线控制器 | 0xE0 | 0x01 | 0x01 | 蓝牙编程接口(Bluetooth Programming Interface) | 供应商特定设备 | 0xFF | — | — | 供应商特定(Vendor Specific) |
- 官方USB规范文档:[color=var(--color-accent-fg)]https://www.usb.org/documents
bsp_sys.c中可以看到,每5ms,GW3323调用usb_detect()监测USB的状态。
1、USB插拔时过程分析: main主函数while(1)中每19ms就读取msg的状态。用户while(1)中执行内容不同,所用时间不同,此处19ms仅是当前工程的测量值。
func_usbdev_exit();//在160MHz主频下需要131us
pc_remove();//在160MHz主频下需要600ns
2、USB流控时过程分析:
PC发给GW3323:1b40...(GW3323收到了,所以回复的是ack)
但GW3323实行USB流控,未调用ude_rx_ack()
所以PC再给芯片发数据:0000...(芯片回复nack)
等芯片合盖后,调用ude_rx_ack(),PC再给芯片发数据:0000...(芯片回复ack)
|