STM32L USB_HOST模式驱动USB串口芯片
常见的USB转串口芯片有CH34x、FT232、PL2303、CP210x等,提到STM32、USB转串口等关键词时,大部分博文讲诉,STM32作为USB_device从设备,这类代码博主们写的都非常详尽,在此不在追述。但是STM32作为USB_HOST主机,通过USB口连接驱动USB转串口芯片的博文,寥寥数篇。正好本人在25年对接过一个项目,客户设备属于医疗类设备,类似人体阻抗采集设备,属于US
一、需求背景
常见的USB转串口芯片有CH34x、FT232、PL2303、CP210x等,提到STM32、USB转串口等关键词时,大部分博文讲诉,STM32作为USB_device从设备,这类代码博主们写的都非常详尽,在此不在追述。
但是STM32作为USB_HOST主机,通过USB口连接驱动USB转串口芯片的博文,寥寥数篇。正好本人在25年对接过一个项目,客户设备属于医疗类设备,类似人体阻抗采集设备,属于USB从设备,内部通过CP210x芯片转换。原设计是通过电脑USB口,获取数据。为了便携,希望开发一个嵌入式设备,代替PC通过USB读取数据。
二、工具环境
硬件环境
开发板:正点原子的潘多拉STM32L496开发板

USB转串口模块:CH340,FT232RL,CP210x,PL2303

软件环境
KeilMDK、STM32CubeMX
三、开发过程
STM32CubeMX生成模板工程


修改核心代码
将USBH_CDC_ClassRequest(USBH_HandleTypeDef *phost)函数的GetLineCoding修改位SetLineCoding,并修改
下面是几种芯片的配置位115200波特率的参数,其他配置参数请查询芯片手册
/**
本函数由张跃龙添加修改,请遵守GLP开源协议
*/
static USBH_StatusTypeDef SetLineCoding(USBH_HandleTypeDef *phost, CDC_LineCodingTypeDef *linecoding)
{
USBH_StatusTypeDef status;
uint16_t PID = phost->device.DevDesc.idProduct;
uint16_t VID = phost->device.DevDesc.idVendor;
CDC_LineCodingTypeDef configreg;
if (PID == 0X7523U && VID == 0X1A86U)
{
printf("set CH34x config,baud = 115200\n");
phost->Control.setup.b.bmRequestType = 0X40U;
phost->Control.setup.b.bRequest = 0XA1U;
phost->Control.setup.b.wValue.w = 0X000CU;
phost->Control.setup.b.wIndex.w = 0XCC03U;
phost->Control.setup.b.wLength.w = 0;
return USBH_CtlReq(phost, NULL, 0);
}
else if (PID == 0X6001U && VID == 0X0403U)
{
printf("set FT232R config,baud = 115200\n");
phost->Control.setup.b.bmRequestType = 0X40U;
phost->Control.setup.b.bRequest = 0X03U;
phost->Control.setup.b.wValue.w = 0X001AU;
phost->Control.setup.b.wIndex.w = 0U;
phost->Control.setup.b.wLength.w = 0U;
return USBH_CtlReq(phost, NULL, 0);
}
else if (PID == 0XEA60U && VID == 0X10C4U)
{
printf("set CP210x config,baud = 115200\n");
phost->Control.setup.b.bmRequestType = 0X41U;
phost->Control.setup.b.bRequest = 0X1EU;
phost->Control.setup.b.wValue.w = 0U;
phost->Control.setup.b.wIndex.w = 0U;
phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE;
configreg.b.dwDTERate = 115200;
configreg.b.bCharFormat = 0;
configreg.b.bParityType = 0;
configreg.b.bDataBits = 8;
return USBH_CtlReq(phost, configreg.Array, LINE_CODING_STRUCTURE_SIZE);
}
else if (VID == 0X067B && (PID == 0X23A3 || PID == 0X2303))
{
printf("set PL2303GT config,baud = 115200\n");
phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE;
phost->Control.setup.b.bRequest = CDC_SET_LINE_CODING;
phost->Control.setup.b.wValue.w = 0U;
phost->Control.setup.b.wIndex.w = 0U;
phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE;
configreg.b.dwDTERate = 115200;
configreg.b.bCharFormat = 0;
configreg.b.bParityType = 0;
configreg.b.bDataBits = 8;
return USBH_CtlReq(phost, configreg.Array, LINE_CODING_STRUCTURE_SIZE);
}
else
{
printf("set OTHER CHIP config,baud = 115200\n");
phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE;
phost->Control.setup.b.bRequest = CDC_SET_LINE_CODING;
phost->Control.setup.b.wValue.w = 0U;
phost->Control.setup.b.wIndex.w = 0U;
phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE;
configreg.b.dwDTERate = 115200;
configreg.b.bCharFormat = 0;
configreg.b.bParityType = 0;
configreg.b.bDataBits = 8;
return USBH_CtlReq(phost, configreg.Array, LINE_CODING_STRUCTURE_SIZE);
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐





所有评论(0)