找回密码
 立即注册
查看: 120|回复: 14

AI的CDC虚拟CH340遇到问题了

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-07 10:57:57

1

主题

8

回帖

53

积分

注册会员

积分
53
发表于 前天 10:57 | 显示全部楼层 |阅读模式
这几天没事干,就用AI的单片机里面的CDC串口,改了一个CH340串口,现在的问题是有些电脑能识别并安装CH340驱动,并正常使用。有些电脑设备管理器显示CH340串口感叹号,有的电脑读不到VID PID……郁闷中,不知道哪里出来问题,把程序发上来,大家帮忙看看

char code DEVICEDESC[18] =
{
    0x12,                             /* bLength */
    0x01,                                                                                                      /* bDescriptorType */
    0x10,0x01,                        /* bcdUSB = 1.10 */
    0xff,                             /* bDeviceClass: CDC */
    0x00,                             /* bDeviceSubClass */
    0x00,                             /* bDeviceProtocol */
    0x40,                             /* bMaxPacketSize0 */
    0x86,0x1a,                        /* idVendor = 0x1A86 */
    0x23,0x75,                        /* idProduct = 0x7523 */  
    0x64,0x02,                        /* bcdDevice = 2.00 */
    0x01,                             /* 制造商描述符的索引 */
    0x02,                             /* 产品描述符的索引 */
    0x03,                             /* 设备序列号的描述符的索引 */
    0x01                              /* 配置描述符的数量 */

};


char code CONFIGDESC[39] =
{


    /* 配置描述符 */
    0x09,                             /* bLength: 配置描述符的长度 */
    0X02,                                                                                                                 /* bDescriptorType: Configuration */
    0x27,                                                                                                                  /* wTotalLength: 所有返回的字节数 */
    0x00,
    0x01,                             /* bNumInterfaces: 接口的数量 */
    0x01,                             /* bConfigurationValue: 配置值 */
    0x00,                             /* iConfiguration: 描述该配置的字符串描述符的索引 */
    0x80,                             /* bmAttributes: 自供电 */
    0x30,                             /* MaxPower: 0 mA */

    /* 接口描述符 */
    0x09,                             /* bLength: 接口描述符的长度 */
    0x04,                                                                                                           /* bDescriptorType: Interface */
    /* 接口描述符类型 */
    0x00,                             /* bInterfaceNumber: 接口的编号 */
    0x00,                             /* bAlternateSetting: 替代设置 */
    0x03,                             /* bNumEndpoints: 使用的端点数 */
    0xff,                             /* bInterfaceClass: 通信接口类 */
    0x01,                             /* bInterfaceSubClass: 抽象控制模型 */
    0x02,                             /* bInterfaceProtocol: 通用 AT 命令 */
    0x00,                             /* iInterface: 描述该接口的字符串描述符的索引 */

    /* 端点2输入描述符 */
    0x07,                             /* bLength: 端点描述符的长度 */
    0X05,                                                                                                     /* bDescriptorType: Endpoint */
    0x82,                             /* bEndpointAddress: (IN2) */
    0x02,                             /* bmAttributes: 传输类型为批量传输 */
    0x40,                             /* wMaxPacketSize: 最大数据包大小 */
    0x00,
    0x00,                             /* bInterval: 传输间隔 */

    /* 端点2输出描述符 */
    0x07,                             /* bLength: 端点描述符的长度 */
    0X05,                                                                                                     /* bDescriptorType: Endpoint */
    0x02,                             /* bEndpointAddress: (OUT2) */
    0x02,                             /* bmAttributes: 传输类型为批量传输 */
    0x40,                             /* wMaxPacketSize: 最大数据包大小 */
    0x00,
    0x00,                             /* bInterval: 传输间隔 */
               
               
           /* 端点1输入描述符 */
    0x07,                             /* bLength: 端点描述符的长度 */
    0X05,                                                                                                     /* bDescriptorType: Endpoint */
    0x81,                             /* bEndpointAddress: (IN1) */
    0x03,                             /* bmAttributes: 传输类型为中断传输 */
    0x08,                             /* wMaxPacketSize: 最大数据包大小 */
    0x00,
    0x01,                              /* bInterval: 传输间隔 */        
               
};

char code LANGIDDESC[4] =
{
    0x04,0x03,
    0x09,0x04,
};

