在基于Infineon(原Cypress)的AN75779应用笔记实现USB CDC通信时,需要以下关键步骤和注意事项:
CDC ACM(Abstract Control Model)子类const uint8_t CYCODE USB_DEVICE_DESCRIPTOR[] = {
0x12, // bLength
0x01, // bDescriptorType (Device)
0x00, 0x02, // bcdUSB (USB 2.0)
0x02, // bDeviceClass (CDC)
0x00, // bDeviceSubClass
0x00, // bDeviceProtocol
0x40, // bMaxPacketSize0
... // VID/PID等
};配置描述符:
Header Functional Descriptor, ACM Functional Descriptor, Union Functional Descriptor)
// CDC Header Functional Descriptor
0x05, // bLength
0x24, // bDescriptorType (CS_INTERFACE)
0x00, // bDescriptorSubtype (Header)
0x10, 0x01, // bcdCDC (1.10)// ACM Functional Descriptor
0x04, // bLength
0x24, // CS_INTERFACE
0x02, // Subtype: ACM
0x02, // Capabilities (支持Set_Line_Coding等)
// Union Functional Descriptor
0x05, // bLength
0x24, // CS_INTERFACE
0x06, // Subtype: Union
0x00, // Master Interface (通信接口)
0x01 // Slave Interface (数据接口)
#define CDC_COMM_IN_EP (0x83) // 端点3,IN方向,中断传输#define CDC_DATA_IN_EP (0x81) // 端点1,IN方向,批量传输
#define CDC_DATA_OUT_EP (0x02) // 端点2,OUT方向,批量传输在USBFS_SetupCallback()函数中添加对CDC特定请求的处理:
switch (requestType) {
case USB_SET_INTERFACE:
// 处理接口设置
break;
case USB_CLASS_REQ:
switch (bRequest) {
case 0x20: // SET_LINE_CODING
// 保存波特率、数据位等配置
memcpy(&lineCoding, pData, sizeof(lineCoding));
break;
case 0x21: // GET_LINE_CODING
memcpy(pData, &lineCoding, sizeof(lineCoding));
break;
case 0x22: // SET_CONTROL_LINE_STATE
// 控制DTR/RTS信号
break;
}
break;
}uint8_t txBuffer[64];
// 填充数据到txBuffer
USB_LoadInEP(CDC_DATA_IN_EP, txBuffer, sizeof(txBuffer));uint8_t rxBuffer[64];
if (USB_GetEPState(CDC_DATA_OUT_EP) == USB_OUT_BUFFER_FULL) {
uint32_t count = USB_GetEPCount(CDC_DATA_OUT_EP);
memcpy(rxBuffer, USB_GetOutEPBuffer(CDC_DATA_OUT_EP), count);
// 处理接收到的数据
}USB_CDC_Example项目(如CY8CKIT-049)COMx),设置波特率(需与SET_LINE_CODING一致)import serial
ser = serial.Serial('COM5', baudrate=115200)
ser.write(b'Hello, AN75779!')
response = ser.read(64).inf文件(参考Infineon提供的cyusb.inf)通过以上步骤,您应能基于AN75779框架实现完整的USB CDC通信。建议从Infineon官方支持论坛获取最新的代码示例和补丁。
举报
更多回帖