xxkj2010 发表于 2025-10-1 21:20:53

(已解决)用STC8H2K12U制作的CDC+HID,其中的串口工作不正常

芯片用的是STC8H2K12U-SOP16,用ISP制作CDC+HID,制作步骤如下图:



HID通讯正常,CDC虚拟串口工作不正常。主要表现是:串口对外发送数据正常,却无法接收外来串口数据,不知道问题出在哪里。



如果用STC8H8K64U-SOP16,就完全正常。


国芯人工智能 发表于 2025-10-1 21:23:00

您好,感谢您分享关于使用 STC8H2K12U-SOP16 实现 CDC+HID 复合设备时遇到的问题。您指出 HID 通讯正常,但 CDC 虚拟串口无法接收外来数据,这是一个较为典型的 USB CDC 设备通信异常问题,下面我将从硬件、固件、驱动及协议层面对此问题进行分析,并提供可能的解决方案。

一、问题现象总结
使用 STC8H2K12U-SOP16 实现 CDC+HID 设备;
使用 ISP 下载 CDC+HID 固件;
HID 功能正常,表明 USB 枚举、端点配置、中断传输基本正常;
CDC 串口发送数据正常,说明端点 2 IN 传输无问题;
无法接收外来串口数据,即主机发送的数据无法被芯片接收(端点 3 OUT);
使用 STC8H8K64U-SOP16 时,该问题消失,说明问题可能与芯片型号、硬件资源或固件配置有关。

二、可能的故障原因分析

1. 端点配置错误

CDC 串口的接收功能依赖于端点 3 OUT 的正常工作。如果端点未正确配置为 OUT 方向,或未启用接收中断,将导致无法接收数据。
检查端点 3 是否被正确配置为 OUT 端点;
检查是否启用端点 3 的接收中断;
检查是否在中断处理函数中正确调用了 USBDCDCReceiveFS()(或类似函数)。

2. 端点缓冲区未正确分配

STC8H2K12U 相比 STC8H8K64U,Flash 和 RAM 容量较小,可能在端点缓冲区分配上存在限制。
检查 usbdconf.h 或 usbdcd.h 中对端点缓冲区的定义;
确保端点 3 的 OUT 缓冲区已分配且大小合理;
若缓冲区未分配或地址冲突,可能导致数据接收失败。

3. USB 中断未正确处理

USB 中断是数据接收的关键路径。如果中断未被正确处理,将导致数据包被丢弃。
检查 USBIRQHandler() 是否被正确绑定;
检查是否在中断中调用了 USBDIRQHandler();
检查是否遗漏了对 USBEVTOUT 事件的处理。

4. 芯片内部资源限制

STC8H2K12U 是 12KB Flash、2KB RAM 的芯片,而 STC8H8K64U 则为 64KB Flash、5KB RAM。在实现 CDC+HID 复合设备时,可能资源不足导致部分功能失效。
检查编译后的代码是否超出 Flash 或 RAM 容量;
检查是否有内存溢出或堆栈溢出;
若使用了动态内存分配(如 malloc()),可能因内存不足导致失败。

5. 驱动或主机端问题

虽然可能性较小,但也不能完全排除:
检查主机端是否使用了正确的 CDC 驱动;
检查串口助手是否配置正确(如波特率、数据位、停止位等);
更换不同的串口调试工具(如 XCOM、SSCOM、Tera Term)进行测试。

三、建议的调试步骤

步骤 1:检查端点配置

查看 usbdcdcif.c 或相关配置文件,确认 CDC 使用的端点如下:

c
define CDCDATAOUTEP   0x03// OUT 端点,用于接收主机数据
define CDCDATAINEP    0x02// IN 端点,用于发送数据到主机

确保在初始化时调用了:

c
USBDCDCSetRxBuffer(&hUsbDeviceFS, rxbuffer);
USBDCDCReceiveFS(&hUsbDeviceFS, rxbuffer, CDCDATAFSMAXPACKETSIZE);

步骤 2:检查端点缓冲区分配

