近日有一个项目需要用MCU的USB驱动CH348,将MCU的USB扩展成8路串口,这个本来不是一件很困难的事,但是对我来说,还是比较难的。第一我没有接触过USB,第二,我在网上搜到的CH348Q资料中没有任何关于CH348寄存器,命令设置或USB协议相关的内容。一开始我一头雾水,心想,这个我肯定搞不定了,不知道该如何下手。然而,我按我的感觉,既然要用USB驱动该芯片,首先我需要知道USB是什么,USB通讯的大致过程,怎么实现USB主机,主机怎么和从机是如何建立通讯的。看了一天后,我觉得USB太复杂了,特别是自己实现USB主机栈。所以就想着使用开源的USB协议栈。于是我就把开源USB协议栈移植到了我的MCU中,经过一顿猛如虎的操作后,我发现CH348与MCU连接成功后,MCU的USB设备连接中断可以正常生产了,此时,说的轻松,实现搞的我头疼,因为我用的是某国产的MCU协议,关于USB的介绍很少,后来知道他使用的是MUSB的IP。一开始找了例程后,USB从机接上去,没有反应,搞的我快没信心了, 后来发现找到SDK有问题,我对着IP资料慢慢核对寄存器,终于搞到了。当能识别到USB从机后,我的信心大增。就开始研究USB的设备连接过程,发现在连接过程中,程序总是会跑飞,哎。。。一波未平,一起又起。于是又要找程序死机的原因,发现开源的usb协议栈中似乎有个bug,导致程序会执行未初始化的指针函数,也不知道是不是我理解的不对,反正改了后可以正常走完连接过程了。当我看到能正常读到CH348的设备描述符后,我开心极了。其实我知道,这也仅仅是一个未接触过USB的人才会有的快感,对于一个玩过 USB的人来说这是个小儿科。完全MCU的枚举后,我开始研究CH348的驱动,此时比较头疼,找了半天也没有找到CH348有关于USB寄存器设置及USB协议的文档。但是我找到CH348的linux下的USB驱动,所以,我就按着linux驱动进行一顿操作猛如虎,一看运行结果二百五,竟然只能发出数据,不能接收数据,设置串口属性也没有效果。尝试了几次后还是不行,于是,我只能通过PC的USB接CH348,然后抓包分析,最后,皇天不负有心人,终于被我调通了,后面我应该就不需要再研究CH348了。如果大家也要这么使用CH348,可以试试同样的方法。