char code MANUFACTDESC[14] =
{
          0x0B,0x03,
    'w',0,
    'c',0,
    'h',0,
    '.',0,
    'c',0,
    'n',0,
        
};

char code PRODUCTDESC[30] =
{

   0x18,0x03,
    'U',0,
    'S',0,
    'B',0,
    ' ',0,
    'S',0,
    'e',0,
    'r',0,
    'i',0,
    'a',0,
    'l',0,
        
};

char code PACKET0[2] =
{
    0, 0,
};

char code PACKET1[2] =
{
    1, 0,
};





case VENDOR_REQUEST:  //处理来自厂商的请求
                   usb_req_vendor();
                                                       //***********************************************************************
                                                                         // 这部分是厂商信息
                                                                         //***********************************************************************
               
                                                                                switch(Setup.bRequest)
                                                                                {
                                                                                        case   0x5F:  
                                                                                                        Ep0State.pData = buf1;
                                                                                                        Ep0State.wSize = sizeof(buf1);
                                                                                                        break;
                                                                                        case  0x95:
                                                                                                        if((Setup.wValueH==0x25)&&(Setup.wValueL==0x18))    // wValue == 0x2518)
                                                                                                        {
                                                                                                                Ep0State.pData = buf2;
                                                                                                                Ep0State.wSize = sizeof(buf2);
                                                                                                
                                                                                                        }
                                                                                                        else if((Setup.wValueH==0x07)&&(Setup.wValueL==0x06)) ///wValue == 0x0706
                                                                                                        {
                                                                                                                 Ep0State.pData = buf0;
                                                                                                                 Ep0State.wSize = sizeof(buf0);
                                                                                                        }
                                                                                                        break;
                                                                                        case  0xA4:
                                                                                                        {
                                                                                                                Ep0State.pData = buf0;
                                                                                                                Ep0State.wSize = sizeof(buf0);
                                                                                                        }
                                                                                                        break;
                                                                                        default:
                                                                                                        Ep0State.pData = zero;
                                                                                                        Ep0State.wSize = sizeof(zero);
                                                                                                        break;
                                                                                }

                                                                                
                //***********************************************************************

                break;



有爱心的大神,有空帮忙看看,下面是程序附件


CDC模拟CH340.rar

323.39 KB, 下载次数: 3

回复

使用道具 举报 送花

3

主题

1117

回帖

945

积分

等待验证会员

积分
945
发表于 前天 10:58 | 显示全部楼层
针对您在使用STC单片机模拟CH340 USB转串口功能时遇到的兼容性问题,结合提供的设备描述符代码分析,可能存在以下技术原因及解决方案建议:

一、设备描述符关键参数分析
1. VID/PID配置  
  
  1. c
  2.    0x86,0x1a,  // idVendor = 0x1A86
  3.    0x23,0x75,  // idProduct = 0x7523
复制代码
   当前配置的VID1A86/PID7523为CH340标准标识符,理论上与官方驱动匹配。但需注意:
需确认驱动签名认证状态(部分Windows版本会拦截未签名驱动)
建议使用USB-IF官方分配的VID/PID(需申请)以避免系统级冲突

2. 设备类配置异常
  
  1. c
  2.    0xff,  // bDeviceClass: CDC
复制代码
   CDC设备的标准配置应为:
  
  1. c
  2.    bDeviceClass      = 0x02(Communications Device Class)
  3.    bDeviceSubClass   = 0x02(Abstract Control Model)
  4.    bDeviceProtocol   = 0x01(AT Commands)
复制代码
   当前配置将设备类设为0xFF(厂商自定义类),可能导致部分操作系统无法正确识别CDC设备类型

二、CDC功能描述符完整性验证
完整的CDC配置需包含以下描述符(未在代码片段中体现):
1. 接口关联描述符(IAD)  
   必需声明通信接口和数据接口的关联关系:
  
  1. c
  2.    struct {
  3.        BYTE bLength;
  4.        BYTE bDescriptorType;  // 0x0B
  5.        BYTE bFirstInterface;
  6.        BYTE bInterfaceCount;
  7.        BYTE bFunctionClass;   // 0x02
  8.        BYTE bFunctionSubClass;// 0x02
  9.        BYTE bFunctionProtocol;// 0x01
  10.        BYTE iFunction;
  11.    } IADDescriptor;