在 usbdconf.h 或 usbdcd.h 中确认如下配置:

c
define CDCDATAFSMAXPACKETSIZE64
define CDCDATAOUTPACKETNUM      1

并确保缓冲区地址无冲突,例如:

c
uint8t rxbuffer;

步骤 3:启用端点中断

在 USB 初始化后,确保端点 3 的 OUT 中断被启用:

c
USBDLLOpenEP(&hUsbDeviceFS, CDCDATAOUTEP, USBDEPTYPEBULK, CDCDATAFSMAXPACKETSIZE);

并在中断处理中处理接收事件:

c
if (epnum == CDCDATAOUTEP && epdir == USBDEPDIROUT) {
    USBDCDCReceiveFS(&hUsbDeviceFS, rxbuffer, CDCDATAFSMAXPACKETSIZE);
}

步骤 4:检查资源占用情况

使用编译器查看生成的 .map 文件,确认 Flash 和 RAM 占用情况是否超出芯片容量。
Flash 使用不超过 12KB;
RAM 使用不超过 2KB;

若资源紧张,可尝试:
关闭部分调试输出;
减少缓冲区大小;
简化 CDC 或 HID 的功能实现。

步骤 5:使用逻辑分析仪抓包

使用 USB 逻辑分析仪(如 Beagle USB 12)或 STM32CubeMonitor-USB 等工具,观察主机是否实际发送了数据,以及芯片是否响应了 OUT 令牌包。

四、结论与建议

综上所述,STC8H2K12U 无法接收 CDC 串口数据 的问题,主要可能集中在以下几点:

| 问题类型 | 原因 | 解决方案 |
|----------|------|-----------|
| 端点配置错误 | 端点 3 未启用或方向错误 | 检查端点配置,确保 OUT 端点启用 |
| 缓冲区未分配 | 接收缓冲区未定义或地址冲突 | 检查 rxbuffer 分配与端点绑定 |
| 中断未处理 | 未处理 OUT 事件 | 确保中断处理函数中调用接收函数 |
| 资源不足 | Flash/RAM 不足导致功能异常 | 优化代码、减少缓冲区、关闭冗余功能 |
| 主机端问题 | 驱动或串口工具异常 | 更换调试工具、检查驱动 |

由于在 STC8H8K64U 上工作正常,初步判断为 STC8H2K12U 资源限制或配置冲突 所致。建议优先优化代码资源占用,并确保端点 3 的 OUT 接收流程完整无误。

如需进一步协助,建议提供以下信息:

1. 完整的 usbdcdcif.c 和 usbdconf.h 代码片段;
2. 编译生成的 .map 文件,查看资源占用;
3. 使用逻辑分析仪抓取 USB 通信过程(OUT 数据包是否被正确响应);
4. 是否使用了官方固件库(如 STC USB Device Library)及其版本。

欢迎继续交流,祝您调试顺利!

国芯人工智能 敬上

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-10-1 21:50:43

STC8H2K12U-SOP16和USB转双串口工具一个型号,使用HID+双串口制作试下,也可以对比下原理图。



xxkj2010 发表于 2025-10-1 22:19:28

ercircle 发表于 2025-10-1 21:50
STC8H2K12U-SOP16和USB转双串口工具一个型号,使用HID+双串口制作试下,也可以对比下原理图。



有试过的,无论如何把波特率调低,还是通信超时


ercircle 发表于 2025-10-1 22:49:45

那应该是硬件问题了,看看原理图和硬件
换个线、USB口试试,拿USB转双串口工具重复操作下,确保步骤和通路没问题。

xxkj2010 发表于 2025-10-2 09:32:27

ercircle 发表于 2025-10-1 22:49
那应该是硬件问题了,看看原理图和硬件
换个线、USB口试试,拿USB转双串口工具重复操作下,确保步骤和通路 ...

今天找个时间再弄弄
页: [1]
查看完整版本: (已解决)用STC8H2K12U制作的CDC+HID,其中的串口工作不正常