STC8H8K64U虚拟串口CDC调用USB_SendData函数导致串口丢失问题
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; // 喂狗
}
}
用附件的库文件试试看,如果没问题的话后续更新库文件。
本帖最后由 热烈的马 于 2023-4-10 08:06 编辑
循环外部连续发送两次,程序正常了,但是在循环内发送间隔太短,如10ms,这时关闭串口,就会直接把usb卡掉,此时电脑提示usb设备异常。 热烈的马 发表于 2023-4-10 07:55
循环外部连续发送两次,程序正常了,但是在循环内发送间隔太短,如10ms,这时关闭串口,就会直接把usb卡掉 ...
能不能提供具体的操作方法或代码?我有试过主循环里不加延时不断发送情况下,反复开关串口,没有遇到卡住的情况。 本帖最后由 热烈的马 于 2023-4-13 07:25 编辑
乘风飞扬 发表于 2023-4-11 10:31
能不能提供具体的操作方法或代码?我有试过主循环里不加延时不断发送情况下,反复开关串口,没有遇到卡住 ...
程序就是我发的USB-CDC_TEST.rar的程序,把大循环里面的USB_SendData("test",4);打开重新编译就行了
即使是CDC串口,其实基础还是USB口。USB连接电脑的线非常重要。建议使用带屏蔽的和磁环滤波的USB线。排除USB线的问题再谈软硬件的问题。以前使用RS-232线,只要能连接、不短路就行。现在可不是这样! 楼上过来人,吃过线的亏,用手机配的线可以,或用下图左边的线
https://www.stcaimcu.com/data/attachment/forum/202212/26/104232kwwx3w3uxwrueuxw.png
STC-USB Link1D /【专业仿真器,全自动在线下载器/自动停电上电,脱机烧录器,USB转双串口工具】
及全套 STC-ISP 下载生态线,高速下载,通信时间几乎忽略
确实。模拟串口本质上还是usb,是usb就涉及主机轮询率。让usb工作在全速模式,主机轮询周期可降至125us,此时模拟串口的连续发包周期也随之降低,便可做到几乎无延时上传数据
12M bps, 线当然不能乱来,左边这条线是正规的 USB 线
https://www.stcaimcu.com/data/attachment/forum/202212/26/104232kwwx3w3uxwrueuxw.png
页:
[1]
2