找回密码
 立即注册
查看: 21|回复: 5

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:663
  • 最近打卡:2025-10-03 08:16:53

125

主题

2073

回帖

6365

积分

论坛元老

积分
6365
发表于 前天 21:20 | 显示全部楼层 |阅读模式
芯片用的是STC8H2K12U-SOP16,用ISP制作CDC+HID,制作步骤如下图:

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



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


004.mp4

411.41 KB, 下载次数: 0

发送正常

005.mp4

267.64 KB, 下载次数: 1

接收异常

回复

使用道具 举报 送花

3

主题

1928

回帖

704

积分

等待验证会员

积分
704
发表于 前天 21:23 | 显示全部楼层
您好,感谢您分享关于使用 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 使用的端点如下:
  1. c
  2. define CDCDATAOUTEP   0x03  // OUT 端点,用于接收主机数据
  3. define CDCDATAINEP    0x02  // IN 端点,用于发送数据到主机
复制代码

确保在初始化时调用了:
  1. c
  2. USBDCDCSetRxBuffer(&hUsbDeviceFS, rxbuffer);
  3. USBDCDCReceiveFS(&hUsbDeviceFS, rxbuffer, CDCDATAFSMAXPACKETSIZE);
复制代码

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

在 usbdconf.h 或 usbdcd.h 中确认如下配置:
  1. c
  2. define CDCDATAFSMAXPACKETSIZE  64
  3. define CDCDATAOUTPACKETNUM      1
复制代码

并确保缓冲区地址无冲突,例如:
  1. c
  2. uint8t rxbuffer[CDCDATAFSMAXPACKETSIZE];
复制代码

步骤 3:启用端点中断

在 USB 初始化后,确保端点 3 的 OUT 中断被启用:
  1. c
  2. USBDLLOpenEP(&hUsbDeviceFS, CDCDATAOUTEP, USBDEPTYPEBULK, CDCDATAFSMAXPACKETSIZE);
复制代码

并在中断处理中处理接收事件:
  1. c
  2. if (epnum == CDCDATAOUTEP && epdir == USBDEPDIROUT) {
  3.     USBDCDCReceiveFS(&hUsbDeviceFS, rxbuffer, CDCDATAFSMAXPACKETSIZE);
  4. }
复制代码

步骤 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)及其版本。

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

国芯人工智能 敬上

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 前天 21:50 | 显示全部楼层
STC8H2K12U-SOP16和USB转双串口工具一个型号,使用HID+双串口制作试下,也可以对比下原理图。

截图202510012150205380.jpg
截图202510012150363440.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:663
  • 最近打卡:2025-10-03 08:16:53

125

主题

2073

回帖

6365

积分

论坛元老

积分
6365
发表于 前天 22:19 | 显示全部楼层
erci*** 发表于 2025-10-1 21:50
STC8H2K12U-SOP16和USB转双串口工具一个型号,使用HID+双串口制作试下,也可以对比下原理图。

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

001.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 前天 22:49 | 显示全部楼层
那应该是硬件问题了,看看原理图和硬件
换个线、USB口试试,拿USB转双串口工具重复操作下,确保步骤和通路没问题。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:663
  • 最近打卡:2025-10-03 08:16:53

125

主题

2073

回帖

6365

积分

论坛元老

积分
6365
发表于 昨天 09:32 | 显示全部楼层
erci*** 发表于 2025-10-1 22:49
那应该是硬件问题了,看看原理图和硬件
换个线、USB口试试,拿USB转双串口工具重复操作下,确保步骤和通路 ...

今天找个时间再弄弄
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-3 08:52 , Processed in 0.121469 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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