CH573、CH582、CH592、CH585 USBFS HID增加CDC功能_用于输出LOG调试
USB CDC(Communications Device Class) 是一种让 USB 设备模拟传统串口(COM口)的标准协议,其中 CDC-ACM 子类最常用于虚拟串口通信。它结合了 USB 的高速、即插即用优势与串口的简单易用性,广泛应用于嵌入式调试、数据采集等场景。
在开发WCH蓝牙系列芯片时,难免会遇到需要DEBUG的场景,这时如果未引出串口引脚,或者串口资源紧张(无IO可用)时,可备选该方式进行处理;
在使用了USB外设的应用中,调试阶段可暂时牺牲两个USB接口+两个USB IN端点,增加一组CDC设备描述符即可;
本篇测试程序基于CH585,链接可自取:
通过网盘分享的文件:CH585EXAM_USBFS_CDC+HID.zip
链接: https://pan.baidu.com/s/1gx3jpCDngSnPN48v-k79cQ?pwd=yqr8 提取码: yqr8
一、修改配置描述符:
整个描述符分为 4 大部分:
1、配置描述符:总配置信息
2、IAD 描述符:声明 CDC 复合接口组
3、CDC 接口组(接口 0 + 接口 1):虚拟串口功能
4、HID 接口(接口 2):人机交互设备功能
/* Configuration Descriptor (FS) */
const uint8_t MyCfgDescr[ ] =
{
/* Configure descriptor */
0x09, 0x02, 0x6B, 0x00, 0x03, 0x01, 0x00, 0x80, 0x32,
/* IAD Descriptor(interface 0/1)*/
0x08, 0x0B, 0x00, 0x02, 0x02, 0x02, 0x01, 0x00,
/* Interface 0 (CDC) descriptor */
0x09, 0x04, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00,
/* Functional Descriptors */
0x05, 0x24, 0x00, 0x10, 0x01,
/* Length/management descriptor (data class interface 1) */
0x05, 0x24, 0x01, 0x00, 0x01,
0x04, 0x24, 0x02, 0x02,
0x05, 0x24, 0x06, 0x00, 0x01,
/* Interrupt upload endpoint descriptor */
0x07, 0x05, 0x81, 0x03, (uint8_t)DevEP1SIZE, (uint8_t)( DevEP1SIZE >> 8 ), 0x01,
/* Interface 1 (data interface) descriptor */
0x09, 0x04, 0x01, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x00,
/* Endpoint descriptor */
0x07, 0x05, 0x02, 0x02, (uint8_t)DevEP2SIZE, (uint8_t)( DevEP2SIZE >> 8 ), 0x00,
/* Endpoint descriptor */
0x07, 0x05, 0x82, 0x02, (uint8_t)DevEP2SIZE, (uint8_t)( DevEP2SIZE >> 8 ), 0x00,
/* interface 2 (HID interface) descriptor */
0x09, 0x04, 0x02, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00,
/* interface 2 HID descriptor */
0x09, 0x21, 0x00, 0x01, 0x00, 0x01, 0x22, (uint8_t)sizeof(HIDDescr), (uint8_t )( sizeof(HIDDescr)>>8),
/* interface 2 endpoint descriptor*/
0x07, 0x05, 0x83, 0x03, (uint8_t)DevEP3SIZE, (uint8_t)( DevEP3SIZE >> 8 ), 0x01,
/* interface 2 endpoint descriptor */
0x07, 0x05, 0x03, 0x03, (uint8_t)DevEP3SIZE, (uint8_t)( DevEP3SIZE >> 8 ), 0x01,
};
总结如下图:

二、修改完毕后,枚举即可正常进行,bushound和串口均可以枚举到相应COM,例如下图COM21


三、由于USB FS的从机例程中并没有加入有关CDC设备的枚举处理,需要修改中断处理才可以接受主机的打开请求,可在下图260、264、268行位置增加命令响应,避免进入default判断后回复stall

四、程序修改完毕后,即可成功通过串口工具打开COM,抓包如图

五、定义CDC上报函数
/*********************************************************************
* @fn CDCReport
*
* @brief 上报CDC数据
*
* @return 0:成功
* 1:出错
*/
__HIGH_CODE
void CDCReport(uint8_t* data ,uint8_t len)
{
memcpy(pEP2_IN_DataBuf, data, len);
DevEP2_IN_Deal(len);
}
六、封装USB CDC打印函数
/**
* @brief CDC 发送字符串(日志专用)
* @param str: 要打印的字符串
*/
__HIGH_CODE
void CDC_Log(const char* str) {
if (str == NULL) return;
uint16_t len = strlen(str);
CDCReport((uint8_t*)str,len);
}
#define LOG_BUF_SIZE 256
uint8_t log_buf[LOG_BUF_SIZE];
__HIGH_CODE
void USB_DEBUG(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
vsnprintf((char*)log_buf, LOG_BUF_SIZE, fmt, args);
va_end(args);
CDC_Log((char*)log_buf);
}
七、主循环调用测试

八、测试结果


浙公网安备 33010602011771号