复制代码

2. CDC功能描述符  
   需包含Call Management(CM)和Abstract Control Model(ACM)描述符:
  
  1. c
  2.    // Header Functional Descriptor
  3.    {0x05, 0x24, 0x00, 0x10, 0x01}
  4.    // ACM Functional Descriptor
  5.    {0x04, 0x24, 0x02, 0x06}
  6.    // Union Functional Descriptor
  7.    {0x05, 0x24, 0x06, 0x00, 0x01}
复制代码

三、端点配置关键参数
1. 控制端点  
  
  1. c
  2.    0x40  // bMaxPacketSize0
复制代码
   建议配置为64字节(0x40)以兼容高速设备,但需与端点描述符中的wMaxPacketSize保持一致

2. 中断端点配置  
   典型CDC配置需包含:
  
  1. c
  2.    // Interrupt IN Endpoint
  3.    {0x07, 0x05, 0x83, 0x03, 0x08, 0x00, 0x0A}
复制代码
   需确保:
端点方向(0x80=IN,0x00=OUT)
传输类型(0x03=Interrupt)
轮询间隔(0x0A=10ms)

四、系统兼容性优化建议
1. Windows驱动签名策略  
在Windows 10/11系统测试时:
  
  1. powershell
  2.    bcdedit /set testsigning on  // 启用测试签名模式
  3.    certutil -addstore "TrustedPublisher" ch340.cer  // 导入测试证书
复制代码

2. USB电源管理配置  
   在设备描述符中增加:
  
  1. c
  2.    #define USBCONFIGPOWERMA(mA)  ((mA)/2)  // 单位2mA
  3.    0x32  // 100mA供电需求(0x32 = 50  2mA)
复制代码
   避免因供电不足导致枚举失败

五、调试诊断方案
1. USB协议分析  
   使用专业工具捕获USB通信过程:
USBlyzer(Windows)
  
  1. bash
  2.    usbmon --capture --output=enum.pcap  // Linux内核调试
复制代码

2. 设备枚举日志分析  
   在Windows设备管理器查看失败代码:
代码10:驱动加载失败
代码43:设备描述符请求超时
代码52:未通过微软WHQL认证

六、推荐改进方案
修正后的设备描述符示例:
  1. c
  2. const uint8t DeviceDescriptor[] = {
  3.    0x12,        // bLength
  4.    0x01,        // bDescriptorType (Device)
  5.    0x00,0x02,   // bcdUSB 2.00
  6.    0x02,        // bDeviceClass (CDC)
  7.    0x00,        // bDeviceSubClass
  8.    0x00,        // bDeviceProtocol
  9.    0x40,        // bMaxPacketSize0
  10.    0x86,0x1a,   // idVendor
  11.    0x23,0x75,   // idProduct
  12.    0x20,0x00,   // bcdDevice 2.00
  13.    0x01,        // iManufacturer
  14.    0x02,        // iProduct
  15.    0x03,        // iSerialNumber
  16.    0x01         // bNumConfigurations
  17. };
复制代码

建议通过以下流程验证:
1. 使用USB控制台工具强制复位设备
2. 对比正常/异常枚举过程的SETUP包差异
3. 检查配置描述符总长度是否匹配wTotalLength字段
4. 验证字符串描述符索引是否正确关联

若问题仍未解决,建议提供完整的配置描述符和端点描述符进行深度分析。系统兼容性问题往往源于USB协议栈实现的细微差异,需结合硬件信号质量(眼图测试)和软件协议栈完整性综合排查。

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

使用道具 举报 送花

3

主题

1117

回帖

945

积分

等待验证会员

积分
945
发表于 前天 10:58 | 显示全部楼层
针对您在使用STC单片机模拟CH340的CDC串口功能时遇到的兼容性问题,以下是可能的原因分析与解决方案建议:

一、设备描述符配置分析
从您提供的代码片段来看,DEVICEDESC数组的配置存在以下潜在问题:
1. USB版本兼容性问题  
   bcdUSB字段值为0x0110(即USB 1.1),而CH340通常遵循USB 2.0规范。建议修改为:  
  
  1. c
  2.    0x00, 0x02  // bcdUSB = 0x0200 (USB 2.0)
