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

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

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    148

    积分

    注册会员

    积分
    148
    发表于 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, 下载次数: 58

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

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

    stc_usb_cdc_8h_data.LIB

    44.46 KB, 下载次数: 52

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    148

    积分

    注册会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

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

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

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    148

    积分

    注册会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-7 20:18
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    35

    主题

    87

    回帖

    759

    积分

    高级会员

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

    使用道具 举报

    该用户从未签到

    552

    主题

    9492

    回帖

    1万

    积分

    管理员

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


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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    148

    积分

    注册会员

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

    使用道具 举报

    该用户从未签到

    552

    主题

    9492

    回帖

    1万

    积分

    管理员

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

    2.png

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9492

    回帖

    1万

    积分

    管理员

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


    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 10:43 , Processed in 0.075013 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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