一、需求背景

         常见的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);
    }
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