- 打卡等级:初来乍到
- 打卡总天数:9
- 最近打卡:2025-04-23 15:28:46
等待验证会员
- 积分
- 223
|
本帖最后由 STC32G12K128 于 2024-5-23 17:03 编辑
最近发现我的CDC转换模块的一个问题,在USB连接线同主机USB口连接状态下机器重新启动,此时主机设备管理器能看到CDC串口,串口助手也能看到但不能工作,
打开关闭串口照旧操作,发送数据时出现串口问题然后进行“修复”。我怀疑是下位我的CDC模块没有反应,需要重新初始化。然后我拔下USB线(CDC模块断电)
再插入,恢复正常。
说明:我的CDC模块采用STC32G12K128,HUGE模式编译。CDC核心代码借鉴于STC32G12K128-LQFP64-DIP64-DEMO-CODE例程包的例程18-CDC协议范例的代码。
代码修改:删除UsbInBusy变量,增加局部变量iCount做while()循环计数器
源代码
void uart_polling()
{
BYTE dat;
BYTE cnt;
if (DeviceState != DEVSTATE_CONFIGURED) //如果USB配置没有完成,就直接退出
return;
if (!UsbInBusy && (TxRptr != TxWptr))
{
EUSB = 0;
UsbInBusy = 1;
usb_write_reg(INDEX, 1);
cnt = 0;
while (TxRptr != TxWptr)
{
usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
cnt++;
if (cnt == EP1IN_SIZE) break;
}
usb_write_reg(INCSR1, INIPRDY);
EUSB = 1;
}
。。。。。。。。。。。。。
修改后代码
void CDC_polling()
{
static BYTE cnt;
static u16 iCount;
if (DeviceState != DEVSTATE_CONFIGURED)
return; if (TxRptr != TxWptr)
{
EUSB = 0;
iCount=4000;
while (usb_read_reg(INCSR1) & INIPRDY)
{
if(--iCount==0)
{
usb_write_reg(INCSR1, INFLUSH);
break; //500uS左右溢出
}
}
if(iCount>0)
{
usb_write_reg(INDEX, 1);
cnt = 0;
while (TxRptr != TxWptr)
{
usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
cnt++;
if (cnt == EP1IN_SIZE) break;
}
usb_write_reg(INCSR1, INIPRDY);
}
EUSB = 1;
}
。。。。。。。。。。
修改后问题解决!
|
|