XMega:USB 复合控制器上的 CDC 无法正常运行
XMega: CDC on USB composite controller does not function properly
对于我正在制作 USB 键盘的项目,它有几个按钮并且这些键应该是可编程的。我选择了 ATXMega32C4,因为它支持 USB,并且在 Atmel Studio 6 中还有一个方便的 ASF 库。
我已经创建了一些 Atmel Studio 项目,让它既可以用作键盘又可以用作 CDC 控制器,它们分别运行成功。为了结合这两个功能,我不得不将我的项目 USB 更改为复合设备。
但问题是: CDC 控制器在 Windows 中无法正确检测,而复合设备和键盘控制器可以。
我已经摆弄了端点地址来尝试解决问题,但是那没有用,我不知道问题可能是什么。(当然,我确实在每个位置都更改了 PID测试)
我尝试解决问题的方法
更改最大 endpoint/Interface 地址,更改 CDC 配置的 endpoint/Interface 地址,为 CDC 设置不同的波特率,尝试为 Xplained 复制 USB 示例。
conf_usb.h:
//! Control endpoint size
#define USB_DEVICE_EP_CTRL_SIZE 64
//! Number of interfaces for this device
// 1 or more
#define USB_DEVICE_NB_INTERFACE 3
//! Total endpoint used by all interfaces
// 0 to max endpoint requested by interfaces
#define USB_DEVICE_MAX_EP 4
//! Endpoint numbers definition
#define UDI_HID_KBD_EP_IN (1 | USB_EP_DIR_IN)
//! Interface number
#define UDI_HID_KBD_IFACE_NUMBER 0
//! Endpoints' numbers used by single or first CDC port
#define UDI_CDC_DATA_EP_IN_0 (2 | USB_EP_DIR_IN) // TX
#define UDI_CDC_DATA_EP_OUT_0 (3 | USB_EP_DIR_OUT) // RX
#define UDI_CDC_COMM_EP_0 (4 | USB_EP_DIR_IN) // Notify endpoint
//! Interface numbers used by single or first CDC port
#define UDI_CDC_COMM_IFACE_NUMBER_0 1
#define UDI_CDC_DATA_IFACE_NUMBER_0 2
//! USB Interfaces descriptor structure
#define UDI_COMPOSITE_DESC_T \
udi_hid_kbd_desc_t udi_hid_kbd; \
usb_iad_desc_t udi_cdc_iad; \
udi_cdc_comm_desc_t udi_cdc_comm; \
udi_cdc_data_desc_t udi_cdc_data
//! USB Interfaces descriptor value for Full Speed
#define UDI_COMPOSITE_DESC_FS \
.udi_hid_kbd = UDI_HID_KBD_DESC, \
.udi_cdc_iad = UDI_CDC_IAD_DESC_0, \
.udi_cdc_comm = UDI_CDC_COMM_DESC_0, \
.udi_cdc_data = UDI_CDC_DATA_DESC_0_FS
//! USB Interfaces descriptor value for High Speed
#define UDI_COMPOSITE_DESC_HS \
.udi_cdc_iad = UDI_CDC_IAD_DESC_0, \
.udi_cdc_comm = UDI_CDC_COMM_DESC_0, \
.udi_cdc_data = UDI_CDC_DATA_DESC_0_HS
//! USB Interface APIs
#define UDI_COMPOSITE_API \
&udi_api_hid_kbd, \
&udi_api_cdc_comm, \
&udi_api_cdc_data
为了进一步检查,我上传了一些可能有帮助的文件:
conf_usb.h: http://puu.sh/iwdQi/1551aa928a.h
main.c: http://puu.sh/iwdQ7/df8fc8728a.c
任何帮助将不胜感激!
解决方法是手动安装 CDC 驱动程序。我认为它应该像其他示例一样自动检测 CDC 端口,但它没有。
我认为您不能在不删除已解析文件的情况下更改 .inf 文件(与 inf 同名,但扩展名不同 (.pnf))。在更改 .inf 之前,我总是很幸运地删除了这个文件,然后下次插入 USB 并创建一个新的 .pnf 文件。
对于我正在制作 USB 键盘的项目,它有几个按钮并且这些键应该是可编程的。我选择了 ATXMega32C4,因为它支持 USB,并且在 Atmel Studio 6 中还有一个方便的 ASF 库。
我已经创建了一些 Atmel Studio 项目,让它既可以用作键盘又可以用作 CDC 控制器,它们分别运行成功。为了结合这两个功能,我不得不将我的项目 USB 更改为复合设备。
但问题是: CDC 控制器在 Windows 中无法正确检测,而复合设备和键盘控制器可以。
我已经摆弄了端点地址来尝试解决问题,但是那没有用,我不知道问题可能是什么。(当然,我确实在每个位置都更改了 PID测试)
我尝试解决问题的方法
更改最大 endpoint/Interface 地址,更改 CDC 配置的 endpoint/Interface 地址,为 CDC 设置不同的波特率,尝试为 Xplained 复制 USB 示例。
conf_usb.h:
//! Control endpoint size
#define USB_DEVICE_EP_CTRL_SIZE 64
//! Number of interfaces for this device
// 1 or more
#define USB_DEVICE_NB_INTERFACE 3
//! Total endpoint used by all interfaces
// 0 to max endpoint requested by interfaces
#define USB_DEVICE_MAX_EP 4
//! Endpoint numbers definition
#define UDI_HID_KBD_EP_IN (1 | USB_EP_DIR_IN)
//! Interface number
#define UDI_HID_KBD_IFACE_NUMBER 0
//! Endpoints' numbers used by single or first CDC port
#define UDI_CDC_DATA_EP_IN_0 (2 | USB_EP_DIR_IN) // TX
#define UDI_CDC_DATA_EP_OUT_0 (3 | USB_EP_DIR_OUT) // RX
#define UDI_CDC_COMM_EP_0 (4 | USB_EP_DIR_IN) // Notify endpoint
//! Interface numbers used by single or first CDC port
#define UDI_CDC_COMM_IFACE_NUMBER_0 1
#define UDI_CDC_DATA_IFACE_NUMBER_0 2
//! USB Interfaces descriptor structure
#define UDI_COMPOSITE_DESC_T \
udi_hid_kbd_desc_t udi_hid_kbd; \
usb_iad_desc_t udi_cdc_iad; \
udi_cdc_comm_desc_t udi_cdc_comm; \
udi_cdc_data_desc_t udi_cdc_data
//! USB Interfaces descriptor value for Full Speed
#define UDI_COMPOSITE_DESC_FS \
.udi_hid_kbd = UDI_HID_KBD_DESC, \
.udi_cdc_iad = UDI_CDC_IAD_DESC_0, \
.udi_cdc_comm = UDI_CDC_COMM_DESC_0, \
.udi_cdc_data = UDI_CDC_DATA_DESC_0_FS
//! USB Interfaces descriptor value for High Speed
#define UDI_COMPOSITE_DESC_HS \
.udi_cdc_iad = UDI_CDC_IAD_DESC_0, \
.udi_cdc_comm = UDI_CDC_COMM_DESC_0, \
.udi_cdc_data = UDI_CDC_DATA_DESC_0_HS
//! USB Interface APIs
#define UDI_COMPOSITE_API \
&udi_api_hid_kbd, \
&udi_api_cdc_comm, \
&udi_api_cdc_data
为了进一步检查,我上传了一些可能有帮助的文件:
conf_usb.h: http://puu.sh/iwdQi/1551aa928a.h
main.c: http://puu.sh/iwdQ7/df8fc8728a.c
任何帮助将不胜感激!
解决方法是手动安装 CDC 驱动程序。我认为它应该像其他示例一样自动检测 CDC 端口,但它没有。
我认为您不能在不删除已解析文件的情况下更改 .inf 文件(与 inf 同名,但扩展名不同 (.pnf))。在更改 .inf 之前,我总是很幸运地删除了这个文件,然后下次插入 USB 并创建一个新的 .pnf 文件。