- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2024-05-13 19:00:29
注册会员
- 积分
- 156
|
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; // 喂狗
}
}
|
|