复制代码

2. 设备类/子类/协议配置  
   CH340属于通信设备类(CDC),但您的配置中:  
bDeviceClass = 0xFF(厂商自定义类),正确值应为 0x02(Communication Device Class) 或 0xEF(Miscellaneous Class)。  
bDeviceSubClass和bDeviceProtocol需符合CDC规范,建议设置为:  
   
  1. c
  2.      0x02,  // bDeviceClass = Communication Device Class
  3.      0x00,  // bDeviceSubClass (需根据CDC子类选择)
  4.      0x01,  // bDeviceProtocol (需匹配子类协议)
复制代码

3. 字符串描述符索引  
   CH340驱动可能依赖iManufacturer、iProduct和iSerialNumber字段指向的字符串描述符。若未在代码中定义这些字符串,或索引值未正确指向(例如索引0保留),部分系统可能无法识别设备。  
   解决方案:  
补充完整的字符串描述符(厂商名、产品名、序列号)。  
确保DEVICEDESC中对应索引有效,例如:  
   
  1. c
  2.      0x01,  // iManufacturer (指向字符串描述符1)
  3.      0x02,  // iProduct       (指向字符串描述符2)
  4.      0x03,  // iSerialNumber  (指向字符串描述符3)
复制代码

二、CDC功能描述符完整性
完整的CDC实现需包含以下描述符(代码中未体现):  
1. 配置描述符:定义接口数量、供电模式等。  
2. 接口关联描述符(IAD):CDC设备需声明控制接口与数据接口的关联。  
3. CDC功能描述符:包括头功能描述符、抽象控制模型(ACM)描述符等。  
4. 端点描述符:至少包含1个控制端点(IN)和2个数据端点(IN/OUT)。  

关键建议:  
参考USB CDC协议文档(如《USB Class Definitions for Communications Devices》),补充缺失的描述符结构。  
确保端点最大包长度与USB版本匹配(例如全速模式下控制端点最大包为64字节)。  

三、驱动兼容性优化
1. 驱动签名问题  
   部分Windows版本(如Win10/11)对未签名驱动强制限制。建议:  
从官方渠道下载最新版CH340驱动,并对比VID/PID是否匹配。  
若需自定义VID/PID,需修改驱动配置文件(.inf)中的硬件ID列表。  

2. 系统策略差异  
设备管理器显示感叹号:右键设备→“属性”→“详细信息”→查看“设备状态代码”。常见代码:  
代码10:驱动加载失败,需检查描述符兼容性。  
代码43:硬件故障或端点通信异常。  
VID/PID无法识别:通过USB协议分析仪捕获枚举过程,确认描述符数据是否被正确发送。

四、硬件与信号完整性
1. USB数据线质量  
   劣质线缆或过长走线可能导致信号衰减,尤其在USB 2.0高速模式下。建议:  
使用屏蔽双绞线,长度小于1米。  
检查D+/D-引脚是否接反,并确认上拉电阻配置(全速模式需1.5kΩ上拉到D-)。  

2. 电源稳定性  
   部分电脑USB端口供电不足可能导致枚举失败。尝试外接5V电源或启用USB总线供电模式。

五、调试建议
1. 使用工具验证  
USBlyzer或Wireshark:捕获USB枚举数据流,对比与标准CH340描述符差异。  
STC-ISP工具:确认单片机USB时钟精度(需±0.25%以内)。  

2. 最小化测试代码  
   逐步剔除复杂逻辑,仅保留USB枚举相关代码,验证基础功能是否正常。

六、参考代码修正片段
  1. c
  2. // 修正后的设备描述符示例
  3. char code DEVICEDESC[18] = {
  4.     0x12,                   // bLength
  5.     0x01,                   // bDescriptorType (Device)
  6.     0x00, 0x02,             // bcdUSB (USB 2.0)
  7.     0x02,                   // bDeviceClass (CDC)
  8.     0x00,                   // bDeviceSubClass
  9.     0x00,                   // bDeviceProtocol
  10.     0x40,                   // bMaxPacketSize0
  11.     0x86, 0x1a,             // idVendor (0x1A86)
  12.     0x23, 0x75,             // idProduct (0x7523)
  13.     0x64, 0x02,             // bcdDevice (0x0264)
  14.     0x01,                   // iManufacturer
  15.     0x02,                   // iProduct
  16.     0x03,                   // iSerialNumber
  17.     0x01                    // bNumConfigurations
  18. };
  19. // 补充CDC接口关联描述符(IAD)
  20. char code IADDESC[] = {
  21.     0x08,                   // bLength
  22.     0x0B,                   // bDescriptorType (IAD)
  23.     0x00,                   // bFirstInterface
  24.     0x02,                   // bInterfaceCount
  25.     0x02,                   // bFunctionClass (CDC)
  26.     0x02,                   // bFunctionSubClass (ACM)
  27.     0x01,                   // bFunctionProtocol (AT Commands)
  28.     0x02                    // iFunction
  29. };
