创建驱动CH340的USB HOST 设备
usb转串口芯片如今使用十分广泛,最常用的方式是ch340转串口的从设备与电脑的usb主机进行连接。但我们可能也会遇到另一端不是电脑,而是自己的一台设备usb主机接口的情况。这里以stm32平台+stm32CubeMX工具为例总结介绍一下如何让自己的usb 主机具有和ch340芯片通信的功能。
使用sm32CubeMX配置一个usb cdc类的主机代码
usb有主从机之分,ch340转串口芯片在这里是从机,ch340是转串口芯片,提到串口我们很容易想到usb 里的cdc虚拟串口类,实际上ch340就是一种特殊的虚拟串口 usb cdc,需要对一些厂家自定义的配置进行更改达到识别ch340的效果。
生成部分参考 https://blog.youkuaiyun.com/nyp_1988/article/details/100735858
更改部分根据实践整理及补充大致分为这几步:
设备描述符更改为ch340厂家自定义的0xff并注册类
接口初始化代码修改
波特率配置
此时已经可以与ch340的从设备进行通信,但是只支持默认波特率9600的串口。我们知道usb cdc虚拟串口是没有波特率的概念的,而ch340的另一端是串口,所以接下来要做的就是配置此usb 主机驱动,使得它在初始化时配置成从机串口一样的波特率。
这里最关键的是d8[0],d8[1]这两个变量,就是通过给这两个变量赋值来设置波特率的,通过参考博客题主向ch340官方沟通获取的115200的值3 和 0xcc和他最后的代码
可以推测d8[1]赋值就是对应的波特率的两个值的组合,那么我们怎么得到任意波特率对应的参数呢
这里我参阅了github上一个ch340 linux版驱动代码https://github.com/DecaturMakers/CH340_drivers-Linux-Mac-Windows,找到了这个函数:
经过分析、计算、实践可得921600波特率对应的是d8[2] = 0x0000f307,将115200代入此函数,得a=204,即十六进制0xcc,b=3,也就是对应上文的115200波特率对应配置
通过这个函数可将自己的目标波特率代入band_rade,得出对应的a、b值,在SetLineCoding函数中给d8[]1]赋值时注意是十六进制哦。
参考 https://blog.youkuaiyun.com/nyp_1988/article/details/100735858