USB论坛
直播中

梅利号

9年用户 1563经验值
擅长:可编程逻辑
私信 关注
[问答]

如何用AN75779实现CDC通信?

我想通过设计应用代码 AN75779 实现 CDC 通信,需要一些应用说明或任何参考资料。

此外,我还想知道我需要对 AN75779 的工作设计进行哪些修改,对于 CDC,我需要使用哪种应用程序进行通信。

如果能对该主题进行详细描述,将会有所帮助。

回帖(1)

jfsky

2025-5-23 18:20:17

在基于Infineon(原Cypress)的AN75779应用笔记实现USB CDC通信时,需要以下关键步骤和注意事项:




1. AN75779与CDC通信基础



  • AN75779的核心功能:该应用笔记提供了USB设备固件开发的框架,通常默认支持HID、大容量存储等USB类。需要修改其USB配置以支持CDC类。

  • CDC类特性

    • 虚拟串口通信(VCOM)

    • 需要CDC ACM(Abstract Control Model)子类

    • 使用批量传输(Bulk Endpoint)或中断传输(Interrupt Endpoint)





2. 必要的修改步骤


(1) 修改USB描述符



  • 设备描述符
    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等
    };


  • 配置描述符



    • 添加CDC功能描述符(如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 (数据接口)





(2) 端点配置



  • 通信接口(Interrupt Endpoint):

    • 用于传输控制信号(如线路编码设置)
      #define CDC_COMM_IN_EP     (0x83)  // 端点3,IN方向,中断传输


  • 数据接口(Bulk Endpoint):

    • 用于实际数据传输
      #define CDC_DATA_IN_EP     (0x81)  // 端点1,IN方向,批量传输
      #define CDC_DATA_OUT_EP    (0x02)  // 端点2,OUT方向,批量传输





3. 关键代码实现


(1) 处理CDC类请求


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;
}

(2) 数据收发逻辑



  • 发送数据(通过批量IN端点):
    uint8_t txBuffer[64];
    // 填充数据到txBuffer
    USB_LoadInEP(CDC_DATA_IN_EP, txBuffer, sizeof(txBuffer));

  • 接收数据(通过批量OUT端点):
    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);
      // 处理接收到的数据
    }




4. 参考资料与工具



  • Infineon官方文档

    • AN75779应用笔记(重点阅读USB描述符配置章节)

    • USB CDC类规范(下载PDF)


  • 调试工具

    • USBlyzerWireshark:捕获USB数据包,验证描述符和通信流程

    • Infineon USBCheck工具:验证USB协议合规性


  • 示例代码

    • 参考Infineon SDK中的USB_CDC_Example项目(如CY8CKIT-049)





5. 上位机通信示例



  • PC端应用程序

    • Tera Term / PuTTY:选择虚拟串口号(如COMx),设置波特率(需与SET_LINE_CODING一致)

    • 自定义Python脚本
      import serial
      ser = serial.Serial('COM5', baudrate=115200)
      ser.write(b'Hello, AN75779!')
      response = ser.read(64)





6. 常见问题



  • 驱动安装

    • Windows可能需要.inf文件(参考Infineon提供的cyusb.inf

    • Linux/MacOS通常自动识别CDC设备


  • 端点冲突:确保AN75779原有代码中的端点分配与CDC端点无冲突

  • 数据传输延迟:优化缓冲区管理,使用DMA传输(如果硬件支持)


通过以上步骤,您应能基于AN75779框架实现完整的USB CDC通信。建议从Infineon官方支持论坛获取最新的代码示例和补丁。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分