找回密码
 立即注册
查看: 4503|回复: 17

STC8H8K64U虚拟串口CDC调用USB_SendData函数导致串口丢失问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-05-13 19:00:29

2

主题

12

回帖

156

积分

注册会员

积分
156
发表于 2023-4-9 16:26:16 | 显示全部楼层 |阅读模式
1、程序用于测试官方USB-CDC例程
2、测试芯片为STC8H8K64U
3、经测试发现如下问题
3.1、在main函数中配置USB-CDC后,立刻调用USB_SendData(BYTE *dat, int size)函数
      向上位机发送两条连续数据,上电后上位机能检查到串口但无法打开
3.21、在while(1)循环内无延时调用USB_SendData(BYTE *dat, int size)函数
          向上位机发送连续数据,上电后上位机能检查到串口但无法打开

程序如下
#include "STC8xxxx.H"
#include "stc32_stc8_usb.h"

#define MAIN_Fosc                11059200UL

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //不停电自动 ISP 下载命令

void delay_ms(u8 ms)        //延时0~65535ms
{
     u16 i;
     do{
          i = MAIN_Fosc / 10000;
          while(--i);
     }while(--ms);
}

void main()
{
        P_SW2 |= 0x80;
        P0M1 = 0x00; P0M0 = 0x00;
        P1M1 = 0x00; P1M0 = 0x00;
        P2M1 = 0x00; P2M0 = 0x00;
        P3M1 = 0x00; P3M0 = 0x00;
        P4M1 = 0x00; P4M0 = 0x00;
        P5M1 = 0x00; P5M0 = 0x00;
        P6M1 = 0x00; P6M0 = 0x00;
        P7M1 = 0x00; P7M0 = 0x00;
        P3M0 &= ~0x03; //P3.0/P3.1 和 USB 的 D-/D+共用 PIN 脚,
        P3M1 |= 0x03; //需要将 P3.0/P3.1 设置为高阻输入模式
        IRC48MCR = 0x80; //使能内部 48M 的 USB 专用 IRC
        while (!(IRC48MCR & 0x01));
        USBCLK = 0x00; //设置 USB 时钟源为内部 48M 的 USB 专用 IRC
        USBCON = 0x90; //使能 USB 功能
        usb_init(); //调用 USB CDC 初始化库函数
        IE2 |= 0x80; //使能 USB 中断
        EA = 1;
        while (DeviceState != DEVSTATE_CONFIGURED); //等待 USB 完成配置
       
        WDT_CONTR = D_EN_WDT;                //使能看门狗
        WDT_PS_Set(D_WDT_SCALE_64);                                //看门狗定时器时钟分频系数64
        WDT_CONTR &= ~0x08;                        //IDLE模式停止计数
       
        USB_SendData("test",4);//发送一次,程序正常
//        USB_SendData("test",4);//发送两次,程序卡死
        while(1)
        {
               
        if (bUsbOutReady)
        {
            usb_OUT_done();    //接收应答(固定格式)
            USB_SendData(UsbOutBuffer,OutNumber);  //原路返回, 用于测试
        }
               
                //有延时,程序正常,串口不丢失
                //没有延时,程序卡死,串口丢失
//                delay_ms(10);
//                USB_SendData("test",4);
                WDT_CONTR |= D_CLR_WDT;    // 喂狗
        }
}


USB-CDC_TEST.rar

115.52 KB, 下载次数: 221

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-4-9 17:21:24 | 显示全部楼层
用附件的库文件试试看,如果没问题的话后续更新库文件。

stc_usb_cdc_8h_data.LIB

44.46 KB, 下载次数: 212

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-05-13 19:00:29

2

主题

12

回帖

156

积分

注册会员

积分
156
发表于 2023-4-10 07:55:46 | 显示全部楼层
本帖最后由 热烈的马 于 2023-4-10 08:06 编辑

循环外部连续发送两次,程序正常了,但是在循环内发送间隔太短,如10ms,这时关闭串口,就会直接把usb卡掉,此时电脑提示usb设备异常。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-4-11 10:31:45 | 显示全部楼层
热烈*** 发表于 2023-4-10 07:55
循环外部连续发送两次,程序正常了,但是在循环内发送间隔太短,如10ms,这时关闭串口,就会直接把usb卡掉 ...

能不能提供具体的操作方法或代码?我有试过主循环里不加延时不断发送情况下,反复开关串口,没有遇到卡住的情况。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-05-13 19:00:29

2

主题

12

回帖

156

积分

注册会员

积分
156
发表于 2023-4-12 19:15:26 | 显示全部楼层
本帖最后由 热烈的马 于 2023-4-13 07:25 编辑
乘风*** 发表于 2023-4-11 10:31
能不能提供具体的操作方法或代码?我有试过主循环里不加延时不断发送情况下,反复开关串口,没有遇到卡住 ...

程序就是我发的USB-CDC_TEST.rar的程序,把大循环里面的USB_SendData("test",4);打开重新编译就行了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:244
  • 最近打卡:2025-05-01 15:50:20

49

主题

129

回帖

1361

积分

金牌会员

积分
1361
发表于 2023-4-13 10:53:01 | 显示全部楼层
即使是CDC串口,其实基础还是USB口。USB连接电脑的线非常重要。建议使用带屏蔽的和磁环滤波的USB线。排除USB线的问题再谈软硬件的问题。以前使用RS-232线,只要能连接、不短路就行。现在可不是这样!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-4-13 11:17:17 | 显示全部楼层
楼上过来人,吃过线的亏,用手机配的线可以,或用下图左边的线


STC-USB Link1D /【专业仿真器,全自动在线下载器/自动停电上电,脱机烧录器,USB转双串口工具】
及全套 STC-ISP 下载生态线,高速下载,通信时间几乎忽略

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-05-13 19:00:29

2

主题

12

回帖

156

积分

注册会员

积分
156
发表于 2023-4-13 18:23:56 | 显示全部楼层
确实。模拟串口本质上还是usb,是usb就涉及主机轮询率。让usb工作在全速模式,主机轮询周期可降至125us,此时模拟串口的连续发包周期也随之降低,便可做到几乎无延时上传数据
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-4-13 19:37:17 | 显示全部楼层
1.png

2.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-4-13 19:38:58 | 显示全部楼层
12M bps, 线当然不能乱来,左边这条线是正规的 USB 线


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:22 , Processed in 0.155654 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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