复制代码

通过上述优化,可显著提升设备兼容性。若问题仍未解决,建议提供完整的描述符集合与USB日志,以便进一步分析。

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:357
  • 最近打卡:2025-05-08 01:39:08
已绑定手机

131

主题

1560

回帖

2016

积分

金牌会员

积分
2016
发表于 前天 11:36 | 显示全部楼层
还是用官方的一箭双雕或者置顶那个下载器好点
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:35
  • 最近打卡:2025-05-08 15:00:11

25

主题

1161

回帖

2417

积分

超级版主

积分
2417
发表于 前天 14:41 | 显示全部楼层

截图202505071439553590.jpg



USB串口量产PCB/SCH开源, 芯片出厂自带USB程序
Ai8H2K12U-45MHz-SOP8USB串口,RMB 0.95,【免费+包邮 送
Ai8H2K12U-45MHz-SOP16USB串口,RMB 1.1省1个USB
USB插头支持:USB-TypeA,USB-TypeC
支持任意波特率,最高到 10Mbps,程序早已稳定,免驱动安装
全自动停电/上电,ISP下载编程烧录器
手动电源开/关按键,可做电源供电模块
立创开源 SCH / PCB,可以自己去立创免费打样V1.2-20241023



【新提醒】USB转双串口,RMB1.1, 量产PCB/SCH开源,芯片出厂自带USB程序@Ai8H2K12U-45MHz-SOP16 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区  https://www.stcaimcu.com/forum.p ... mp;extra=#pid113523

截图202505071439123761.jpg
STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-05-08 00:01:49
已绑定手机

19

主题

3196

回帖

4956

积分

论坛元老

积分
4956
发表于 前天 16:51 | 显示全部楼层
vb2*** 发表于 2025-5-7 11:36
还是用官方的一箭双雕或者置顶那个下载器好点

说的是用STC模拟CH340,也就是芯片是STC的显示出来是CH340,和下载器无关吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-07 10:57:57

1

主题

8

回帖

53

积分

注册会员

积分
53
发表于 前天 17:53 | 显示全部楼层
so*** 发表于 2025-5-7 16:51
说的是用STC模拟CH340,也就是芯片是STC的显示出来是CH340,和下载器无关吧

是的,和下载器无关,单片机的CDC串口只能用CDC的驱动。
做成CH340的串口,用的是CH340的驱动,
很多电脑并不支持或者没有良好的支持CDC驱动
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:357
  • 最近打卡:2025-05-08 01:39:08
已绑定手机

131

主题

1560

回帖

2016

积分

金牌会员

积分
2016
发表于 前天 19:40 来自手机 | 显示全部楼层
soma 发表于 2025-5-7 16:51
说的是用STC模拟CH340,也就是芯片是STC的显示出来是CH340,和下载器无关吧

意思是把stc的单片机当ch340用?还能给stm下载那种m
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-09 00:28:12
已绑定手机

35

主题

2111

回帖

2263

积分

荣誉版主

积分
2263
发表于 前天 23:30 | 显示全部楼层
模拟CH340并非把设备描述和PID VID改成CH340一致的那么简单,
CH340官方驱动里面有关于一些特殊寄存器级的操作,这个也需要做相应的模拟。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-05-08 07:58:32

6

主题

61

回帖

456

积分

中级会员

积分
456
发表于 昨天 08:09 | 显示全部楼层
现在大家有用过CDC在Linux或者Ubuntu系统通讯吗?CH340是识别为TTYUSB.
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-9 00:41 , Processed in 0.158283 second(s), 122 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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